第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总线的精髓。说白了,就是多个节点同时发送时,谁优先级高谁先发。

仲裁规则:

  1. 所有节点同时发送SOF(显性位),同步开始
  2. 逐位比较ID,从最高位开始
  3. 显性位(0)优先级高于隐性位(1)
  4. 发送隐性位但读到显性位的节点,立即退出仲裁
  5. 胜出的节点继续发送剩余帧

你想想看,为什么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优先级最高,哪些节点最可能成为攻击目标。这是入门车载安全的第一步。