完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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 解决问题多好呀。我只能哈哈哈哈了。动动手配置。之前我也是照着网上的方法复制就用,没发现问题,直到主从都使用软件模式时,懵逼了,数据时对时错。 |
|
|
|
批量生产过程中,发现有个别板子的SPI信号出现错位
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1353 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1352 浏览 1 评论
773 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
556 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1382 浏览 2 评论
1754浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
480浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
415浏览 3评论
406浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
386浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-27 08:21 , Processed in 0.992125 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号