3. CAN协议基础与AURIX实现

CAN(Controller Area Network)是车载电子系统中最广泛使用的串行总线之一。它采用差分信号传输、多主仲裁和基于报文标识符的优先级机制,在电磁干扰强、节点众多的车身与动力域中仍能保持可靠通信。英飞凌AURIX系列MCU内部集成了多路CAN模块(如MultiCAN+或MCMCAN),理解CAN 2.0B与CAN-FD的帧格式、位定时与同步机制,以及AURIX中报文对象、验收滤波和FIFO的组织方式,是进行CAN通信开发的基础。

一、CAN 2.0B与CAN-FD帧格式

经典CAN 2.0B使用29位扩展标识符,一帧由帧起始(SOF)、仲裁段、控制段、数据段、CRC段、应答段和帧结束组成。仲裁段包含11位基本ID和18位扩展ID,控制段中的DLC(Data Length Code)为4位,最多表示8字节数据。CAN-FD在保持仲裁段与经典CAN兼容的前提下,对帧结构做了关键扩展:引入FDF位区分经典帧与FD帧,引入BRS位切换数据段波特率,引入ESI位指示发送节点错误状态,并将DLC扩展为可表示最多64字节数据。FD帧的CRC场也根据数据长度采用不同多项式,以提高长帧的检错能力。

需要特别注意的是,CAN-FD的“可变速率”并非整帧提速,而是仲裁段仍使用较低波特率以保证多节点仲裁的稳定,数据段则切换到更高波特率以缩短传输时间。例如仲裁段500 kbit/s、数据段2 Mbit/s是常见组合。这种分段速率设计使得FD帧在传输大量数据时效率显著提升,但同时也对收发器和网络拓扑的延迟对称性提出了更高要求。

CAN 2.0B 与 CAN-FD 帧结构对比 CAN 2.0B 扩展帧 SOF 仲裁段 11+18位ID 控制段 DLC 4位 数据段 0~8 字节 CRC ACK EOF CAN-FD 扩展帧 SOF 仲裁段 11+18位ID 控制段 FDF BRS ESI DLC 数据段 0~64 字节 CRC (可变) ACK EOF BRS 切换点 仲裁段波特率:500 kbit/s(示例) 数据段波特率:2 Mbit/s(示例) FD帧效率提升:64字节数据仅需约 1/3 传输时间 (相比经典CAN 8字节分帧传输)

二、位定时与同步机制

CAN总线没有独立的时钟线,所有节点依靠位定时逻辑对总线电平进行采样。一个位时间被划分为若干时间段:同步段(Sync_Seg)、传播段(Prop_Seg)、相位缓冲段1(Phase_Seg1)和相位缓冲段2(Phase_Seg2)。采样点位于Phase_Seg1结束处。各段以时间份额Tq为单位,Tq由系统时钟经预分频器分频得到。位时间 = Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2,采样点位置 = (Sync_Seg + Prop_Seg + Phase_Seg1) / 总Tq数。

同步分为硬同步和重同步。硬同步发生在帧起始的下降沿,强制将位时间对齐到SOF。重同步发生在帧内每个下降沿,根据相位误差调整Phase_Seg1或Phase_Seg2的长度,调整量受重同步跳转宽度(SJW)限制。若相位误差为正(边沿提前),则延长Phase_Seg1;若为负(边沿滞后),则缩短Phase_Seg2。SJW通常设为1~4个Tq,取值需兼顾同步能力和抗噪声能力。

以AURIX MCMCAN模块为例,假设模块时钟为80 MHz,目标波特率500 kbit/s,采样点75%。可先设预分频值BRP=10,则Tq=10/80MHz=125 ns,位时间=1/500k=2000 ns,共16个Tq。采样点75%即第12个Tq处,因此Sync_Seg=1Tq,Prop_Seg+Phase_Seg1=11Tq,Phase_Seg2=4Tq。若Prop_Seg=5Tq,则Phase_Seg1=6Tq。SJW可设为2Tq。这些参数需写入NBTP寄存器,并通过实际总线波形验证采样点是否落在信号稳定区域。

三、AURIX CAN模块的报文对象、验收滤波与FIFO机制

AURIX的MCMCAN模块将报文存储组织为报文RAM中的多个报文对象(Message Object)。每个报文对象包含标识符、控制位、数据长度和数据字段,可独立配置为发送或接收。发送时,CPU将数据写入报文对象并置位发送请求;接收时,模块根据验收滤波结果将匹配帧存入对应报文对象或FIFO。

验收滤波由全局滤波配置和每个报文对象的验收掩码共同决定。标识符寄存器存放期望ID,掩码寄存器决定哪些位参与比较。例如期望ID为0x123,掩码为0x7FF,则只有标准ID完全等于0x123的帧才能通过。若掩码为0x7F0,则ID高7位匹配即可,低4位任意。AURIX还支持范围滤波和双ID滤波等扩展模式,可减少CPU中断负载。

FIFO机制用于接收突发数据。多个报文对象可链接成一个接收FIFO,新帧按顺序存入,CPU从FIFO出口读取。发送FIFO则按优先级或写入顺序发送。FIFO的深度、水印中断和溢出处理需在初始化时配置。当FIFO满时,新帧可能被丢弃或覆盖,因此需根据总线负载合理设置深度和水印阈值。

在AURIX MCMCAN中,报文对象数量、FIFO深度和滤波配置相互制约。建议先根据总线矩阵确定需要接收的ID集合,再分配报文对象和FIFO,最后配置滤波掩码,避免后期频繁调整。

四、初始化与验证要点

实际开发中,CAN模块初始化通常按以下顺序进行:使能模块时钟、配置波特率寄存器、设置报文对象和FIFO、配置验收滤波、使能中断、进入正常模式。验证时可通过回环模式先确认帧格式和滤波逻辑,再接入真实总线。观察点包括:总线波形采样点位置、接收中断触发频率、FIFO填充深度、错误计数器状态。若出现位错误或仲裁丢失,应优先检查位定时参数和终端电阻匹配。

/* 示例:MCMCAN 位定时参数计算(假设 fCAN=80MHz, 500kbps, 采样点75%) */
BRP   = 10;          // 预分频
Tq    = 10 / 80MHz = 125ns;
BitTime = 1 / 500k = 2000ns = 16 Tq;
Sync_Seg   = 1 Tq;
Prop_Seg   = 5 Tq;
Phase_Seg1 = 6 Tq;   // 采样点 = 1+5+6 = 12 Tq = 75%
Phase_Seg2 = 4 Tq;
SJW        = 2 Tq;

掌握帧格式、位定时和报文对象机制后,才能进一步理解AURIX CAN驱动中的中断处理、FIFO管理和总线异常恢复策略。这些基础直接决定通信的实时性与可靠性。