一、何为CAN busoff?
为了避免某个设备因为自身原因(例如硬件损坏)导致无法正确收发报文而不断的破坏总线的数据帧,从而影响其它正常节点通信,CAN网络具有严格的错误诊断功能,CAN通用规范中规定每个CAN控制器中有一个发送错误计数器和一个接收错误计数器。根据计数值不同,节点会处于不同的错误状态,并根据计数值的变化进行状态转换,状态转换如下图所示。
以上三种错误状态表示发生故障的严重程度,总线关闭是节点最严重的错误状态。并且,节点在不同的状态下具有不同的特性,在总线关闭状态下,节点不能发送报文或应答总线上的报文,也就意味着不能再对总线有任何影响。
状态跳转和错误计数的规则使得节点在发生通信故障时有了较好的自我错误处理和恢复机制,从一种较严重的错误状态跳转到另一种严重性相对较低的状态,本质上就是一种恢复过程。图1所呈现的转换过程是CAN通用规范所要求的,我们从设备供应商买回来的CAN控制器已经把这些功能固化在硅片之中。
在通信过程中,错误主动和错误被动两种状态下节点的恢复过程一般不需要MCU进行额外的编程处理,直接使用CAN控制器固有功能即可。但对于总线关闭状态,往往不直接使用CAN控制器固有的恢复过程,而是对其进行编程控制,以实现“快恢复”和“慢恢复”机制。
二、什么是“快恢复”,“慢恢复”?
当节点进入总线关闭状态后,如果MCU仅是开启自动恢复功能,CAN控制器在检测到128次11个连续的隐性位后即可恢复通信,在实际的CAN通信总线中,这一条件是很容易达到的。
以125K的波特率为例,128*11*(1/125000)= 0.011264s。这意味着如果节点所在的CAN总线的帧间隔时间大于0.011264s,节点在总线空闲时间内便可轻易恢复通信。
我们已经知道,当进入总线关闭状态时,节点已经发生了严重的错误,处于不可信状态,如果迅速恢复参与总线通信,具有较高的风险,因此,在实际的应用中,往往会通过MCU对CAN控制器总线关闭状态的恢复过程进行编程处理,以控制节点从总线关闭状态恢复到错误主动状态的等待时间,达到既提高灵活性又保证节点在功能上的快速响应性的目的。具体包括“快恢复”和“慢恢复”策略,两种策略一般同时应用。
快恢复和慢恢复对总线来说,仅仅是关闭通讯的时间不同,具体CAN节点做什么操作(如:进入再退出初始化状态),总线并不关心。
三、如何感知busoff?
被动感知:通过CAN中断触发
主动感知:查询上图的BOERR状态
四、如何恢复?
当TECNT大于255时,CAN总线控制器进入离线状态,这时寄存器CAN_ERR中的BOERR置1,并且发送和接收失效。 根据寄存器CAN_CTL中的ABOR配置,离线恢复(变为主动错误状态)有2种方式。这两种方式都要求处于离线状态的CAN总线控制器检测到CAN协议所定义的离线恢复序列(在 CAN_RX检测到128次连续11个位的隐性位)时,才会自动恢复。 如果ABOR为1,将在检测到离线恢复序列后自动恢复。 如果ABOR为0,则必须先将CAN_CTL中的IWMOD置1进入初始化工作模式,然后进入正常工作模式并在检测到离线恢复序列后恢复。标签:状态,控制器,错误,恢复,总线,说明,机制,节点,busoff From: https://www.cnblogs.com/Hello-words/p/18207025