项目场景:
通过CAN模块实现控制器与整车的通信,控制器每隔10ms发送一帧报文数据(定时发送),整车每隔100ms发送一帧信号(ID1),每隔20ms发送另一帧信号(ID2)
问题描述:
can数据在传输过程中,有可能会出现某个ID(ID1或者ID2)接收不到报文,但是另一个ID可以正常接收,且can的间隔发送也正常。
原因分析:
通过仿真调试,发现是对应该IDcan的邮箱使能寄存器被修改掉,导致该ID不能正常接收到can报文,can接收报文是使用的中断接收。
而在单步调试过程中,发现能对该寄存器操作的函数只有在初始化和can发送函数,在正常情况下,can发送函数只使能自己对应的bit位,然后在中断函数,清掉该标志位,但是可能在异常情况下(如低压,大量报文情况下,可能操作错误,导致修改掉别ID的bit位)。
解决方案:
将can的发送中断模式改为,can的轮询发送模式,即轮询标志位,然后在报文发送成功后,再清掉该标志位,问题得到解决。