STM32系列SPI通讯DMA

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,就可以实现软件片选,这个操作可以放在软件模式下的外部中断,或者DMA数据流中断中都可以,为的是清空SPI中的数据寄存器,让其重新开始,把之前寄存器接收到的垃圾(比如残留的1位数据待在SPI-DR之中),还有一个隐含的操作,当只有把SSI写入1时才能正确的清掉各种标志(没文献支持,纯属经验)。
这样就会明显的发现数据错位的概率降低了,那为什么还不能彻底的降为0呢。因为关的问题解决了,那我们什么时候开呢?软件开肯定比硬件开得慢,要是使用NSS外部中断的下降沿进行中断:可能来不及操作SSI位,所以会丢失某一位。所以我的经验是,放在数据传送完成的上升沿中断中,先SSI置位1,此后清空DMA的中断寄存器,重新装载数据寄存器(可以不装载)使能DMA,SSI值0;很好完美解决了数据错位的问题。

以上解决了数据错位,还有个问题,1.有时遇到的是接收到的首字节错了并非发送的值,并且可能依次偏移。
这个问题是每次启动之后SPI-DR数据寄存器中有垃圾数据,但是又没有被读走,使得启动DMA传输之后,主机还没发来数据从机就以为接收到了一个数据,通过DMA把数据放入寄存器之中造成的。
解决方法:发送之前读一次SPI-DR寄存器,操作:片选上升沿过来时,先SSI置位1,读SPI-DR值,清空DMA的中断寄存器,使能DMA,SSI值0;
但是有时候是发送错位了,示波器可以看出。怎么办呢?同理是SPI_DR的发送寄存器中有垃圾值(可能是上次残留了),一开始发送的时候,就发送了这个值。
解决方法:发送之前,手动写入第一个发送的数据到SPI-DR中。第一个手动写入了,所以DMA传输时,要从第二个开始传送。所以配置DMA是要从TxBuff[1] 地址开始发送,接收是从RxBuff[0]开始,DMA传送的字节数不变。操作:初始化DMA时初始化正确,片选上升沿过来时,先SSI置位1,读SPI-DR值,清空DMA的中断寄存器,写SPI-DR=TxBuff[0]; 使能DMA,SSI值0;至于为什么要这么复杂,吃过亏的才懂(笑哭)。

希望看了对你有所帮助,调SPI高手说半小时搞定,一般的可能需要半天,如果遇到个数据错位,从示波器开始一个个的查器,一个个的配置修改,可能3天或者一周才能稳定传输。

问题又来了,为什么没有代码,只想Copy  Copy 解决问题多好呀。我只能哈哈哈哈了。动动手配置。之前我也是照着网上的方法复制就用,没发现问题,直到主从都使用软件模式时,懵逼了,数据时对时错。

如有疑惑邮箱fifteenpeng@163.com

 

  • 11
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值