USB论坛
直播中

杨帆

8年用户 1472经验值
私信 关注
[问答]

CYUSB3014通过SPI接口固化img到M25P40,重启失败怎么解决?

CYUSB3014通过SPI接口固化img到M25P40,重启失败.
启动模式PMODE=0F1.
下载完img后,显示下载成功,但是重启 ,程序没有运行,还是显示bootloader

回帖(1)

王飞云

2025-6-13 17:02:40

针对CYUSB3014通过SPI固化img到M25P40后重启失败、仍停留在Bootloader的问题,结合PMODE=0F1的设置,以下是系统的排查和解决步骤:




核心原因分析


PMODE=0F1 的含义是:尝试从SPI NOR Flash启动固件(最后一个有效固件镜像)。失败原因通常如下:



  1. 固件未正确写入SPI Flash

  2. SPI连接不稳定/信号完整性问题

  3. 固件镜像格式/偏移地址错误

  4. Bootloader校验失败(签名、CRC等)

  5. 硬件问题(电源/复位/时序)




详细解决步骤


1. 确认固件镜像写入正确性




  • 读取Flash内容对比

    使用CyControlSPI Flash编程器重新读取M25P40的内容,与原始.img文件进行二进制比较(fc命令或Beyond Compare)。

    ⚠️ 常见问题:写操作成功但实际存在坏块或页写入边界错误。




  • 检查起始偏移地址

    CYUSB3014 Bootloader默认从SPI Flash偏移地址0x0查找固件头部。确认编程时起始地址设置为0

    ? 使用指令:fx3_program_spi_image.exe -i firmware.img -d 0-d后接设备ID,通常为0)




2. 验证固件镜像格式




  • 确保IMG格式兼容

    Bootloader要求固件为FX3 Bootloader格式(含头部签名、长度、CRC等信息)。

    ? 方法:使用Cypress工具重新生成镜像:  


    elftool.exe -b  



  • 检查镜像头部签名

    用二进制编辑器查看.img文件前32字节,应包含:


    0x00: Cypress签名 (e.g., "CY" 或特定魔数)
    0x1C: 固件长度 (Little-Endian)
    0x20: CRC32校验值

    ? 典型错误:使用纯二进制.bin文件而非转换后的.img文件。




3. SPI信号质量排查




  • 测量关键信号波形

    用示波器捕获SCLK、MOSI、CS、MISO波形,重点检查:



    • CS下降沿/上升沿是否干净

    • SCLK频率是否超限(M25P40最大33MHz)

    • 数据线有无振铃、过冲




  • 降低SPI时钟频率

    在编程时尝试降低时钟速率(例如改用1-5 MHz)写入:


    fx3_program_spi_image.exe -i firmware.img -s 1000000  # 设时钟为1MHz



  • 硬件修改建议



    • 增加22Ω串联电阻匹配阻抗

    • 若走线>5cm,在SCLK上加10pF电容滤波

    • 检查M25P40的/HOLD和/WP引脚是否被正确上拉(通常接10kΩ上拉到VCC)




4. Bootloader启动日志分析



  • 启用Bootloader调试输出

    通过UART(P12: TX, P11: RX)连接串口终端(波特率115200),观察启动日志:  
    [Boot] Starting SPI boot...
    [SPI] Detected Flash ID: XX XX XX
    [SPI] Checking image at 0x00000000...
    [ERR] Invalid signature! (Expected 0x4359, Got 0xFFFF)

    ? 日志会明确提示签名错误、CRC失败或找不到Flash等问题。



5. 电源与复位时序检查




  • 测量电源纹波

    确保DVDDIO(Flash供电)稳定在3.3V±5%,纹波<50mV。使用示波器捕获VCC上电波形,确认无缓慢爬升现象。




  • 复位信号稳定性

    RESET_N引脚应在供电稳定后保持>100ms低电平,然后拉高。使用逻辑分析仪确认复位时序符合下图:


    Power --------/¯¯¯¯¯¯¯¯| Device Active
    RESET_N ______/--------| (Min 100ms)



6. 尝试工厂编程模式


若以上步骤无效,进入"强制SPI启动"模式:



  1. 设置PMODE=000(所有引脚接地)

  2. 上电时Bootloader始终从SPI启动

  3. 再切回PMODE=0F1测试

    ? 此操作可绕过可能的启动顺序错误。




终极解决方案流程图


graph TD
A[固件重启失败] --> B[读取Flash内容对比]
B -->|不一致| C[降低SPI时钟重编程]
B -->|一致| D[检查.img文件头部]
D -->|签名错误| E[用elftool重生成镜像]
D -->|CRC错误| F[检查链接脚本地址]
F -->|地址错误| G[修正.ld文件偏移为0]
A --> H[测量SPI信号波形]
H -->|信号畸变| I[优化PCB走线 + 串联电阻]
H -->|信号正常| J[查电源/复位时序]
J -->|电源不稳| K[增加滤波电容]
K -->|复位异常| L[延长复位低电平时间]
L --> M[进入工厂模式 PMODE=000]
M -->|成功启动| N[切回PMODE=0F1]



关键注意事项



  1. M25P40擦除要求

    写入前必须全片擦除flashprog.exe -e 或使用SPI Erase指令。

  2. 固件入口点

    cyfxtx.c中检查CyU3PFirmwareEntry()函数实现是否完整。

  3. 避免看门狗复位

    在启动代码早期禁用看门狗:CyU3PWatchdogDisable();

  4. 固件大小验证

    M25P40容量512KB,编译后固件不应超过512KB - 1KB头(实际≤503KB)


通过以上系统性排查,可解决99%的SPI启动失败问题。建议优先捕获SPI启动日志对比Flash数据,这两步即可定位80%的问题根源。

举报

更多回帖

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