SPI读取24位数据发生了数据颠倒
我用SPI读取一个24位的数据,8位8位的读取,读取三次。正常读取出来的数据顺序应该是ABC,我用示波器抓了,波形就是ABC。但是我读取出来的数据却是CAB。这不是最奇怪的,当我只从寄存器取一次数据的时候,我第一个字节读出来的就是A;当我从寄存器取2次数据的时候,第一个字节读出来的就是B;当我从寄存器读三个字节的时候,第一个字节就是C。奇怪的是,当我读第一个字节的时候,系统是怎么知道我后面还是否会继续读取数据,从而给我不同的数据的呢?读取三个字节:
读取两个字节:
读取一个字节:
CAB不是颠倒而是错位,你看 CAB CAB CAB,如果去掉前面第一个C,那后面就是ABC ABC 找到问题了,问题在于前面,我下发数据后,并没有将缓存区的数据取出,我在一个博客中看见SPI在每次写数据后也依然要将寄存器中的数据读出,哪怕是没用的。在我将前面写数据后的寄存器值读出来丢掉后,后面的数据就是正常顺序的了。 LcwSwust 发表于 2022-10-19 17:34
CAB不是颠倒而是错位,你看 CAB CAB CAB,如果去掉前面第一个C,那后面就是ABC ABC...
嗯,我发现是前面数据有一部分并没有被我读出导致的。导致后面的数据都错位了 实验不是错. 代码不严格的实验,就是自己挖坑自己跳 spi不都是8位的数据吗 解决SPI数据错几位造成数据整体偏移的问题 数据颠倒需要查看是不是数据时序是否正确 SPI数据DMA传输错一个字节? 可以检查是否有SPI数据线外接的情况 使用示波器测量一下信号是否正确 这个是代码的问题还是硬件的问题呢 这个可以自己移位颠倒数据的 SPI硬件设置大小端出问题了?还是传参的顺序出问题了? 所以是SPI缓存数据堆积的原因导致的呗。 是不是数据的高端和低端的配置或者读取顺序出现问题了呢 SPI数据错几位,造成数据整体偏移。比如传0x5555,就有可能变长0xaaaa。 软件模式时每次接收之前写入0,完成接收之后写入1,就可以实现软件片选,这个操作可以放在软件模式下的外部中断,或者DMA数据流中断中都可以,为的是清空SPI中的数据寄存器,让其重新开始,把之前寄存器接收到的垃圾(比如残留的1位数据待在SPI-DR之中),还有一个隐含的操作,当只有把SSI写入1时才能正确的清掉各种标志 本帖最后由 labasi 于 2022-11-7 13:30 编辑
不清楚这个问题 有时遇到的是接收到的首字节错了并非发送的值,并且可能依次偏移。
页:
[1]
2