4、CAN FD帧格式详解:标准帧与扩展帧、控制位、数据场长度编码、填充规则
CAN FD(CAN with Flexible Data-rate)协议在经典CAN 2.0的基础上,对帧格式进行了深度扩展与重构。理解CAN FD帧格式是进行总线设计、报文解析、故障诊断和性能优化的基础。本章将围绕CAN FD帧的两种格式(标准帧与扩展帧)、控制位(FDF、BRS、ESI)的语义、数据场长度编码(DLC)的扩展规则以及位填充(Bit Stuffing)机制进行系统拆解,并结合实际工程案例说明如何正确配置与解析CAN FD报文。
4.1 标准帧与扩展帧的格式差异
核心原理:CAN FD继承了经典CAN的两种帧格式,但对其中的控制位进行了重新定义。标准帧(Base Format)使用11位标识符(ID),扩展帧(Extended Format)使用29位标识符(由11位基本ID和18位扩展ID组成)。在CAN FD中,IDE位(Identifier Extension)用于区分两种格式:IDE=0表示标准帧,IDE=1表示扩展帧。与经典CAN不同,CAN FD帧中RTR位(Remote Transmission Request)必须为显性(0),因为CAN FD不支持远程帧。
判断方法:解析CAN FD报文时,首先检查FDF位(Flexible Data-rate Format)。若FDF=1,则确认这是CAN FD帧;随后检查IDE位判断是标准帧还是扩展帧。在标准帧中,IDE位于RTR之后;在扩展帧中,SRR(Substitute Remote Request)位替代了标准帧中的RTR位置,且SRR必须为隐性(1),随后是IDE位(必须为1)。
| 特征 | 标准帧 (Base Format) | 扩展帧 (Extended Format) |
|---|---|---|
| 标识符长度 | 11位 (ID[10:0]) | 29位 (ID[28:0]) |
| 仲裁场宽度 | 12位 (ID + RTR) | 32位 (ID + SRR + IDE + RTR) |
| IDE位值 | 0 (显性) | 1 (隐性) |
| SRR位 | 不存在 | 1 (隐性),替代RTR位置 |
| 适用场景 | 简单网络、节点少 | 复杂网络、多ECU、需更多优先级 |
4.2 控制位详解:FDF、BRS、ESI
核心原理:CAN FD在控制场中引入了三个关键控制位,它们决定了帧的格式、速率切换和错误状态。
- FDF (Flexible Data-rate Format):位于IDE位之后。FDF=0表示经典CAN帧,FDF=1表示CAN FD帧。接收节点通过该位判断后续解析逻辑。
- BRS (Bit Rate Switch):位于FDF之后。BRS=1表示从BRS位之后(包括数据场和CRC场)切换到数据位速率(更高波特率)传输;BRS=0表示整个帧保持标称位速率。
- ESI (Error State Indicator):位于BRS之后。ESI=0表示发送节点处于Error Active状态;ESI=1表示发送节点处于Error Passive状态。接收节点可据此判断发送方的健康状态。
操作流程:在配置CAN FD控制器时,需在报文对象中显式设置这些控制位。例如,在NXP S32K系列或Infineon AURIX系列中,通过寄存器FDCTRL和报文缓冲区中的FDF/BRS位域进行配置。发送时,硬件自动填充这些位;接收时,硬件自动解析并更新状态。
4.3 数据场长度编码(DLC)扩展规则
核心原理:经典CAN的DLC为4位,只能表示0~8字节。CAN FD保留了4位DLC,但重新定义了9~15的编码含义,使其能够表示最多64字节的数据场。具体映射关系如下:
| DLC值 (十进制) | DLC二进制 | 数据场长度 (Bytes) | 说明 |
|---|---|---|---|
| 0~8 | 0000~1000 | 0~8 | 与经典CAN完全一致 |
| 9 | 1001 | 12 | 跳过9~11 |
| 10 | 1010 | 16 | 跳过13~15 |
| 11 | 1011 | 20 | 跳过17~19 |
| 12 | 1100 | 24 | 跳过21~23 |
| 13 | 1101 | 32 | 跳过25~31 |
| 14 | 1110 | 48 | 跳过33~47 |
| 15 | 1111 | 64 | 最大长度 |
判断方法:解析时,不能简单地将DLC值直接乘以8。必须使用上述映射表。例如,DLC=13表示32字节,而非104字节。在编写解析代码时,建议使用查表法或switch-case结构,避免算术错误。
// 示例:DLC到字节长度的映射表(C语言)
static const uint8_t dlc_to_len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64};
uint8_t data_len = dlc_to_len[frame->dlc];
4.4 填充规则(Bit Stuffing)与CRC保护
核心原理:CAN FD对位填充规则进行了差异化处理。在仲裁段、控制段(直到BRS位之前)以及CRC场(如果BRS=0),仍然采用经典CAN的填充规则:每连续5个相同极性位后,插入1个反极性位。但在数据场和CRC场(当BRS=1时),不进行位填充。这一设计是为了提高数据场的传输效率,因为填充位会占用额外的位时间,在高速率下会显著降低有效吞吐量。
操作流程:发送节点硬件自动完成填充;接收节点硬件自动去填充。对于不支持CAN FD的经典CAN控制器,如果收到FDF=1的帧,会因无法解析而报错。因此,在混合网络中,必须确保CAN FD帧不会发送到经典CAN节点。
4.5 案例闭环:CAN FD报文解析与错误排查
背景与约束:某工业控制器使用CAN FD通信,标称位速率500 kbps,数据位速率2 Mbps。现场反馈偶发通信超时,且错误计数器持续增加。
初始现象:使用CANalyzer抓取总线报文,发现部分报文显示“CRC Error”和“Form Error”。进一步分析,错误帧均出现在DLC=15(64字节)且BRS=1的报文中。
关键输入数据:通过示波器测量,发现数据场部分的位时间约为500 ns(对应2 Mbps),但部分位的边沿出现明显抖动,且幅值低于200 mV(正常应为2V左右)。
分析判断过程:初步怀疑是信号完整性问题。由于数据场不填充,连续长串的相同位(如64字节全为0x00)会导致信号长时间保持低电平,直流分量增大,可能引起共模电压漂移。此外,2 Mbps速率下,线缆长度超过40 cm,未加终端电阻匹配,导致反射。
实际操作步骤:
- 检查终端电阻:在总线两端各并联120Ω电阻,确保等效阻抗60Ω。
- 缩短线缆长度至20 cm以内,并采用双绞屏蔽线。
- 在CAN FD收发器(如TJA1044)的TXD引脚串联22Ω电阻,抑制振铃。
- 修改发送报文,将全0x00数据改为伪随机数据,验证是否为直流偏置问题。
结果对比:修改后,错误帧消失,错误计数器归零。对比修改前后的眼图,数据场部分的眼高从150 mV提升至1.8V,眼宽从300 ns提升至450 ns。
风险与代价:缩短线缆长度可能限制物理布局;串联电阻会增加上升/下降时间,但在此速率下影响可忽略。
复盘经验:CAN FD的高速率对信号完整性更敏感,尤其是数据场不填充时,长连续位序列会加剧直流偏置。设计时需预留足够的噪声裕量,并优先使用短截线拓扑。
4.6 总结与自检清单
本章详细解析了CAN FD帧格式的核心要素。以下为工程实践中的自检清单:
- 确认FDF位是否为1,以区分CAN FD与经典CAN。
- 根据IDE位选择标准帧或扩展帧解析逻辑。
- 检查BRS位,确定数据场是否切换速率。
- 使用DLC映射表计算实际数据长度,而非直接乘以8。
- 在混合网络中,确保CAN FD报文不会发送到经典CAN节点。
- 验证CRC计算范围是否包含填充位(BRS=0时)。
- 高速率下,检查信号完整性和终端匹配。