ZHCAF96 April 2025 MSPM0G3506 , MSPM0G3507 , MSPM0G3518 , MSPM0G3519
当 CAN 节点由于严重的总线错误而被强制隔离时,会出现总线关闭状态。在该状态下,节点停止发送和接收数据,从而有效地与总线断开连接。该机制可保护总线免受持续错误的影响并防止故障传播。
主要触发是指当 TEC 超过阈值(通常为 255)时引起的触发。常见场景包括:
例如,每个传输误差都会使 TEC 递增 1。如果误差快速累积且 TEC 超过 255,则节点进入总线关断状态。
该器件可以通过执行以下操作之一从总线关闭状态中恢复:
下述示例说明了如何首先在 SysConfig 中启用中断 Bus_Off 状态来检测总线关闭状态。当总线关闭状态发生变化时,MCAN 会触发中断 Bus_Off 状态以将这种情况通知用户。用户需要检查总线关闭状态是否在中断例程中。
/**
* CAN protocol status
* Bus off
*/
DL_MCAN_ProtocolStatus gProtStatus;
volatile uint8_t CANBusOff = 0;
void MCAN0_INST_IRQHandler(void)
{
switch (DL_MCAN_getPendingInterrupt(MCAN0_INST)) {
case DL_MCAN_IIDX_LINE0:
break;
case DL_MCAN_IIDX_LINE1:
/* MCAN bus off status changed */
if(gInterruptLine1Status&DL_MCAN_INTERRUPT_BO) {
DL_MCAN_getProtocolStatus(MCAN0_INST, &gProtStatus);
if(gProtStatus.busOffStatus == 1) {
CANBusOff = true;
}
else {
CANBusOff = false;
}
}
/* Clear all MCAN interrupt status */
DL_MCAN_clearIntrStatus(MCAN0_INST, gInterruptLine1Status, DL_MCAN_INTR_SRC_MCAN_LINE_1);
break;
default:
break;
}
}
然后,检查主环路中的 CANBusOff 标志。检测到总线关闭状态时,重新启动 MCAN 模块。
main loop:
{
if(CANBusOff == 1) {
/* Re-start MCAN */
MCAN0_Restart();
CANBusOff = 0;
}
}
/*MCAN restart function*/
void MCAN0_Restart(void)
{
DL_MCAN_reset(CANFD0);
delay_cycles(16);
DL_MCAN_disablePower(CANFD0);
delay_cycles(32);
DL_MCAN_enablePower(CANFD0);
// MCAN RAM need at least 50us to finish init
// 1600 CPU cycles@CPU32MHz
// 4000 CPU cycles@CPU80MHz
delay_cycles(4000);
SYSCFG_DL_MCAN0_init();
}