1.问题描述 客户在项目开发中使用 STM32F427ZGT6 的 SPI 连接外部 Flash 时,发现在常温下能正常读写,但是在高温下一段时间后(大概 5 分钟左右)出现读写异常的情况。读写异常时发生在发送 0x5 指令后,返回数据通过软件读取的是 0,而硬件抓取的是 1 。同时也发现同一份代码,同样硬件,如果 flash 换成别的厂家的,在同样温度条件下又没有出现读写异常。 2.问题的排查 # |* G' E. L( Q' g1 x$ p& D+ `7 } 根据客户的描述,初期怀疑是否是不同 Flash 厂家的兼容性问题,现场进一步测试,发现客户软件在70℃环境温度下,除了 program、erase 时寄存器会读错数据,用只读指令 0x03 也会读错数据(0x55、0xaa 会被软件读成 0x54、0xab)。 & w; N/ c% h; b9 } 根据这个结果,我们怀疑到 tCLQV 这个参数。看上去当前的软件是在 flash 输出数据时,在 CLK 下降沿时去采集 flash MO 数据的,所以高温引起的细微的 tCLQV 变化可能会导致软件采集出错。 我们建议MCU 在下一个 CLK 的上升沿去采集数据,此时 flash MO 数据已经稳定为 1。 . F( q, Q* M* S6 L! s4 B8 ] + X8 `, i1 d" m) {& v- a 现场调整 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。: i0 I7 K9 L5 o: H+ q# x GPIO_SPEED_FREQ_MEDIUM,70℃:tCLQV=4.805ns。1 [0 E3 B8 u+ w5 C0 j+ K0 D+ A GPIO_SPEED_FREQ_HIGH,70℃:tCLQV=4.577ns & e4 B$ V W6 S$ Y8 ]" U2 Y6 G 3.原因的进一步分析 / |4 Z$ w0 {" S 进一步了解客户系统的初始化,其中 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 q2 s6 _% L) O ' O+ k4 E, b$ N3 e( j ( U+ I( O, I2 Z4 e W- R2 _ 7 l2 N7 o& n; t! J& D 对于文档推荐的 2 种 workaround 也和我们测试时发现的一样。 1 P" T- c. n" l X . a( d0 D& ]9 B 至此也是能较好的和客户解释了 MCU 底层的一些原理,并建议客户按照相应 workaound 的配置,去设定 APB 总线与 OSPEEDR 的关系,最终让问题得以解决。% h( U! [# t1 U8 u& J3 p. ^; i7 u % H0 Q) T6 G. Z! `1 |& ?; A * v# i+ \3 X1 r; P3 D 完整版请查看:附件 |
【STM32C0评测】4、驱动Lorasx126x,实现透传
基于STM32的SPI传输时会丢失数据吗?
基于STM32基础的SPI总线概述
基于STM32的SPI读取数据的最后位出错问题经验分享
基于STM32关闭SPI会导致WRPERR错误的问题分析
基于STM32关闭SPI导致WRPERR错误经验分享
基于STM32CubeMX的SPI总线经验分享
如何实现基于STM32 SPI+DMAWS2812灯的驱动
基于STM32F030硬件SPI经验分享
基于STM32的经验分享—SPI详解