这几天把我这边用了两年的设备偶发性spi错位问题解决了,我的问题出在SPI的主从同步错误,导致数据移位,最开始查问题发现主、从模式居然没保持一样,主机mode0,从机mode3,神奇的居然正常通信了快两年了,但是只要从机重启,数据一定错位,另外就是有偶发性启动就错位,因此我把从机模式改为mode0,原以为就可以正常了,可反而更糟糕,启动就错位,单独重启从机正常;但我坚信主从mode应该保持一致,这个不容怀疑,与是我开始细致查问题,我还是坚信是软件或者硬件造成的,于是迫不得已我开始折腾硬件工程师来查,别人根本不想理你,觉得他们跑了两年的板子不会有问题,但最后迫于项目压力要甩锅,别人帮我接好测试线上逻辑分析仪,更奇怪的问题发生了,从机接收错误的情况下(主机发来aa,从机收到55),从机将收到的转给主机(将收到的55转给主机),逻辑分析仪上看到的都是正常(mosi上是aa,miso上也是aa),于是我又开始怀疑了,逻辑分析仪不对?还会从机错错得对?于是我感觉自己真的找不到原因了,就想错位后的处理办法,偶尔听到一个同事说,接收前读DR寄存器就可以清楚里面的内容,这特么带我入沟,查资料看到清单的是空标志位,并不能清理啥,毕竟主机的sck后面有发,错位了不可能清理就好了,还是出错后重新初始化吧,这样靠谱。这时候问题就来了,主机每10ms就发一包数据,我在什么时候初始化呢?必须在当前包接收完,下一包来之前,不然还会引入移位,这时我想到的就是NSS信号脚,从机SPI的nss做软件吧,采用上升沿中断触发,就知道当前接收完,结果我配了不起作用,我特么连个外部中断都不会了?肯定不是,我开始怀疑硬件接错线了(说明一下,我们代码不能仿真),真的他妈NSS脚错了,到这里才基本完成。
总结,spi数据移位问题,要确保主从mode一致;硬件管脚接对;从机先启动,做握手处理,或者数据错了后的重新初始化处理(考虑初始化后再错,反复初始化问题,可利用NSS上升沿中断后初始化); |