stm32 硬件SPI接收 数据的干扰、丢包的一些感想

最近做一个项目,客户用4Mhz的SPI时钟给我们发数据,一开始还想着用软件模拟SPI接收,结果还是我too young too简单。

4Mhz虽然听起来速度不高,但是相当于一个电平持续时间是125ns,用stm32的库函数去读,根本就做不到,光是响应中断就需要十几个指令周期,几十纳秒就出去了,更不用说再读取电平状态去判断了。

所以不得不更改电路板,被迫接受使用硬件SPI的命运。因为以前知道stm32的硬件IIC有问题,所以能自己模拟的都自己模拟了,这就是单片机的劣势,已经做好的硬件功能自己不能更改,你也不知道它内部到底发生了什么,这时候还是感觉FPGA真香。

做好配置后,用FPGA发射了一个波形,stm32使用SPI3中断接收,正常接收没有问题。就此搁置。

过了一段时间,项目启动,客户要每隔200us给我们发一次数据(太可怕了,还好没有使用软件SPI,否则别的啥事也别干了),这时候问题显现出来:丢包。

下面进行问题排查,可能的因素有:

  1. 是否是频率太高导致硬件SPI接收能力跟不上?
  2. 是否SPI的LE使能信号和时钟信号之间间距太短导致stm32的spi来不及判断?
  3. 信号传输过程中存在干扰?

针对第一种可能,尝试降低发送频率,无效果;尝试降低接收频率,无效果;

针对第二种可能,尝试把NSS和CLK起始信号拉长,测试,无效果;

到这时候想到了是不是中断响应过于频繁导致接收失败,于是用DMA接收SPI试了一下,配置没成功,所以放弃了。当然,放弃的原因是我想明白了,就算用DMA接收到数据,我也要立即响应,所以中断还是一直存在。

这时候我灵光一线。不如先用一个开发板试试自发自收??

配置好程序之后,一实验,发现没有丢包!!这充分证明了stm32的硬件SPI是没问题的,速度完全可以跟得上,尝试提升发送频率也没有问题。

那么就是第三种可能了

  1. 客户板到我们板之间的连接是暂时用临时线焊接的,是否因线太乱导致时钟信号等扰动太大,读数失败?
  2. 因结构紧张,和客户板连接的接插件到单片机IO口之间经过了多层转接,是否导致了信号扰动太大?
  3. 画PCB的同事不够专业,出现了多个直角走线的情况,是否导致信号收到的干扰太大?

接下来用逻辑分析仪抓数据,先抓客户板到我们板连接线的根部,发现波形正常;再抓单片机IO口根部波形,也不知道是手抖还是啥,LE信号有抖动,其余的信号比较正常。具体的症结出在哪,到现在没有头绪,但是确定了肯定是板子的设计有问题。

这时候,客户提醒了,说在时钟的下降沿抓数据,因为下降沿往往是干净的,上升沿由于PCB或线路的原因,可能会出现抖动。

那么在程序里改成了时钟的下降沿捕获数据,果不其然,这次再也没有丢包的现象出现了~

总结:本次的现象说明,电路板的设计本身有问题,导致了上升沿的不稳定,那么既然电路板已经做完了,为了实现功能,只好是把在时钟的上升沿捕获数据改成下降沿捕获数据,这样才可以提升传输的可靠性。

那么回归到我曾经思考过的问题,stm32的硬件SPI到底设计上有没有问题呢?答案是确定的。用过硬件SPI的都知道,stm32的NSS端如果配置成硬件模式,那么整个通信是无法完成的,整个过程,NSS都会是低电平状态。通过查询相关资料,stm32的NSS应该在外部接一个上拉电阻,才能正常输出时序。这个设计比较恶心人,但是具体的我并没有试验所以能不能实现不敢妄下结论。各位可以试验一下。

发布了13 篇原创文章 · 获赞 23 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/shizhibuyi1234/article/details/104697676