LAT1269
Local Application Tips
LAT1269 Rev 1.0 Feb. 2023
SPI 读取数据的最后一位出错问题
关键字:STM32F42xx SPI, OSPEEDRAPB
1.问题描述
客户在项目开发中使用 STM32F427ZGT6 SPI 连接外部 Flash 时,发现在常温下能正常读写,但是
在高温下一段时间后(大概 5 分钟左右)出现读写异常的情况。读写异常时发生在发送 0x5 指令后,返回数
据通过软件读取的是 0,而硬件抓取的是 1 。同时也发现同一份代码,同样硬件,如果 flash 换成别的厂家
的,在同样温度条件下又没有出现读写异常。
2.问题的排
根据客户的描述,初期怀疑是否是不同 Flash 厂家的兼容性问题,现场进一步测试,发现客户软件在
70环境温度下,除 programerase 时寄存器会读错数据,用只读指令 0x03 也会读错数据(0x55
0xaa 会被软件读成 0x540xab)。
根据这个结果,我们怀疑到 tCLQV 个参数。看上去当前的软件是在 flash 输出数据时,在 CLK 下降
沿时去采集 flash MO 数据的,所以高温引起的细微的 tCLQV 变化可能会导致软件采集出错 我们建议
MCU 在下一个 CLK 的上升沿去采集数据,此时 flash MO 数据已经稳定为 1
现场调整 GPIO(即 flash CLK/SI/SOOSPEEDR 速率后异常现象消失, GPIO 速率调整后 CLK
号斜率变大,tCLQV 跟随变小,软件抓到错误数据的现象消失,这个实验结果也与上述 tCLQV 个怀疑
点相匹配。下面是不同 GPIO 速率下的测试结果。
GPIO_SPEED_FREQ_LOW常温 tCLQV=5.584ns
GPIO_SPEED_FREQ_LOW70℃: tCLQV=6.064ns FAIL
GPIO_SPEED_FREQ_MEDIUM70℃:tCLQV=4.805ns
GPIO_SPEED_FREQ_HIGH70℃:tCLQV=4.577ns
3.原因的进一步分析
进一步了解客户系统的初始化,其中 clock 配置信息如下:采用外部晶振 25MHZplln=360,
pllm=25, pllp=2, pllq=8,系统主频: 25/25*360/2 = 180MHzAPB2: 180/2 = 90MHzSPI 的波特率为
2.8MHzSPI 的引脚设置均为 GPIO_Initure.Speed low
查找到 STM32F42xx 的勘误手册,我们发现有同样问题的描述:
LAT1269
LAT1269 - Rev 1.0 page 2/4
对于文档推荐的 2 workaround 也和我们测试时发现的一样。
至此也是能较好的和客户解释了 MCU 底层的一些原理,并建议客户按照相应 workaound 配置,去
设定 APB 总线与 OSPEEDR 的关系,最终让问题得以解决。