陈家乐 发表于 2025-9-28 23:59:17

【求助帖】串行FLASH整片擦除时执行到一半就停了

如图,为什么我的FLASH整片擦除到12%就停了,前面的读取ID和读取状态寄存器都没问题


更新
最后原因是,必须得是这样写才行,不能用标志位去判断CDC接收到数据,必须得用bOutReady



国芯人工智能 发表于 2025-9-29 00:03:00

您好,关于您在使用串行FLASH进行整片擦除操作时,擦除进度停留在12%就停止的问题,结合您的描述(读取ID和状态寄存器正常),我们可以从以下几个方面进行分析和排查:

一、确认擦除命令是否正确发送

串行FLASH整片擦除通常使用Chip Erase(0x60或0xC7)命令。请确认:

1. 命令格式是否正确:是否按照数据手册要求,先发送写使能命令(Write Enable,0x06),再发送Chip Erase命令。
2. 命令发送时机是否正确:在发送Chip Erase之前,是否确认FLASH处于空闲状态(即状态寄存器的BUSY位为0)。
3. 是否启用了写使能锁存(WEL):多数FLASH在执行写或擦除前必须先发送Write Enable命令,否则会忽略擦除命令。

二、检查状态寄存器反馈

您提到读取状态寄存器没有问题,建议进一步确认以下内容:

1. 读取状态寄存器是否包含BUSY位:在擦除过程中,状态寄存器的BUSY位应为1。如果在擦除过程中读取到BUSY位为0,说明擦除操作可能被提前终止。
2. WEL位是否被正确置位:在发送Write Enable命令后,状态寄存器的WEL位应为1,否则擦除操作将被忽略。
3. 是否有错误标志位被置位:如EPE(Erase/Program Error)等,表示擦除过程中发生了错误。

三、擦除超时或中断

擦除操作通常需要较长时间(例如几十毫秒到几百毫秒不等),若主机在等待过程中判断超时或中途执行了其他操作(如复位、重启SPI通信、中断处理等),可能导致擦除过程被中断。

建议:
在擦除后持续轮询状态寄存器,直到BUSY位变为0。
增加合理的超时机制,避免死循环。
检查是否有中断服务程序干扰了SPI通信。

四、电源电压是否稳定

FLASH擦除操作对电源电压较为敏感,尤其是在大容量擦除时,瞬时电流较大。如果供电电压不稳定或低于FLASH的最低工作电压(通常为2.3V或2.7V),可能导致擦除失败。

建议:
使用万用表或示波器测量FLASH的VCC引脚电压。
检查电源滤波电容是否良好,是否有较大的电压波动。
如果使用电池供电,注意电池电量是否充足。

五、硬件连接问题

1. SPI通信是否稳定:检查SPI的SCLK、MOSI、CS等信号是否稳定,是否存在噪声或信号完整性问题。
2. CS(片选)信号是否被提前拉高:在擦除命令发送后,若CS信号提前拉高,可能导致命令未被完整接收。
3. FLASH芯片是否损坏:虽然读取ID正常,但部分区域损坏也可能导致擦除失败。可尝试更换FLASH芯片测试。

六、FLASH芯片型号与操作手册是否一致

不同厂商、不同型号的FLASH芯片,其擦除命令、擦除时间、状态寄存器定义可能不同。请确认:
您所使用的擦除命令是否适用于该型号FLASH。
是否存在特定的使能序列或解锁步骤(如需发送特定地址或序列才能执行整片擦除)。
是否存在保护机制(如写保护、扇区保护)未被解除。

七、建议的排查步骤总结

1. 确认擦除命令流程是否正确:
发送Write Enable(0x06)
发送Chip Erase(0x60或0xC7)
轮询状态寄存器,等待BUSY位为0

2. 检查状态寄存器反馈:
WEL是否为1
BUSY是否为1(擦除过程中)
是否有EPE或其他错误标志

3. 延长等待时间或增加超时机制

4. 测量电源电压和SPI信号质量

5. 尝试更换FLASH芯片进行测试

八、示例代码片段(伪代码)

c
void flashchiperase(void) {
    flashwriteenable();      // 发送0x06命令
    spisendcommand(0x60);      // 或0xC7,根据芯片手册
    while(flashisbusy());      // 轮询状态寄存器,直到BUSY=0
}

uint8t flashisbusy(void) {
    uint8t status;
    spireadstatusregister(&status);
    return (status & 0x01);      // BUSY位为1表示正在操作
}

结语

综上所述,擦除操作在12%处停止,很可能是由于命令未正确发送、擦除过程中断、电源不稳定或状态轮询不完整等原因导致。建议您按照上述排查步骤逐一验证,特别是检查擦除流程和状态寄存器反馈。

如能提供FLASH型号、使用的MCU型号以及部分代码或波形截图,将有助于更精确地定位问题。

祝您调试顺利!

[本文内容由国芯人工智能辅助生成,仅供参考]

yao眼的光 发表于 2025-9-29 08:34:04

已转发工程师,请耐心等待哦

乘风飞扬 发表于 2025-9-29 09:13:26

确保接线稳定可靠,避免受干扰,也要避免连接线太长导致信号衰减。
台式机接机箱背后的USB接口,尽量不要使用延长线。

DebugLab 发表于 2025-9-29 09:28:46

多次试验能否稳定复现?

陈家乐 发表于 2025-9-29 09:42:04

yao眼的光 发表于 2025-9-29 06:34
已转发工程师,请耐心等待哦

梁工,救救我{:weiqu:}

陈家乐 发表于 2025-9-29 09:42:26

yao眼的光 发表于 2025-9-29 06:34
已转发工程师,请耐心等待哦

跟着论坛示例代码写的,写崩了

陈家乐 发表于 2025-9-29 09:46:34

国芯人工智能 发表于 2025-9-28 22:03
您好,关于您在使用串行FLASH进行整片擦除操作时,擦除进度停留在12%就停止的问题,结合您的描述(读取ID和 ...

不行啊,你要是在擦除整片FLASH的代码加上,while(busy());会卡死的

陈家乐 发表于 2025-9-29 10:09:09

乘风飞扬 发表于 2025-9-29 07:13
确保接线稳定可靠,避免受干扰,也要避免连接线太长导致信号衰减。
台式机接机箱背后的USB接口,尽量不要使 ...

我用例程试了,可以擦除,但是我的就不行,我写的不用串行FLASH工具时,能够稳定运行

陈家乐 发表于 2025-9-29 10:09:27

DebugLab 发表于 2025-9-29 07:28
多次试验能否稳定复现?

不行的
页: [1] 2
查看完整版本: 【求助帖】串行FLASH整片擦除时执行到一半就停了