CAN Busoff错误处理与恢复策略及避免方法详解
CAN Busoff错误处理恢复和避免
现象:CAN数据发不出来,需要断电重启或者复位才能恢复
原因 在 CAN 网络中,“Bus Off” 是一种错误状态,表示节点因发生严重错误而被断开网络。
-
总线错误:
· 位错误:在发送过程中,节点检测到总线上的实际电平与发送的电平不一致。
· 填充错误:CAN 帧中连续的 5 个相同位之后必须插入一个相反位,未能插入则发生填充错误。
· CRC 错误:接收节点计算的 CRC 校验码与发送节点计算的 CRC 校验码不一致。
· CRC 错误:接收节点计算的 CRC 校验码与发送节点计算的 CRC 校验码不一致。
· 格式错误:CAN 帧的格式不符合规范。 -
硬件问题:
· 物理层故障:如总线短路、断路、接地问题等。
· 节点硬件故障:如 CAN 控制器或收发器故障。 -
软件问题:
·错误的配置:CAN 控制器配置错误,如波特率设置不正确。
·软件 Bug:节点软件中的错误导致频繁的错误帧发送。
CAN Bus Off 的处理办法
- 错误计数器机制:
·CAN 协议定义了两个错误计数器:发送错误计数器(TEC)和接收错误计数器(REC)。
·当 TEC 或 REC 超过一定阈值时,节点进入错误被动状态(Error Passive)。
·如果 TEC 超过 255,节点进入 Bus Off 状态。
- 恢复机制:
·自动恢复:某些 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