打印
[应用相关]

【分享】SPI 接收数据移位分析一例

[复制链接]
2172|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
湛湛yani|  楼主 | 2015-12-22 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题:
该问题在不同客户使用不同芯片的 SPI 功能时都曾经提到.
主要现象是 slave 端接收到的数据时有移位现象, 例如 0x10 接收成 0x08。 此种移位一旦发生, 当前通
讯的后续数据也都发生了移位。
调研:
重复进行接收数据试验, 发现并非所有情况下数据接收都有问题, 但是某次通讯中有某个字节发生移
位, 则后续字节均会发生移位现象。 只有将当次通讯中断, 重新进行新的通讯。
经过查看波形, 发现数据线上的波形是正确的。 再仔细查看, 发现时钟和数据不匹配, 即按照时钟来
读数据, 接收的数据是正确的——然而并非是 master 端发送的数据。
由于 SPI 属于同步接口, 通讯的时钟完全由 master 端提供。 因此, 一旦通讯开始, slave 端是无法区
分时钟线上的沿变化是否是一个有效时钟。 这样当这个沿变化满足 SPI 电气特性的要求的时候, 就被
当成一个有效时钟从而同样可以接收数据。 此时, 由于 master 端和 slave 端的各自认为的时钟实际上
已经有差别, 自然 slave 端接收的数据也就无法保证正确了。
常见的一个不同步的例子是当 master 端开始发送数据时, slave 端还未完成初始化。 于是, slave 端事
实上是从数据的中间开始接收的, 这样也就导致后续数据同样出错。
结论:
通过以上的分析可以得知,该问题是由于 SPI 通讯中 master 端和 slave 端不同步造成的, 而不是器件
本身问题。
处理:
重新考虑程序设计, 确保 master 端和 slave 端保持时钟的同步性;
同时, 考虑到通讯过程中可能出现的干扰, 在应用层对接收的数据进行校验。 常见的处理方法有 CRC
校验, checksum 校验; 或者多次发送数据在接收端进行判决。
一旦在通讯中发现数据出错, 则中断当前通讯重新进行通讯。

沙发
稳稳の幸福| | 2015-12-22 19:27 | 只看该作者
这种方法很是不错啊,写的也是中规中矩的,楼主的功力深厚啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

10

帖子

0

粉丝