解决STM32 SPI通信中常见问题及方法(主从模式)

        最近在做一个多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校验

3,硬件片选:虽然从理论上讲,只有主机和从机片选开不开无所谓,但是经过向多名开发者验证和我的多次测试,发现开启硬件片选可以大大提升SPI通信稳定性,甚至可以直接解决疑难杂症一

物联沃分享整理
物联沃-IOTWORD物联网 » 解决STM32 SPI通信中常见问题及方法(主从模式)

发表评论