ZHCAF96 April   2025 MSPM0G3506 , MSPM0G3507 , MSPM0G3518 , MSPM0G3519

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
    1. 1.1 MCAN 特性
  5. 2MCAN 模块的 Sysconfig 配置
    1. 2.1 MCAN 时钟频率
    2. 2.2 MCAN 基本配置
      1. 2.2.1 发送器延迟补偿 (TDC)
      2. 2.2.2 位时序参数
      3. 2.2.3 消息 RAM 配置
        1. 2.2.3.1 标准和扩展 ID 滤波器配置
          1. 2.2.3.1.1 如何添加更多滤波器
        2. 2.2.3.2 TX MSG RAM
        3. 2.2.3.3 RX MSG RAM
    3. 2.3 高级配置
    4. 2.4 保留配置
    5. 2.5 中断
    6. 2.6 引脚配置和 PinMux
  6. 3演示项目说明
    1. 3.1 TX 缓冲模式
    2. 3.2 TX FIFO 模式
    3. 3.3 RX 缓冲模式
    4. 3.4 RX FIFO 模式
  7. 4解决/避免 CAN 通信问题的调试和设计提示
    1. 4.1 所需的最少节点数
    2. 4.2 为何需要收发器
    3. 4.3 总线关闭状态
    4. 4.4 在低功耗模式下使用 MCAN
    5. 4.5 调试检查清单
      1. 4.5.1 编程问题
      2. 4.5.2 物理层问题
      3. 4.5.3 硬件调试提示
  8. 5总结
  9. 6参考资料

总线关闭状态

当 CAN 节点由于严重的总线错误而被强制隔离时,会出现总线关闭状态。在该状态下,节点停止发送和接收数据,从而有效地与总线断开连接。该机制可保护总线免受持续错误的影响并防止故障传播。

主要触发是指当 TEC 超过阈值(通常为 255)时引起的触发。常见场景包括:

  • 硬件故障:CAN 控制器或收发器损坏。
  • 物理层问题:开路或短路、端接电阻器不正确或信号干扰(例如强 EMI)。
  • 配置错误:波特率不匹配,导致调停失败或位错误。
  • 软件错误:重复传输格式错误的帧。

例如,每个传输误差都会使 TEC 递增 1。如果误差快速累积且 TEC 超过 255,则节点进入总线关断状态。

该器件可以通过执行以下操作之一从总线关闭状态中恢复:

  • 硬件复位:复位 CAN 控制器(通过软件复位或下电上电)以清除错误计数器。
  • 接收恢复序列:检测 129 个连续 11 个隐性位序列(总线空闲信号),从而自动将节点恢复为活动错误状态。这需要足够的总线空闲时间(总持续时间= 129 × 11位)。

下述示例说明了如何首先在 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();
}