蓝牙技术
直播中

梅利号

9年用户 1563经验值
擅长:可编程逻辑
私信 关注
[问答]

wiced_hal_sflash_write在CYW20721B2上不起作用是怎么回事?

我将 SPI 闪存 IS25WP016D 连接到 CYW20721。 使用 wiced_hal_sflash_read 读取有效。 当尝试使用 wiced_hal_sflash_write 进行写入时,写入不起作用。 逻辑分析仪上没有保存命令。 我记得在 CYW20706 中必须通过 *((unsigned char*)(0x00201a14)) = 1 解锁写入能力;

回帖(1)

yuhonglong

2025-7-3 18:18:51

从您的描述来看,问题可能出在 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 的兼容性



  • VCC 范围:CYW20721B2 IO 电压为 1.8V/3.3V,需与 IS25WP016D 电压一致。

  • SFDP 检查:Cypress SDK 可能不支持您的闪存型号:
     wiced_hal_sflash_get_size(&flash_size); // 获取识别到的容量
    if (flash_size != 0x200000) { // IS25WP016D 是 16Mb = 2MB
         // 容量不匹配,需手动初始化驱动
    }


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);


快速验证步骤:



  1. 使用逻辑分析仪捕获:

    • 发送 0x06 后是否返回正确响应

    • wiced_hal_sflash_write() 后是否发出 0x02 (Page Write) 命令


  2. 如果仍无命令:

    • SDK 版本过旧 → 升级到最新 WICED/BTSDK

    • 芯片未正确初始化 → 添加 wiced_hal_sflash_init()



替代方案(推荐):


如果寄存器解锁无效,尝试 Cypress 提供的 SFlash Library


#include "sflash_interface.h"
sflash_write(handle, address, data, length); // 使用官方底层库

通过以上步骤,应能解决写入问题。重点排查:



  1. 0x00201A14 解锁寄存器

  2. WP 引脚电平

  3. 手动发送 0x06 命令

  4. 芯片状态寄存器值


如您有逻辑分析仪截图或寄存器读取结果,可进一步分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分