最近在做一个多MCU的项目时,MCU之间的数据传输使用了SPI通信,在做从机时遇到了一些 “疑难杂症”,研究了半天,总算是把故障排除了,就又总结了一下SPI常遇到的几种问题写出来整理一下。
目录
一、SPI简介:
二、常见问题:
三、疑难杂症:
Q1:使用的HAL库,先开从机,然后再给主机上电,通信正常,但是同时上电,即便是给主机加了延时都通信异常。
Q2:使用的DMA收发,单独测试一切正常,但是只要跟其他DMA同时使用就死机
四、SPI的稳定性优化:
一、SPI简介:
SPI是一种高速,全双工的串行通信协议,由Motorola首先提出,其通信速率可轻松超过10Mbps
(详见文章:STM32初学入门笔记(4):一文解析常见通信协议(USATR/UART,SPI,IIC))
二、常见问题:
从结果来看,常见的问题可大致分为两种:
1:主从完全无法通信
2:从机接收到的数据乱码,移位等数据异常
第一种情况多是由硬件导致的,如SCK接到了MOSI,或者主从MOSI和MISO反接了(总之就是线没接对),也有可能是因为初始化时没有开启SPI的时钟,或是没有配置IO口等软件问题。
其中我们经常遇到的是第二种,导致第二种的原因通常有:
1、硬错误:即硬件连接出现的错误,如接触不良,接线过长,噪声过大等,常见于数据乱码,移位的问题中。
2、软错误:若发生数据移位,且确定硬件无误,则优先排查主从机的数据长度是否一致,如主机发送的数据为16bits,从机接收的为8bits,如果从机项目使用了多个中断,应保证DMA的优先级最高,以保证能够完整获取数据包。此外,如果发送的是数组,还有可能数据内的数据出现错位,这种情况则应检查主从机数据包大小是否一致,如果使用的是DMA接收,则还有可能是因为在DMA传输完成中断中再次开启DMA时设置的数据包大小异常(总之就是数据包大小的问题)。数据乱码在本质上还是发生了数据移位,导致数据异常无法识别,从而引起乱码,使用移位的排查方法即可,这里不再重复。
三、疑难杂症:
Q1:使用的HAL库,先开从机,然后再给主机上电,通信正常,但是同时上电,即便是给主机加了延时都通信异常。
A:首先应排查硬件上的问题,如芯片间的去耦电容是否正常,电源是否稳定,如果确定了硬件没有问题,就使用硬件片选试试,非常稳定,主从同时上电即使主机不加延时也不会引起通信异常。具体原因不详,个人猜测应该是HAL库的问题
Q2:使用的DMA收发,单独测试一切正常,但是只要跟其他DMA同时使用就死机
A: 尝试增大堆栈,STM32死机很大一部分原因是堆栈溢出(DMA是要用到堆栈的)
四、SPI的稳定性优化:
1,通信速率:主机的通信速率尽量不要超过从机SPI的最大速率
2,CRC校验:如果工作环境较为恶劣,有较大的噪声干扰,推荐开启CRC校验文章来源:https://www.toymoban.com/news/detail-832419.html
3,硬件片选:虽然从理论上讲,只有主机和从机片选开不开无所谓,但是经过向多名开发者验证和我的多次测试,发现开启硬件片选可以大大提升SPI通信稳定性,甚至可以直接解决疑难杂症一文章来源地址https://www.toymoban.com/news/detail-832419.html
到了这里,关于STM32使用SPI通信时的一些常见问题及解决方法(主,从)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!