4. AURIX CAN FD模块详解

AURIX TC3xx 系列中的 CAN FD 控制器被称为 MCMCAN(Multi-CAN Controller),它基于 Bosch M_CAN 内核构建,是符合 ISO 11898-1:2015 的完整 CAN FD 协议控制器。与早期 AURIX TC2xx 的 MultiCAN 模块相比,MCMCAN 在报文吞吐、过滤精度、RAM 组织方式以及中断/DMA 协同上都有明显变化。理解 MCMCAN 的内部结构,是后续配置 CAN FD 通信、诊断与网关转发的基础。

一、MCMCAN 模块总体结构

一个 MCMCAN 模块内部通常集成多个独立的 CAN 节点(Node),每个节点对应一路 CAN/CAN FD 通道。每个节点内部包含 M_CAN 内核、消息处理器(Message Handler)、过滤器单元、Tx/Rx FIFO、Tx Event FIFO 以及中断/DMA 请求逻辑。所有节点共享一块 Message RAM,但每个节点在 RAM 中拥有自己独立的地址区间,通过配置寄存器划分。

MCMCAN 与 CPU 之间的交互主要通过三类接口完成:

  • 寄存器接口:用于配置位时序、模式、过滤器、FIFO 水位、中断使能等。
  • Message RAM 接口:CPU 通过读写 RAM 中的报文对象完成收发,避免频繁访问寄存器。
  • 中断与 DMA 接口:将事件(接收、发送完成、错误、FIFO 水位)上报给中断控制器或 DMA 控制器。

下图展示了 MCMCAN 模块的核心结构关系,包括节点、Message RAM 分区、过滤器、FIFO 以及中断/DMA 路径。

MCMCAN 模块结构示意 CPU / DMA 寄存器 + RAM 访问 中断控制器 / DMA IRQ / DMA 请求 CAN Node 0 M_CAN 内核 位时序 / 协议状态机 过滤器单元 标准/扩展 ID 匹配 Rx FIFO 接收队列 Tx FIFO 发送队列 Tx Event FIFO 发送时间戳 / 状态 CAN Node 1 M_CAN 内核 位时序 / 协议状态机 过滤器单元 标准/扩展 ID 匹配 Rx FIFO 接收队列 Tx FIFO 发送队列 Tx Event FIFO 发送时间戳 / 状态 Message RAM(共享) Node 0 标准过滤区 SID 过滤器 + 接收对象 Node 0 扩展过滤区 EID 过滤器 + 接收对象 Node 1 过滤区 独立地址区间 Tx Buffer / FIFO 区 发送对象与事件记录 每个 Node 独立配置过滤器与 FIFO,共享 Message RAM 但地址分区隔离

二、Message RAM 的组织方式

Message RAM 是 MCMCAN 的核心数据区,所有接收对象、发送对象、过滤器元素、FIFO 元素都存放在这里。它不是普通缓存,而是由 M_CAN 硬件直接读写的结构化存储区。每个节点在 Message RAM 中拥有独立的基地址和长度,通过 MCAN_SIDFC、MCAN_XIDFC、MCAN_RXF0C、MCAN_TXBC 等寄存器指定各区域的起始偏移和元素数量。

典型分区包括:

  • 标准过滤器区(SID Filter):存放标准帧 ID 的过滤规则,每条规则包含 ID、掩码和匹配后指向的接收对象。
  • 扩展过滤器区(XID Filter):存放扩展帧 ID 的过滤规则,结构与标准过滤器类似。
  • Rx FIFO 0/1:接收 FIFO,存放已通过过滤的报文,支持水位中断和溢出保护。
  • Tx Buffer / Tx FIFO:发送对象区,CPU 将待发报文写入后置位请求位,硬件按优先级发送。
  • Tx Event FIFO:记录发送完成事件,包含时间戳和报文状态,用于确认发送结果。
Message RAM 的地址必须按 4 字节对齐,且各区域不能重叠。配置错误会导致过滤器失效或 FIFO 行为异常,建议在初始化后用回读方式校验各区域偏移。

三、过滤器与 FIFO 的协同

过滤器决定“哪些报文被接收”,FIFO 决定“接收后放在哪里”。MCMCAN 的过滤器采用“ID + 掩码”匹配方式,支持精确匹配和范围匹配。当报文通过过滤器后,硬件会根据过滤器元素中的目标指针,将报文写入对应的 Rx FIFO 或专用接收对象。

FIFO 的关键参数包括:

参数 说明 典型配置
FIFO 深度 可存放的报文元素数量 8~64 元素
水位阈值 达到该数量时触发中断 深度的一半
操作模式 阻塞模式或覆盖模式 阻塞模式,防丢帧
元素大小 每个报文占用的 RAM 字节数 由数据场长度决定

当 FIFO 满且新报文到达时,若配置为阻塞模式,硬件会丢弃新报文并置位溢出标志;若为覆盖模式,则覆盖最旧报文。工程中通常选择阻塞模式,并通过水位中断及时搬运数据。

四、中断与 DMA 机制

MCMCAN 的中断源非常丰富,主要包括:接收 FIFO 水位、接收 FIFO 溢出、发送完成、发送取消完成、Tx Event FIFO 水位、错误状态变化、总线关闭等。每个中断源都可以独立使能,并映射到 MCAN_ILS 和 MCAN_ILE 寄存器控制的两级中断线上。

中断服务程序通常只做“搬运”和“清标志”,避免在 ISR 中做复杂解析。对于高吞吐场景,建议使用 DMA 将 Rx FIFO 中的报文批量搬运到应用缓冲区,减少 CPU 介入。DMA 请求可以由 FIFO 水位或新报文事件触发,搬运完成后由 DMA 中断通知应用层。

/* 典型 MCMCAN 初始化片段(伪代码) */
MCAN_Init();
MCAN_SetBitTime(MCAN_NODE0, 500000, 2000000);   /* 仲裁段 500k,数据段 2M */
MCAN_ConfigSIDFilter(MCAN_NODE0, 0x123, 0x7FF, RX_FIFO0);
MCAN_ConfigXIDFilter(MCAN_NODE0, 0x18DAF110, 0x1FFFFFFF, RX_FIFO1);
MCAN_ConfigRxFifo(MCAN_NODE0, RX_FIFO0, 32, 16); /* 深度 32,水位 16 */
MCAN_EnableInterrupt(MCAN_NODE0, RX_FIFO0_WATERMARK | TX_COMPLETE);
MCAN_Start(MCAN_NODE0);

五、案例与常见误区

在一个典型的车身网关场景中,AURIX 需要同时处理三路 CAN FD:一路连接动力总成,一路连接车身控制,一路连接诊断。配置时,动力总成通道使用扩展过滤器精确匹配关键 ID,并启用 DMA 搬运;车身通道使用标准过滤器接收大量周期报文,采用水位中断;诊断通道则保留独立 FIFO,避免诊断长帧阻塞其他报文。

常见误区一:把 Message RAM 当作普通数组随意读写,忽略元素对齐和区域边界,导致过滤器指针错乱。误区二:FIFO 深度设置过小,在高负载下频繁溢出。误区三:在中断中直接解析报文,导致中断响应时间过长,影响其他节点。误区四:DMA 搬运未与 FIFO 读指针同步,造成重复搬运或丢帧。

复盘时建议重点检查:过滤器掩码是否覆盖目标 ID、FIFO 水位是否合理、中断优先级是否与实时性匹配、DMA 描述符是否循环正确、错误计数器是否在正常范围。只有把 MCMCAN 的结构、RAM 分区、过滤与 FIFO、中断与 DMA 作为一个整体来理解,才能在 CAN FD 工程中做到稳定、可预测的通信。