DSPF2837x系列,SPI调试问题总结

        因为项目需求使用SPI做通讯,做之前想着很简单,应该不会出现什么问题,实际做下来遇到了好几个问题,浪费了不少时间,现总结下相关问题,同时也希望遇到相同问题的同学也可以从中获取一些灵感。

  1. SOMI一直为0xFF问题:在调试SPI时,将A作为主机,B作为从机,配置好后,A可以向B发送消息,B也可以收到,但是B给A发送的消息收不到,A的接收缓存区一直为0xFF,首先从初始化SPI开始查起,经排查初始化没有问题,随后查看四个GPIO是否正确,接着将SOMI设置为普通的GPIO模式给高低电平,另一侧是可以读到的,证明硬件没有问题,网上搜集各种资料也没有发现相关的,最后实在想不出是什么问题,因更改GPIO模式时改错了,把所有的GPIO端口都重新配置了一遍,发现主机接收数据正常了,这个过程太折磨了,因疏忽导致SOMI配置为普通的GPIO模式,所以主机的接收缓冲区一直是全F,一般情况下我们根据官方例程更改程序肯定不会出现问题的,如果出现问题多半是配置错误了。
  2. SPI数据错位问题:主机A通过SPI发送指令和数据到从机B,从机B需要根据主机A发送的指令进行相关操作,如读取电压,电流,温度等,在解决上述主机A接收问题后发现,主机A向从机B发送数据,从机B有时接收正确,有时接收错位,从机B分析完主机A发送的指令后,读取相关数据发送给主机A时,主机A也会出现错位的现象,如主机A发送SPI_TX_DATA = {1, 2, 3, 4, 5, 6},从机B收到的数据SPI_RX_DATA={6,1, 2, 3, 4, 5} ,有时会更乱,此时主机和从机采用直接写SPI_writeDataNonBlocking(uint32_t base, uint16_t data),直接读的方式SPI_readDataNonBlocking(uint32_t base),后尝试以下方法:
    • 在从机B中加入中断接收程序,主机A接收从机B的数据仍有错位现象。
    • 在网上看到DSP28335的硬件SPI使用(无FIFO)总结_dsp28335配置旋变解码-CSDN博客,这位老哥的文章随后在SPI发送的时候加了延迟,是可以解决问题,但是加了延迟不符合嵌入式软件的代码标准,看到这篇文章的评论区有大神也指出了这个问题,并建议使用FIFO的方式发送数据,更改后使用FIFO发送数据,SPI_writeDataBlockingFIFO(uint32_t base, uint16_t data),并使用FIFO接收数据,SPI_readDataBlockingFIFO(uint32_t base),解决了主机A向从机B发送时,从机B接收的错位问题,但是从机B向主机A发送数据还是存在错位。
    • 从机B的程序在收到主机A发送的指令后,才会去读取对应的电流、电压等信息,将程序更改为,先将需要读取的电流、电压信息放到发送指针里面,在收到主机A发送来的命令后,直接将已经存好的数据发送给主机A,主机A收到的数据恢复正常。

总结

        当SPI不通的时候,我们首先要去检查初始化和GPIO的配置,这种最简单的错误往往是最容易忽视的,但一般情况下大多数问题都是没有配置好导致的,另外,SPI是全双工的通信,主机发送的同时,从机也要发送,所以SPI的时序是非常重要的,如第二个问题,就是因为读取电流,电压值导致从机延迟几个时钟,才导致了主机收到的数据滞后,后续如果使用SPI时,这点也需要注意,虽然程序都不难,但定位问题很难,希望可以帮助到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值