1、CAN总线基础回顾:从起源到仲裁机制
大家好,我是你们的讲师。今天咱们正式开讲CAN FD与经典CAN的差异。不过在深入之前,我觉得有必要先把经典CAN总线的基础拉一遍。你想想看,如果地基没打牢,后面讲CAN FD那些新特性,你听着肯定会发懵。
我个人习惯是,讲任何新技术之前,先带大家把老技术的关键点过一遍。这样对比起来,你才知道CAN FD到底「新」在哪里。
1.1 CAN协议的起源与发展
CAN总线,全称Controller Area Network。上世纪80年代,由德国Bosch公司开发。初衷很简单——解决汽车内部线束太多的问题。
我记得刚入行那会儿,拆过一辆老款车的门板。好家伙,里面密密麻麻全是线。每个传感器、每个执行器都要单独拉线。不仅重,而且故障率极高。CAN的出现,说白了就是让所有节点共用两根线通信。
发展历程大致如下:
- 1986年:Bosch在SAE大会上正式发布CAN协议
- 1991年:发布CAN 2.0规范,分为A和B两个部分
- 1993年:ISO 11898标准发布,CAN成为国际标准
- 2012年:Bosch发布CAN FD 1.0,这是后话了
这里有个坑,我提醒一下。很多人以为CAN 2.0A和2.0B是两个不同的协议。其实不是。2.0A定义的是11位标识符的标准帧,2.0B在A的基础上增加了29位标识符的扩展帧。两者完全兼容。
核心要点:CAN 2.0B是向下兼容2.0A的。你可以在同一个网络上混用标准帧和扩展帧,仲裁机制会自动处理优先级。
1.2 CAN 2.0A/B标准帧与扩展帧结构
好,咱们来看看帧结构。这是理解CAN协议的基础,也是后面理解CAN FD改进点的关键。
先看标准帧(CAN 2.0A):
SOF | 11位标识符 | RTR | IDE | r0 | DLC | 0~8字节数据 | CRC | ACK | EOF | IFS
再看扩展帧(CAN 2.0B):
SOF | 11位标识符 | SRR | IDE | 18位扩展标识符 | RTR | r1 | r0 | DLC | 0~8字节数据 | CRC | ACK | EOF | IFS
你可能会问:为什么要有两种帧?
嗯,这里有个历史原因。早期CAN网络节点少,11位标识符(最多2048个)够用了。后来汽车电子化程度越来越高,ECU数量暴增,11位不够用了。Bosch就推出了29位扩展帧。
我在项目中遇到过一种情况:某个供应商的ECU只支持标准帧,另一个供应商的只支持扩展帧。两者要共存于同一网络。怎么办?其实只要把扩展帧的IDE位设为1,标准帧的IDE位设为0,仲裁时标准帧优先级永远高于扩展帧。这个设计很巧妙。
个人经验:设计网络时,我建议尽量统一使用标准帧或扩展帧。混用虽然技术上可行,但排查问题时容易把人绕晕。我曾经因为一个IDE位配置错误,花了整整两天才找到问题。
1.3 CAN总线物理层特性
物理层这块,咱们重点说差分信号和总线电平。
CAN总线使用两根线:CAN_H和CAN_L。信号通过两根线的电压差来传输。为什么用差分?抗干扰能力强。你想想看,如果外界有电磁干扰,两根线上受到的干扰几乎相同,电压差基本不变。这就是差分信号的核心优势。
总线电平有两种状态:
| 状态 | CAN_H电压 | CAN_L电压 | 电压差 |
|---|---|---|---|
| 显性(Dominant) | 3.5V | 1.5V | 2V |
| 隐性(Recessive) | 2.5V | 2.5V | 0V |
显性电平对应逻辑0,隐性电平对应逻辑1。注意,这是CAN协议的规定,和常规思维可能相反。
我记得有一次调试,示波器上看到CAN_H和CAN_L的波形都正常,但总线就是通信失败。后来发现是终端电阻没接对。CAN总线两端各需要120Ω的终端电阻,用来消除信号反射。少了它,高速通信时波形会严重畸变。
避坑指南:我曾经见过一个项目,工程师把终端电阻焊在了PCB中间位置,而不是总线两端。结果通信距离超过2米就开始丢包。记住,终端电阻一定要放在总线物理拓扑的最远端。
1.4 CAN总线仲裁机制(CSMA/CA)
最后,咱们聊聊仲裁。这是CAN协议最精妙的设计之一。
CAN总线采用CSMA/CA(载波监听多路访问/冲突避免)机制。说白了,就是多个节点可以同时发送数据,但通过标识符的优先级来决定谁「赢」。
具体怎么仲裁?
- 所有节点先监听总线,空闲了才能发
- 发送时,每个节点逐位比较自己的标识符和总线上的电平
- 如果某个节点发送了隐性位(1),但总线上是显性位(0),说明有更高优先级的节点在发,自己立即退出
- 标识符数值越小,优先级越高
你可能会问:如果两个节点同时发送相同标识符怎么办?嗯,这种情况极少发生。如果真的发生了,数据段完全一致,不会冲突。如果数据段不同,那说明设计有问题——同一标识符不应该被多个节点用于发送不同数据。
我在项目中遇到过仲裁相关的问题。有一次,一个电机控制节点总是抢不到总线,导致控制指令延迟。查了半天,发现它的标识符设成了0x7FF,这是标准帧里优先级最低的。后来改成0x001,问题解决。
关键理解:CAN的仲裁机制是非破坏性的。优先级低的节点自动退出,高优先级的节点不受影响继续发送。这意味着总线利用率很高,不会像以太网那样发生碰撞后需要重传。
好了,这一章的基础内容就到这里。下一章咱们正式进入CAN FD的世界,看看它在经典CAN的基础上做了哪些改进。到时候你会发现,很多设计思路其实都源于我们今天讲的基础知识。