第2章:CAN总线基础:从物理层到仲裁机制
各位工程师朋友,今天我们来聊聊CAN总线的基础。说实话,CAN总线在车载网络里就像人的脊柱——它连接着各个电子控制单元,让它们能顺畅沟通。我做了这么多年车载安全,发现很多入侵检测的问题,根源都在于对CAN总线底层理解不够深。咱们今天就把这块硬骨头啃下来。
2.1 CAN协议物理层:信号怎么在线上跑
CAN总线物理层,说白了就是决定信号怎么在双绞线上传输的规则。它用的是差分信号,也就是CAN_H和CAN_L两根线。
关键点:
- 显性电平(Dominant):CAN_H比CAN_L高约2V,逻辑上代表"0"
- 隐性电平(Recessive):CAN_H和CAN_L电压接近,逻辑上代表"1"
- 总线空闲时:两根线电压都在2.5V左右,处于隐性状态
我个人的经验:有一次在实车调试时,发现CAN通信偶尔丢帧。查了半天,原来是CAN_H和CAN_L的绞距不够密,导致共模干扰过大。记住,双绞线每英寸至少绞3-4圈,这是血的教训。
物理层还有个重要参数——波特率。车载CAN通常用250kbps或500kbps。波特率越高,总线长度就得越短。你想想看,500kbps下总线长度最好不要超过40米,而250kbps可以到200米左右。
2.2 数据链路层:帧结构拆解
数据链路层负责把物理层的比特流组织成有意义的帧。CAN总线有四种帧类型,咱们一个一个说。
2.2.1 数据帧(Data Frame)
这是最常用的帧,用来传输实际数据。标准格式(11位ID)和扩展格式(29位ID)我都用过。结构如下:
SOF + 仲裁场 + 控制场 + 数据场 + CRC场 + ACK场 + EOF
各字段说明:
| 字段 | 长度 | 作用 |
|---|---|---|
| SOF(帧起始) | 1位 | 显性电平,同步所有节点 |
| 仲裁场 | 11位或29位 | 包含ID和RTR位,决定优先级 |
| 控制场 | 6位 | 包含IDE、保留位和DLC(数据长度) |
| 数据场 | 0-8字节 | 实际要传输的数据 |
| CRC场 | 16位 | 循环冗余校验,检测传输错误 |
| ACK场 | 2位 | 接收节点确认 |
| EOF | 7位 | 帧结束标志 |
避坑指南:我曾经在项目中遇到一个诡异问题——某个节点发送的数据帧DLC明明是8,但接收方只收到4个字节。后来发现是发送节点的DLC设置错误。记住,DLC必须与实际数据长度一致,否则接收方会截断数据。
2.2.2 远程帧(Remote Frame)
远程帧用来请求数据。它没有数据场,但其他字段和数据帧一样。RTR位在远程帧中为隐性(1),在数据帧中为显性(0)。
嗯,这里要注意:远程帧的ID必须和请求的数据帧ID相同。我见过有人把远程帧ID写错,结果总线上一堆节点都在响应错误的ID,那场面...你懂的。
2.2.3 错误帧(Error Frame)
当节点检测到总线错误时,会发送错误帧。它由两部分组成:
- 错误标志:6个连续的显性位(主动错误)或6个连续的隐性位(被动错误)
- 错误界定符:8个隐性位
错误帧是入侵检测的重要线索。我在做安全审计时,经常监控错误帧的数量——如果某个节点突然频繁发送错误帧,八成是被攻击了。
2.2.4 过载帧(Overload Frame)
过载帧用于在两次数据帧或远程帧之间提供额外延迟。它和错误帧结构类似,但触发条件不同:
- 接收节点内部条件未准备好
- 检测到显性位出现在间歇场
注意:过载帧不能由SOF触发。我曾经在调试时发现一个节点不断发送过载帧,导致总线吞吐量下降。查到最后,是那个节点的接收缓冲区太小,处理不过来。所以设计时一定要算好缓冲区大小。
2.3 CAN总线仲裁机制:谁先说话?
仲裁机制是CAN总线的精髓。说白了,就是多个节点同时发送时,谁优先级高谁先发。
仲裁规则:
- 所有节点同时发送SOF(显性位),同步开始
- 逐位比较ID,从最高位开始
- 显性位(0)优先级高于隐性位(1)
- 发送隐性位但读到显性位的节点,立即退出仲裁
- 胜出的节点继续发送剩余帧
你想想看,为什么ID越小优先级越高?因为ID越小,前面几位是0的概率越大,而0是显性位。所以ID=0x000的节点优先级最高,ID=0x7FF的节点优先级最低。
我建议:在设计CAN网络时,把关键控制信号(如刹车、转向)分配小ID,把非关键信号(如车窗、空调)分配大ID。这样即使总线负载高,关键信号也能优先通过。
仲裁机制还有个特点——非破坏性。也就是说,仲裁失败的节点不会损坏,只是默默退出发送,等总线空闲后再重试。这种机制保证了总线的可靠性。
实际案例:有一次我在测试一个ADAS系统,发现摄像头数据偶尔会丢失。抓包分析后发现,摄像头的ID是0x500,而另一个诊断工具的ID是0x100。当诊断工具频繁发送请求时,摄像头总是仲裁失败。解决方案很简单——把摄像头的ID改小到0x100以下,问题就解决了。
2.4 小结
CAN总线的基础知识就讲到这里。物理层决定了信号怎么传,数据链路层决定了数据怎么组织,仲裁机制决定了谁先说话。这三块是理解CAN安全的基础。下一章我们会深入CAN的帧过滤和错误处理机制,到时候再聊。
记住一句话:搞车载安全,不懂CAN底层就是纸上谈兵。我见过太多安全方案,因为忽略了物理层特性而失效。希望今天的分享对你有帮助。
课后练习:找一辆车的CAN总线日志,分析一下哪些ID优先级最高,哪些节点最可能成为攻击目标。这是入门车载安全的第一步。