CAN Busoff错误处理与恢复策略及避免方法详解

CAN Busoff错误处理恢复和避免

现象:CAN数据发不出来,需要断电重启或者复位才能恢复

原因 在 CAN 网络中,“Bus Off” 是一种错误状态,表示节点因发生严重错误而被断开网络。

  1. 总线错误:
    · 位错误:在发送过程中,节点检测到总线上的实际电平与发送的电平不一致。
    · 填充错误:CAN 帧中连续的 5 个相同位之后必须插入一个相反位,未能插入则发生填充错误。
    · CRC 错误:接收节点计算的 CRC 校验码与发送节点计算的 CRC 校验码不一致。
    · CRC 错误:接收节点计算的 CRC 校验码与发送节点计算的 CRC 校验码不一致。
    · 格式错误:CAN 帧的格式不符合规范。

  2. 硬件问题:
    · 物理层故障:如总线短路、断路、接地问题等。
    · 节点硬件故障:如 CAN 控制器或收发器故障。

  3. 软件问题:
    ·错误的配置:CAN 控制器配置错误,如波特率设置不正确。
    ·软件 Bug:节点软件中的错误导致频繁的错误帧发送。

CAN Bus Off 的处理办法

  1. 错误计数器机制:

·CAN 协议定义了两个错误计数器:发送错误计数器(TEC)和接收错误计数器(REC)。
·当 TEC 或 REC 超过一定阈值时,节点进入错误被动状态(Error Passive)。
·如果 TEC 超过 255,节点进入 Bus Off 状态。

  1. 恢复机制:

·自动恢复:某些 CAN 控制器支持自动恢复功能,在检测到 Bus Off 状态后,经过一定时间自动尝试重新连接总线。
·手动恢复:需要重置 CAN 控制器或重新初始化 CAN 节点。

示例代码(手动恢复)

if(mcan_is_transmit_request_pending(HPM_MCAN2, 0)){ //CAN 控制器库提供了状态读取函数,判断是否发生busoff错误
          mcan_deinit(HPM_MCAN2);  // CAN 控制器库提供了重置函数
          user_can_init();		// 重新初始化 CAN 控制器
    }

如何避免

//根据上面的原因分析,可根据实际情况来避免问题
//在配置没问题的前提下,大多CAN总线的连接有接触不良等原因导致,所以尽量先判断总线状态后在调用发送函数
// 假设CAN控制器的基地址
/* CAN2 base address */
#define HPM_CAN2_BASE (0xF0088000UL)
/* CAN2 base pointer */
#define HPM_CAN2 ((CAN_Type *) HPM_CAN2_BASE)

/**
 * @brief Check whether the secondary transmit buffer is full
 * @param [in] base CAN base address
 * @return true for full
 */
static inline bool can_is_secondary_transmit_buffer_full(CAN_Type *base)
{
    return (CAN_CMD_STA_CMD_CTRL_TSSTAT_GET(base->CMD_STA_CMD_CTRL) == CAN_STB_IS_FULL);
}

bool can_tx(CanFrame *tx_header)
{
	int timeout = 0;
  // 检查TX_BUFF是否为空
    while (can_is_secondary_transmit_buffer_full(HPM_CAN2)) {
		timeout++;
		if(timeout > 5000){return false;}
		}

     mcan_transmit_via_txbuf_nonblocking(HPM_MCAN2, 0, &tx_frame);
     return true;
}

作者:jake tang

物联沃分享整理
物联沃-IOTWORD物联网 » CAN Busoff错误处理与恢复策略及避免方法详解

发表回复