从您的描述来看,问题可能出在 SPI 闪存的写保护机制上。以下是针对 CYW20721B2 的解决方案和排查步骤:
1. 检查并清除写保护寄存器(关键步骤)
CYW20721B2 与 CYW20706 类似,内部寄存器锁定了闪存写入功能。请尝试以下代码:
// 在调用写操作前解除写保护
#define SFLASH_WRITE_UNLOCK_REG (*((volatile uint32_t *)0x00201A14))
void unlock_sflash_write(void) {
SFLASH_WRITE_UNLOCK_REG = 1; // 解锁寄存器
}
// 在写入前调用解锁
unlock_sflash_write();
wiced_hal_sflash_write(address, data_buffer, data_length);
注意:地址 0x00201A14 是 CYW20706 的典型解锁地址,CYW20721B2 可能需要验证或调整此地址。
2. 手动发送写使能命令(WE, 0x06)
WICED SDK 的 sflash_write 可能未正确发送写使能命令:
void sflash_write_enable() {
uint8_t cmd = 0x06; // Write Enable 指令
wiced_hal_pspi_tx_rx_data(&cmd, 1, NULL, 0); // 直接发送到 SPI 总线
}
// 写入前调用
sflash_write_enable();
wiced_hal_sflash_write(...);
3. 验证硬件连接
- WP (Write Protect) 引脚:确认 IS25WP016D 的
WP# 引脚被拉高(接 VCC),否则闪存拒绝写入。
- HOLD 引脚:
HOLD# 引脚也需拉高。
- 使用逻辑分析仪检查:
- 写入前是否有
0x06 (WE) 命令
- 是否有任何错误脉冲或干扰
4. 检查芯片状态寄存器
确保闪存内部未开启写保护:
uint8_t read_status_reg() {
uint8_t cmd = 0x05; // Read Status Register 指令
uint8_t status;
wiced_hal_pspi_tx_rx_data(&cmd, 1, &status, 1);
return status;
}
// 写入前检查状态
if (read_status_reg() & 0x80) { // 检查 SRP0/WPEN 位
// 存在写保护,需解除
}
5. 关键:验证 IS25WP016D 的兼容性
6. 其他可能原因
- Sector Protection:确认目标扇区未通过锁定位保护(使用
0x39 指令解锁)。
- 驱动缺陷:尝试调用底层接口
wiced_hal_pspi_write 直接发送写指令:
uint8_t cmd[4] = {0x02, addr_hi, addr_mid, addr_lo}; // Page Write 指令
wiced_hal_pspi_write(cmd, 4, data_buffer, data_length);
快速验证步骤:
- 使用逻辑分析仪捕获:
- 发送
0x06 后是否返回正确响应
wiced_hal_sflash_write() 后是否发出 0x02 (Page Write) 命令
- 如果仍无命令:
- SDK 版本过旧 → 升级到最新 WICED/BTSDK
- 芯片未正确初始化 → 添加
wiced_hal_sflash_init()
替代方案(推荐):
如果寄存器解锁无效,尝试 Cypress 提供的 SFlash Library:
#include "sflash_interface.h"
sflash_write(handle, address, data, length); // 使用官方底层库
通过以上步骤,应能解决写入问题。重点排查:
0x00201A14 解锁寄存器
- WP 引脚电平
- 手动发送
0x06 命令
- 芯片状态寄存器值
如您有逻辑分析仪截图或寄存器读取结果,可进一步分析。
从您的描述来看,问题可能出在 SPI 闪存的写保护机制上。以下是针对 CYW20721B2 的解决方案和排查步骤:
1. 检查并清除写保护寄存器(关键步骤)
CYW20721B2 与 CYW20706 类似,内部寄存器锁定了闪存写入功能。请尝试以下代码:
// 在调用写操作前解除写保护
#define SFLASH_WRITE_UNLOCK_REG (*((volatile uint32_t *)0x00201A14))
void unlock_sflash_write(void) {
SFLASH_WRITE_UNLOCK_REG = 1; // 解锁寄存器
}
// 在写入前调用解锁
unlock_sflash_write();
wiced_hal_sflash_write(address, data_buffer, data_length);
注意:地址 0x00201A14 是 CYW20706 的典型解锁地址,CYW20721B2 可能需要验证或调整此地址。
2. 手动发送写使能命令(WE, 0x06)
WICED SDK 的 sflash_write 可能未正确发送写使能命令:
void sflash_write_enable() {
uint8_t cmd = 0x06; // Write Enable 指令
wiced_hal_pspi_tx_rx_data(&cmd, 1, NULL, 0); // 直接发送到 SPI 总线
}
// 写入前调用
sflash_write_enable();
wiced_hal_sflash_write(...);
3. 验证硬件连接
- WP (Write Protect) 引脚:确认 IS25WP016D 的
WP# 引脚被拉高(接 VCC),否则闪存拒绝写入。
- HOLD 引脚:
HOLD# 引脚也需拉高。
- 使用逻辑分析仪检查:
- 写入前是否有
0x06 (WE) 命令
- 是否有任何错误脉冲或干扰
4. 检查芯片状态寄存器
确保闪存内部未开启写保护:
uint8_t read_status_reg() {
uint8_t cmd = 0x05; // Read Status Register 指令
uint8_t status;
wiced_hal_pspi_tx_rx_data(&cmd, 1, &status, 1);
return status;
}
// 写入前检查状态
if (read_status_reg() & 0x80) { // 检查 SRP0/WPEN 位
// 存在写保护,需解除
}
5. 关键:验证 IS25WP016D 的兼容性
6. 其他可能原因
- Sector Protection:确认目标扇区未通过锁定位保护(使用
0x39 指令解锁)。
- 驱动缺陷:尝试调用底层接口
wiced_hal_pspi_write 直接发送写指令:
uint8_t cmd[4] = {0x02, addr_hi, addr_mid, addr_lo}; // Page Write 指令
wiced_hal_pspi_write(cmd, 4, data_buffer, data_length);
快速验证步骤:
- 使用逻辑分析仪捕获:
- 发送
0x06 后是否返回正确响应
wiced_hal_sflash_write() 后是否发出 0x02 (Page Write) 命令
- 如果仍无命令:
- SDK 版本过旧 → 升级到最新 WICED/BTSDK
- 芯片未正确初始化 → 添加
wiced_hal_sflash_init()
替代方案(推荐):
如果寄存器解锁无效,尝试 Cypress 提供的 SFlash Library:
#include "sflash_interface.h"
sflash_write(handle, address, data, length); // 使用官方底层库
通过以上步骤,应能解决写入问题。重点排查:
0x00201A14 解锁寄存器
- WP 引脚电平
- 手动发送
0x06 命令
- 芯片状态寄存器值
如您有逻辑分析仪截图或寄存器读取结果,可进一步分析。
举报