STMCU小助手
发布时间:2022-2-11 23:06
|
问题:该问题在不同客户使用不同芯片的 SPI 功能时都曾经提到. 主要现象是 slave 端接收到的数据时有移位现象,例如 0x10 接收成 0x08。此种移位一旦发生,当前通讯的后续数据也都发生了移位。 调研: 重复进行接收数据试验,发现并非所有情况下数据接收都有问题,但是某次通讯中有某个字节发生移位,则后续字节均会发生移位现象。只有将当次通讯中断,重新进行新的通讯。 经过查看波形,发现数据线上的波形是正确的。再仔细查看,发现时钟和数据不匹配,即按照时钟来读数据,接收的数据是正确的——然而并非是 master 端发送的数据。 由于 SPI 属于同步接口,通讯的时钟完全由 master 端提供。因此,一旦通讯开始,slave 端是无法区分时钟线上的沿变化是否是一个有效时钟。这样当这个沿变化满足 SPI 电气特性的要求的时候,就被当成一个有效时钟从而同样可以接收数据。此时,由于 master 端和 slave 端的各自认为的时钟实际上已经有差别,自然 slave 端接收的数据也就无法保证正确了。 常见的一个不同步的例子是当 master 端开始发送数据时,slave 端还未完成初始化。于是,slave 端事实上是从数据的中间开始接收的,这样也就导致后续数据同样出错。 结论: 通过以上的分析可以得知,该问题是由于 SPI 通讯中 master 端和 slave 端不同步造成的,而不是器件 本身问题。 处理: 重新考虑程序设计,确保 master 端和 slave 端保持时钟的同步性; 同时,考虑到通讯过程中可能出现的干扰,在应用层对接收的数据进行校验。常见的处理方法有 CRC校验,checksum 校验;或者多次发送数据在接收端进行判决。 一旦在通讯中发现数据出错, 则中断当前通讯重新进行通讯。 |
【福利三:逢7发帖赢大礼】4、基于STM32G070板子SPI flash 移植SFUD库
【福利三:逢7发帖赢大礼】基于STM32G070板子的uart shell移植设计
【福利三:逢7发帖赢大礼】3、基于STM32G070板子的YModem串口协议通信
【福利三:逢7发帖赢大礼】2、基于STM32G070板子的OLED移植U8G2库
实战经验 | ClassB功能安全认证代码与应用代码分区的实现要点
STM32G0 系列 I2C 通信异常典型案例分析与解决方案总结
经验分享 | LAT1490 两个STM32G0 I2C 通信异常的案例分析
经验分享 | STM32G0 I2C bootloader Go 命令后调试连接失败:DBG_SWEN 位复位修复
经验分享 | STM32G0B1 待机模式意外唤醒深度解析:RTC 结构体未初始化的隐形坑
经验分享 | STM32G0B1 待机模式意外唤醒深度解析:RTC 结构体未初始化的隐形坑
微信公众号
手机版