一、现象:
在60摄氏度以上,存在一定概率读取spiFlash失败。
二、记录一下该问题的大致分析解决过程:
在周期写flash数据时(先擦除后写入)需要先读取当前状态是否就绪,未就绪需要延时。常温下擦除flash需要十几ms的延时时间,而高温下没有看到延时。(注:是否需要继续延时是根据读取的flash状态来决定的,当读取到第一个bit为1时delay 1ms继续等待,直到读取到0)
擦除和写入flash数据需要检查flash状态是否就绪,但是读flash数据不需要检查。为了确定是否“等待就绪”导致的问题,做了如下实验:先在常温下未出现问题时擦除掉所有数据,然后再写入一条数据,此时读写都是正常的。然后放入温箱中等待问题的复现,此时再仅读取数据。结果发现读取数据也是异常的。此实验说明问题与“等待就绪”无关。
参考其他例程的 SPI 配置,看是否是配置不当引起的问题。测试修改SPI 的clk和data引脚GPIO speed,发现高温下问题没有出现。目前项目中GPIO speed 配置的是“LOW”,如果配置成MEDLIUM以上(包括medium)都可以解决问题。
目前只知道修改GPIO speed能解决问题,但是为什么能解决问题还没有弄清楚。最后,联系ST原厂支持,给出了解释,这是ST F4系列芯片上一个SPI 相关的bug:SPI挂在APB总线上,APB总线的频率与CLK 引脚的GPIOspeed有一个约束关系,如果配置的不匹配则可能出现MCU芯片内部的时钟不同步问题。具体解释附下:
项目中配置的APB总线时钟正好是90M,所以SPI 的CLK引脚的GPIO speed至少要配置为HIGH。
三、修改
四、验证
高温环境中,设备连续运行24小时,未再出现读写spiFlash失败现象。