
1.问题描述 客户在项目开发中使用 STM32F427ZGT6 的 SPI 连接外部 Flash 时,发现在常温下能正常读写,但是在高温下一段时间后(大概 5 分钟左右)出现读写异常的情况。读写异常时发生在发送 0x5 指令后,返回数据通过软件读取的是 0,而硬件抓取的是 1 。同时也发现同一份代码,同样硬件,如果 flash 换成别的厂家的,在同样温度条件下又没有出现读写异常。 1 }( _ D9 g; N h8 @0 i 2.问题的排查 根据客户的描述,初期怀疑是否是不同 Flash 厂家的兼容性问题,现场进一步测试,发现客户软件在70℃环境温度下,除了 program、erase 时寄存器会读错数据,用只读指令 0x03 也会读错数据(0x55、0xaa 会被软件读成 0x54、0xab)。 根据这个结果,我们怀疑到 tCLQV 这个参数。看上去当前的软件是在 flash 输出数据时,在 CLK 下降沿时去采集 flash MO 数据的,所以高温引起的细微的 tCLQV 变化可能会导致软件采集出错。 我们建议MCU 在下一个 CLK 的上升沿去采集数据,此时 flash MO 数据已经稳定为 1。 " l6 d0 F# w/ U1 a$ ?) w " j, x, E% ?; _: b 4 b/ ?0 k) f+ N! g$ n ![]() 现场调整 GPIO(即 flash CLK/SI/SO)OSPEEDR 速率后异常现象消失, GPIO 速率调整后 CLK 信号斜率变大,tCLQV 跟随变小,软件抓到错误数据的现象消失,这个实验结果也与上述 tCLQV 这个怀疑点相匹配。下面是不同 GPIO 速率下的测试结果。 GPIO_SPEED_FREQ_LOW,常温: tCLQV=5.584ns。 GPIO_SPEED_FREQ_LOW,70℃: tCLQV=6.064ns, FAIL。 GPIO_SPEED_FREQ_MEDIUM,70℃:tCLQV=4.805ns。 GPIO_SPEED_FREQ_HIGH,70℃:tCLQV=4.577ns$ v$ @8 w) b% x, _1 n 3.原因的进一步分析 ( m2 I0 s, q2 A2 u 进一步了解客户系统的初始化,其中 clock 配置信息如下:采用外部晶振为 25MHZ,plln=360, pllm=25, pllp=2, pllq=8,系统主频: 25/25*360/2 = 180MHz,APB2: 180/2 = 90MHz,SPI 的波特率为2.8MHz。SPI 的引脚设置均为 GPIO_Initure.Speed 为 low。 查找到 STM32F42xx 的勘误手册,我们发现有同样问题的描述: 9 q7 i& M s& U# v ( n7 \ L j$ z5 P4 | ![]() - O* c# }) K' h+ [ k, e& U5 { 对于文档推荐的 2 种 workaround 也和我们测试时发现的一样。 " t$ r0 x: O M8 r9 n m% m4 T/ d4 ]3 g$ U- b8 r ![]() 4 ~0 K h- K f5 S* d. Y: |! x& }: t ; T: G) F7 Y% m4 K" F$ ~- R) | 至此也是能较好的和客户解释了 MCU 底层的一些原理,并建议客户按照相应 workaound 的配置,去设定 APB 总线与 OSPEEDR 的关系,最终让问题得以解决。 - u" b6 C0 t1 q2 w2 O- @" K5 z * ]: P# u/ Z8 ^4 q7 |, _ 完整版请查看:附件 ![]() |
使用Nano板验证驱动SPI串口屏的颜色显示
【经验分享】STM32的SPI的原理与使用(W25Q128附代码)
【STM32C0评测】4、驱动Lorasx126x,实现透传
基于STM32的SPI传输时会丢失数据吗?
基于STM32基础的SPI总线概述
基于STM32的SPI读取数据的最后位出错问题经验分享
基于STM32关闭SPI会导致WRPERR错误的问题分析
基于STM32关闭SPI导致WRPERR错误经验分享
基于STM32CubeMX的SPI总线经验分享
如何实现基于STM32 SPI+DMAWS2812灯的驱动