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 2.0和CAN FD的差异决定了你的系统能跑多快、传多少。这些概念后面讲SocketCAN过滤机制时都会反复用到,所以务必吃透。