2. AUTOSAR基础
各位同学,今天我们来聊聊CAN总线。说实话,CAN协议在汽车电子里已经存在了几十年,但它依然是目前车载网络的中流砥柱。我入行那会儿,第一个项目就是调试CAN通信,当时被物理层的一些细节坑得不轻。所以这一章,我会把CAN总线最核心的三个部分——物理层、数据帧格式、仲裁机制——掰开揉碎了讲清楚。
2.1 CAN总线物理层
CAN总线物理层,说白了就是信号怎么在线上跑。它用的是差分信号传输,两根线:CAN_H和CAN_L。为什么用差分?抗干扰能力强。你想想看,发动机舱里电磁环境那么恶劣,单端信号早就被噪声淹没了。
关键点:CAN总线有两种逻辑状态——显性(Dominant)和隐性(Recessive)。显性对应逻辑0,隐性对应逻辑1。显性电平会覆盖隐性电平,这是后面仲裁机制的基础。
具体电平值,我习惯记成下面这个表:
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 |
|---|---|---|---|
| 隐性(逻辑1) | 2.5V | 2.5V | 0V |
| 显性(逻辑0) | 3.5V | 1.5V | 2V |
嗯,这里要注意:不同标准(比如高速CAN、低速CAN)的电平值略有差异,但原理是一样的。我在项目中遇到过一个问题——某款ECU在低温环境下CAN_H电压漂到了2.7V,导致隐性状态被误判为显性,总线直接锁死。后来查出来是终端电阻匹配出了问题。
避坑指南:我曾经因为终端电阻没焊好,导致总线信号反射严重,通信时好时坏。CAN总线两端必须各接一个120Ω电阻,千万别省。
2.2 CAN数据帧格式
CAN协议定义了四种帧类型:数据帧、远程帧、错误帧、过载帧。我们最常用的是数据帧。数据帧又分标准帧(11位ID)和扩展帧(29位ID)。
标准数据帧的结构,我画个图给你看:
每个字段都有它的作用。我重点说几个:
- SOF(帧起始):1位显性,用于同步所有节点的时钟。没有SOF,整个总线就不知道什么时候开始收数据。
- 仲裁场(ID + RTR):标准帧11位ID,扩展帧29位ID。ID越小,优先级越高。RTR位区分数据帧和远程帧。
- 控制场(IDE + r0 + DLC):IDE标识是标准帧还是扩展帧。DLC告诉接收方数据场有几个字节。
- 数据场:0~8字节。我见过有人问为什么是8字节?因为早期CAN总线带宽有限,8字节是性能和实时性的折中。
- CRC场:15位CRC校验 + 1位CRC界定符。用于检测传输错误。
- ACK场:发送方发隐性位,接收方如果正确收到就拉成显性。这是CAN总线特有的“集体确认”机制。
- EOF(帧结束):7位隐性位,表示帧结束。
个人经验:我建议你在调试CAN通信时,先用示波器抓一下SOF和ACK位。如果看不到ACK显性位,说明总线上没有其他节点在收你的数据——要么节点没配置好,要么终端电阻有问题。
2.3 CAN总线仲裁机制
仲裁机制是CAN总线最巧妙的设计之一。为什么需要仲裁?因为CAN总线是多主总线,任何节点都可以随时发送。如果两个节点同时发,谁先发?
答案是:ID小的先发。具体怎么实现的?靠的是“线与”特性。
我画个流程图帮你理解:
具体过程是这样的:
- 两个节点同时发送SOF,总线进入同步状态。
- 接着发送ID位。从最高位(MSB)开始,逐位比较。
- 如果某个节点发送的是隐性位(1),但总线上读到的是显性位(0),说明有更高优先级的节点在发。这个节点立刻退出,转为接收模式。
- ID小的节点(显性位更多)最终赢得仲裁,继续发送剩余数据。
核心要点:仲裁过程不会破坏数据。因为赢得仲裁的节点继续正常发送,输掉的节点只是停止发送,不会产生错误帧。这就是CAN总线“无损仲裁”的由来。
我在项目中遇到过一个问题:某ECU的CAN ID设成了0x000,结果它一上电就把总线占死了,其他节点根本发不出去。后来我们规定,保留ID 0x000用于诊断工具,普通节点从0x001开始分配。
避坑指南:我曾经见过一个团队,把两个节点的ID设成一样的。结果两个节点同时发送时,仲裁无法区分,数据场冲突导致CRC错误,总线反复重发。记住:同一总线上,每个数据帧的ID必须唯一。
2.4 小结
这一章我们聊了CAN协议的三个基础:
- 物理层:差分信号、显性/隐性电平、终端电阻。这些是硬件设计的基础,搞错了通信就起不来。
- 数据帧格式:SOF、仲裁场、控制场、数据场、CRC、ACK、EOF。每个字段都有它的设计意图,理解透了才能做好协议栈配置。
- 仲裁机制:ID越小优先级越高,无损仲裁是CAN总线的灵魂。设计网络时,一定要合理规划ID分配。