SPI读取数据的最后一位出错问题

文章讨论了在STM32F427ZGT6上使用SPI连接外部Flash时遇到的高温读写异常问题。经过排查,发现问题可能由tCLQV参数对时序的影响引起。通过调整GPIO速度和遵循STM32F42xx的官方建议,解决了此问题。
摘要由CSDN通过智能技术生成

1、问题描述

客户在项目开发中使用 STM32F427ZGT6 的 SPI 连接外部 Flash 时,发现在常温下能正常读写,但是在高温下一段时间后(大概 5 分钟左右)出现读写异常的情况。读写异常时发生在发送 0x5 指令后,返回数据通过软件读取的是 0,而硬件抓取的是 1 。同时也发现同一份代码,同样硬件,如果 flash 换成别的厂家的,在同样温度条件下又没有出现读写异常。

2、问题排查

根据客户的描述,初期怀疑是否是不同 Flash 厂家的兼容性问题,现场进一步测试,发现客户软件在70℃环境温度下,除了 program、erase 时寄存器会读错数据,用只读指令 0x03 也会读错数据(0x55、0xaa 会被软件读成 0x54、0xab)。

根据这个结果,我们怀疑到 tCLQV 这个参数。看上去当前的软件是在 flash 输出数据时,在CLK 下降沿时去采集 flash MO 数据的,所以高温引起的细微的 tCLQV 变化可能会导致软件采集出错。 我们建议MCU 在下一个 CLK 的上升沿去采集数据,此时 flash MO 数据已经稳定为 1。
在这里插入图片描述
现场调整 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

3、问题原因的进一步分析

进一步了解客户系统的初始化,其中 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 的勘误手册,我们发现有同样问题的描述:
在这里插入图片描述
在这里插入图片描述
对于文档推荐的 2 种 workaround 也和我们测试时发现的一样。
在这里插入图片描述
在这里插入图片描述
至此也是能较好的和客户解释了 MCU 底层的一些原理,并建议客户按照相应 workaound 的配置,去设定 APB 总线与 OSPEEDR 的关系,最终让问题得以解决。

本文档参考ST官方的《【应用笔记】LAT1269+SPI读取数据的最后一位出错问题》文档。
下载地址:https://download.csdn.net/download/u014319604/88969389

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值