SPI是我们最经常使用到的通讯方式。
在使用SPI时却经常遇到问题:
1.SPI数据通讯一开始是正确的,传一会数据就错了。
2.SPI数据DMA传输错一个字节,每次都错一个字节。
3.SPI数据错几位,造成数据整体偏移。比如传0x5555,就有可能变长0xaaaa。
接下来我用我通俗易懂的方式来解决这个问题。
ARM的SPI有两种模式:硬件模式和软件模式。简单的说区别在于NSS引脚是有硬件管理还是软件管理,那这个引脚怎么能控制SPI寄存器的数据传送呢。
我们先来讨论软件模式,DMA传输:
片选一般都是低电平有效,
SPI主机软件模式时,我们需要自己配置NSS脚(这里所说的NSS脚,是任意一个普通IO即可),在准备发送数据之前拉低引脚,发送完成后拉高即可。
SPI从机软件模式时,该怎么配置片选呢,(任意一个IO)就配置成输入模式,上升沿触发中断,就可以在数据完成时进入中断处理数据,当然也可以选择DMA数据流冲段也可以。
有个经常令人忽视的点,那我原来硬件模式时从机的NSS引脚在干什么呢,配置成软件模式,缺少了引脚信号,软件中是否可以也可以不用管呢?当然不可以,从数据手册可以看到硬件模式时NSS引脚的工作是:当NSS信号为低电平时主机开始传输数据,为高电平时停止传输,如果再给入时钟信号,会传输么,当然不会,因为片选没打开;是什么影响呢,对于ARM肯定是某个寄存器的值,即SPI->CR1寄存器的SSI位。
软件模式时每次接收之前写入0,完成接收之后写入1&#