1. busoff 解读
1.1什么是busoff?
busoff 表示总线的关闭,此时ECU从总线脱离,既不能接收总线的报文,也不能向总线发送报文。
1.2.哪些情况会导致 busoff 产生?
假设can总线上有两个节点,BusOff故障的宏观原因主要包括以下几点:
(1)CAN_H和CAN_L的开路、短路以及终端电阻的开路等会导致can busoff;
(2)任何一个节点的CAN控制器或收发器的故障会导致BusOff故障的发生。
(3)外部环境中的电磁干扰或其他形式的干扰导致CAN信号传输异常,进而导致BusOff故障。
1.3. busoff 实际产生原因
节点自身识别到自己发送错误,发送错误计数器(TEC)大于255导致的。
说明:
(1)CAN总线上存在多种错误状态,位错误(Bit Check Error)、位填充错误(Bit Stuff Error)、CRC错误(CRC Error)、帧格式错误( Check Error)、应答错误(Acknowledgment Error)。
(2)CAN模块中有接收错误计数器(REC)及发送错误计数器(TEC);CAN错误包括三种状态,即主动错误、被动错误、总线关闭;
1>.主动错误:当发送错误计数器和接收错误计数器值都小于128时产生,正常进行总线通讯,错误发生时,发送主动错误帧;
2>.被动错误:当发送错误计数器或接收错误计数器值大于等于127时产生;正常进行总线通讯,错误发生时,发送被动错误帧;
3>.总线关闭:当发送错误计数器大于等于256时产生,不收发任何报文。
综上所述 物理层的线路问题、CAN控制器的硬件故障、CAN总线的信号干扰等都有可能产生BusOff故障。但是节点进入busoff状态,一定是因为节点自身识别到自己发送错误,发送错误计数器(TEC)大于255导致的。一旦检测到BusOff故障,可以通过重新初始化CAN控制器来解决。
2.busoff 快慢恢复机制
2.1.引入快慢恢复机制的原因
当节点进入总线关闭状态后,如果MCU仅是开启自动恢复功能,CAN控制器在检测到128次11个连续的隐性位后即可恢复通信。以500K的波特率为例,128*11*(1/500000)= 0.002816s。这意味着如果节点所在的CAN总线的帧间隔时间大于0.002816s,节点在总线空闲时间内便很快恢复通信。当进入总线关闭状态时,节点已经发生了严重的错误,处于不可信状态,如果迅速恢复参与总线通信,具有较高的风险,因此,在实际的应用中,往往会通过MCU对CAN控制器总线关闭状态的恢复过程进行编程处理,以控制节点从总线关闭状态恢复到错误主动状态的等待时间,达到既提高灵活性又保证节点在功能上的快速响应性的目的。
2.2.快慢恢复流程
(1)节点在正常通讯的过程中,出现了发送错误,且发送错误计数不断增加,只要发送错误计数没有超过255, CAN控制器便会自动重发报文,如果发送错误计数超过255,则节点状态为总线关闭状态。快慢恢复流程如下:
1>.busoff 产生,总线处于关闭状态。
2>.进入can busoff 中断,在中断中记录busoff 状态,置位busoff标志位,这时MCU已经进入“快恢复”过程。根据标志位控制位控制MCU的 can控制器停发报文, 并进行等待。
3>.时间达到T1(如100ms)后,MCU重新初始化CAN控制器并与总线通信,这样便完成了一次“快恢复。
4>.重复快恢复流程,当节点“快恢复”计数达到设定的值N(如10次),MCU把恢复总线通信的等待时间T2进行延长(如1000ms),这样便实现了“慢恢复”过程。
注意:
1>.“快恢复”和“慢恢复”过程的主要区别就在于恢复节点参与总线通信的等待时间的不同。
2>.如果总线上只有一个节点,该节点发送的报文没有其他节点应答,此时节点的TEC只会增加到128,不会产生busoff。
3>.在快/慢恢复时间内应暂停发送报文,可以接收报文。