1. CAN总线基础回顾:物理层特性、数据链路层帧结构、CAN 2.0与CAN FD的区别

各位同学,咱们今天正式开课。做嵌入式Linux的CAN开发,说白了就是跟一堆电平和数据帧打交道。我见过不少工程师,上来就调SocketCAN的过滤ID,结果总线死活不通——最后发现连CAN 2.0和CAN FD的帧格式都没搞明白。所以第一章,咱们先把地基打牢。

1.1 物理层特性:差分信号与总线电平

CAN总线的物理层,核心就一句话:靠两根线的电压差传数据。这两根线叫CAN_H和CAN_L,平时都稳定在2.5V左右。当总线要发“显性”位时,CAN_H拉到3.5V,CAN_L降到1.5V,差分电压2V。发“隐性”位时,两根线都回到2.5V,差分电压0V。

关键点:显性位会覆盖隐性位。这就是CAN总线仲裁的基础——谁先发显性位,谁就赢得总线控制权。

我在一个车载项目中遇到过这样的坑:总线终端电阻没焊好,导致信号反射严重,通信时好时坏。后来用示波器一抓,波形上全是振铃。所以记住:CAN总线两端必须各接一个120Ω终端电阻,这是硬规矩。

参数 高速CAN (ISO 11898-2) 低速CAN (ISO 11898-3)
最大速率 1 Mbps 125 kbps
总线长度 40m @ 1Mbps 500m @ 125kbps
终端电阻 120Ω × 2 无(或高阻)
显性电平 CAN_H=3.5V, CAN_L=1.5V CAN_H=5V, CAN_L=0V

个人经验:调试时先用万用表测CAN_H和CAN_L对地电压。如果两根线都是2.5V左右,说明总线处于隐性状态,节点没在发数据。如果CAN_H偏高、CAN_L偏低,说明有节点在发显性位。这个习惯帮我快速定位过好几次总线“静默”故障。

1.2 数据链路层帧结构:标准帧与扩展帧

CAN的数据链路层定义了5种帧类型,咱们最常用的是数据帧和远程帧。数据帧长这样:

SOF | 仲裁场 | 控制场 | 数据场 | CRC场 | ACK场 | EOF

仲裁场里放的就是ID。标准帧ID是11位,扩展帧ID是29位。你想想看,11位最多2048个ID,29位能到5亿多。现在车上的ECU越来越多,扩展帧基本是标配了。

我记得刚入行时,有个同事把标准帧和扩展帧的ID混在一起用,结果过滤规则怎么配都不对。后来查手册才发现:标准帧和扩展帧在总线上的优先级不同——标准帧的IDE位是显性,扩展帧的IDE位是隐性,所以标准帧永远比扩展帧优先。

字段 标准帧 (11位ID) 扩展帧 (29位ID)
SOF 1位显性 1位显性
仲裁场 12位 (ID+IDE+RTR) 32位 (ID+SRR+IDE+ID+RTR)
控制场 6位 (IDE+r0+DLC) 6位 (r1+r0+DLC)
数据场 0~8字节 0~8字节
CRC场 15位CRC + 1位界定符 15位CRC + 1位界定符
ACK场 2位 2位
EOF 7位隐性 7位隐性

避坑指南:我曾经在一个项目中,用SocketCAN的CAN_RAW协议发扩展帧,但忘记设置CAN_EFF_FLAG标志位。结果内核把29位ID当成11位ID解析,数据全乱了。记住:发扩展帧时,ID必须与CAN_EFF_FLAG做或运算。

1.3 CAN 2.0与CAN FD的区别

CAN FD是CAN 2.0的升级版,主要解决两个痛点:速率不够快和数据量不够大。CAN 2.0最多8字节数据,速率最高1Mbps。CAN FD呢?数据场能到64字节,速率能到8Mbps甚至更高。

为什么会这样?因为CAN FD在数据场部分用了更快的位时序。仲裁场还是原来的速率,保证兼容性;但一进数据场,立马切换到高速模式。这个切换由FDF位控制。

核心差异:CAN FD的帧格式多了FDF位、BRS位和ESI位。FDF位标识这是FD帧还是普通帧;BRS位控制是否切换高速率;ESI位表示发送节点的错误状态。

我建议你在选型时这样判断:如果项目只需要传传感器状态、开关信号这种小数据,CAN 2.0完全够用。但如果要传固件升级包、高精度地图数据,那就得上CAN FD。不过要注意:CAN FD不能和CAN 2.0混用在同一总线上,除非所有节点都支持FD。

对比项 CAN 2.0 CAN FD
最大数据长度 8字节 64字节
最大速率 1 Mbps 8 Mbps+
帧格式 标准/扩展 标准/扩展 + FD控制位
兼容性 所有CAN节点 仅CAN FD节点
应用场景 传统车载网络 高带宽、大数据量场景

个人建议:如果你的MCU支持CAN FD,但外设还是CAN 2.0,可以在初始化时把CAN FD模式关掉,降级成普通CAN用。这样既兼容旧设备,又保留了未来升级的可能。

1.4 知识体系总览

下面这张图把本章的核心知识点串起来了。从物理层的差分信号,到数据链路层的帧结构,再到CAN 2.0和CAN FD的演进关系,一目了然。

CAN总线知识体系总览 物理层 差分信号 · 终端电阻 数据链路层 帧结构 · 仲裁 · 错误检测 协议版本 CAN 2.0 vs CAN FD CAN_H / CAN_L 差分电压2V 终端电阻 120Ω × 2 标准帧 11位ID 扩展帧 29位ID CAN 2.0 8字节 · 1Mbps CAN FD 64字节 · 8Mbps 核心要点 物理层决定通信可靠性 · 数据链路层决定帧格式 · 协议版本决定性能上限

嗯,到这里第一章的内容就差不多了。物理层的差分信号和终端电阻是硬件基础,数据链路层的帧结构是软件解析的关键,CAN 2.0和CAN FD的差异决定了你的系统能跑多快、传多少。这些概念后面讲SocketCAN过滤机制时都会反复用到,所以务必吃透。