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参考资料

RX 缓冲模式

在 SDK 中的当前演示项目中,将 RX 配置为 FIFO 模式。下一节介绍了如何在缓冲模式下使用 RX。

static const DL_MCAN_StdMsgIDFilterElement gMCAN0StdFiltelem = {
    .sfec = 0x7,
    .sft  = 0x0,
    .sfid1 = 3,
    .sfid2 = 0x0,
};
/* Configure Standard ID filter element */
DL_MCAN_addStdMsgIDFilter(MCAN0_INST, 0U, (DL_MCAN_StdMsgIDFilterElement *) &gMCAN0StdFiltelem);

当滤波器元素配置为 Store into Rx buffer 或调试消息时,将启用 RX 缓冲区模式。首先,添加一个 .sfec 为 0x7 的滤波器。将 .sfec 设置为 0x7 时,.sft 无关紧要。sfid1 是滤波器 ID,接收消息 ID 必须与该 ID 相匹配才能接收。sfid2 能配置使用哪个 Rx 缓冲器来存储已接收的消息。

/* New message received by Rx Buffer (Filter matched) */
if(gInterruptLineStatus & DL_MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG){
    gInterruptLine1Status |= DL_MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG;
    DL_MCAN_getNewDataStatus(MCAN0_INST, &newDataStatus);    
    
    if(newDataStatus.statusLow) {
        /* Check Rx Buffer0 status */
        if(newDataStatus.statusLow & 0x1){
            DL_MCAN_readMsgRam(MCAN0_INST, DL_MCAN_MEM_TYPE_BUF, MCAN_RX_MSG_BUFFER_INDEX, 0U, &rxMsg);
            ProcessCanRxMsg(&rxMsg);
        }
        /* Check remaining Rx Buffer */
    }
    if(newDataStatus.statusHigh) {
        ; /* 32-63, not applicable in demo */
    }
    /* Clear all new data status */
    DL_MCAN_clearNewDataStatus(MCAN0_INST, &newDataStatus);
} 

当接收到一条与滤波器配置匹配的消息时,该 RX 消息被存储到 RX 缓冲区 0 到 63 的范围。首先,获取新的数据状态。如果 RX 缓冲区 0 至 RX 缓冲区 31 中接收到新消息,则 newDataStatus.statusLow 的相应位将设置为 1。如果 RX 缓冲区 32 到 RX 缓冲区 63 中接收到新消息,则 newDataStatus.statusHigh 的相应位将设置为 1。然后,检查 RX 缓冲区 0 中是否接收到新消息。如果是,则使用 MCAN_RX_MSG_BUFFER_INDEX 值调用 DL_MCAN_readMsgRam() 来读取 RX 消息。在本例中,RX 缓冲区 0 的索引值为 0。最后,在处理消息后,调用 DL_MCAN_clearNewDataStatus() 清除新数据状态。