mcp2515 芯片驱动总线错误BUG的解决方法


http://blog.renren.com/share/221002615/11483613167 来自张涛的日志


现象:CAN总线在线上设备热插拔或长时间运行后出现总线异常情况,有时不能发送和接收,有时只能发送不能接收。


分析:

         经过观察,发现出现只能发送不能接收的情况是由于没有调用中断服务造成的,而在整个驱动中并没有其它地方会异常释放中断,所以断定为mcp2515本身没有发出中断;查看芯片手册,发现在CANINTF中断标志位寄存器中有两个错误中断标志位,其它五个为正常情况下的中断标志位,驱动中并没有对错误中断进行处理,造成的结果是总线中发生错误后,错误中断没有处理,CANINTF中的错误标志位始终没有被清除,造成其它中断被堵塞,因此无法接收数据;而长时间动行后,错误中断计数器达到一定值后,总线就被关闭,所以会出现收发都不正常的情况。


解决办法:最简单的办法就是处理错误中断,在出现错误后重置mcp2515芯片。


结果:使用以上办法后,热插拔总线设备并不会出现总线异常情况。



==========================



7.6 错误中断
当错误中断使能 (CANINTE.ERRIE =1)时,如果发
生溢出或发送器/接收器的错误状态发生改变,器件将
在INT引脚产生中断。错误标志 (EFLG)寄存器将会
表明以下错误中断状况之一。




7.6.1 接收器溢出
当MAB组合好收到的有效报文 (该报文符合验收滤波
器的接收条件),而与该滤波器相关的接收缓冲器尚无
法装载新报文时,将发生溢出。相应的EFLG.RXnOVR
位将被置1,表明发生溢出。该位必须由MCU清零




7.6.2 接收器警告
REC达到MCU警告限定值96。


7.6.3 发送器警告
TEC达到MCU警告限定值96。


7.6.4 接收器被动错误
REC超出被动错误限定值127,且器件进入被动错误状态。


7.6.5 发送器被动错误
TEC超出被动错误限定值127,且器件进入被动错误状
态。


7.6.6 总线关闭
TEC超出255且器件进入总线关闭状态。


mcp2515 芯片驱动总线错误BUG的解决方法_第1张图片



mcp2515 芯片驱动总线错误BUG的解决方法_第2张图片





你可能感兴趣的:(Linux,应用开发)