SPI传输出错引起的思考

SPI是一种常见的串行通信协议,在MCU中也有广泛应用,最近项目中我们发现SPI在传输过程中偶尔会出现数据错误,下面就对这个问题的原因以及有效的解决方法做一个简单的记录。

问题描述

问题出现在两个SPI互联的时候,当两个SPI同时开启high drive的时候,slave端向master端发数据的时候出现错误,分析过程中我们抓取了如下的波形:

tek00017.png

实际发出是数据应该是0xAAAA,从上面波形中可以看出中间实际上是多了一个0电平,MCU实际收到的数据也是变成了0xAA55。看起来像是MCU出来的数据有问题,难不成外部的信号可以干扰到内部的IP?

另外一个有意思的现象是当加个逻辑分析仪什么的,整个传输就没什么问题,这个之前也多次出问题了,之前的解决方法是在传输因脚上面串联电阻,不过一直没有深究其中的原因。

问题分析

实际上串联电阻正常工作就可以说明是干扰的原因,所以我们着重来看一下为什么会有这个干扰。

首先我们从结果上来看,Slave端数据看起来是发错了,但是要注意的是在SPI传输的时候,slave实际上不自己输出时钟,而是会按照从master端发过来的时钟不断输出数据,那么我们应该就可以断定实际上是slave接收到的时钟出现了问题,从波形上来看应该是多接收一个时钟,两个0中间应该是有一个1的。

中间多了一个时钟,应该是振铃效应的影响,也就是因为驱动太强,信号在接收端产生了反射,反射信号又被slave接受,从而出现了问题。

深入分析

其实这个应该说是SI的问题,也就是错误的选择了high drive的原因,high drive产生的高压摆率造成了比较强的信号反射,也就是说我们这种情况不应该使用high drive。

所谓了high drive,也就是强驱动实际上是提高引脚输出能力的的一种技术,通过high drive,单片机引脚可以直接驱动LED,甚至继电器,在SPI中,当有多个外设的时候我们为了获取比较高的数据传输速率也可以选择high drive,而在我们遇到的这个问题中,SPI是一对一,并且是单板同芯片传输,并不需要特别强的驱动能力,所以需要采用比较低的压摆率,这样可以有效的降低噪声,同时对于噪声也没有那么敏感。

最终通过去掉high drive我们的数据传输一直都非常稳定。

发表新评论