前几天又开始弄can程序调试通讯,弄着弄着突然发现一个错误,主机接受正常但有时候发送不成功,一旦发送不成功程序就继续呈发送状态除非中断才能打断但这样整个系统就崩溃了,而一旦发送成功以后的就正常了,但分机却发送接受正常,问题出来了,就要找到问题并解决它。
以前做别的小东西也出现过类似的问题,最后发现是电源不稳定。好。加电容滤波→不行,换一个稳定电源→不行。再检查硬件问题,有无短路断路接错线之类的,最后发现CANL与地短路了(这以前也能通讯成功,看来CANH与CANL在传数据那一刻拉高拉低的功能蛮强大的),弄好后还是不行。
软件方面的,既然分机情况正常,那就把分机的SJA初始化、can的发送接收移植到主机里(其实几乎是一模一样的),但还是不行。以为是协议弄错了,我做的是一对多通讯,ID和ACR、AMR必须要相互对应,又将这个狠狠的研究了下对这一段程序进行了优化,但结果还是那样。
好吧!我快崩溃了,在群里和网友讨论,发现很有可能是初始化的问题,但我认为程序是一样的,应该不会有错误啊。
晚上吃晚饭和同事打了几局桌球,然后一起来加班,准备再测试一下记录各种状态情况,然后把这些情况发送到网上请各大神来帮忙。然后想了想既然要发到网上去,为什么不把主机和分机的程序好好的对一下看关键部分是不是一样的,好吧,情况就在这个时候开始有转机了。
习惯先从主函数入手,结果第一句就发现了不一样,CUP初始化先对SJA复位结果没有给SJA低脉冲,直接给的高,我的天啦!低脉冲复位,很有可能是这里问题,给了个低脉冲后再测试,断电起电了几十遍没有问题,然后将低脉冲去掉再测试结果出现了情况。就这里吧,加上低脉冲进行各种情况的测试都正常。
OK,事情到这个地方本就该结束了,但来了个小高潮:突然主机发送不了数据了,并且也接收不了,断电起电后还是不行。情况和以前的相似又有点区别,难道除了这个问题又出现了新问题。还好,努力把心情平静下来,按照习惯先检查硬件方面的,结果→一根通讯线断了,经过长时间的移动它终于断了,哇靠!接上后一切正常。
本来这种事情是不该发生的,因为我的疏忽、马虎、不认真而导致了这钟错误的发生,这狠狠的给我敲了下警钟,在技术方面不得有一点点的马虎,任何一个小小的问题都会影响整个系统。