2、CAN总线基础:CAN总线物理层、数据链路层、帧结构及仲裁机制
各位同学,咱们今天聊聊CAN总线的基础。说实话,CAN总线在汽车电子里,就像人的神经系统一样重要。ESP、ABS、发动机、变速箱,哪个节点离得开它?我做了十几年汽车电子,跟CAN总线打交道的时间比跟家人还多。今天就把我这些年积累的干货,掰开了揉碎了讲给你们听。
2.1 物理层:信号怎么在线上跑
先看物理层。说白了,就是信号怎么在两根线上传输的。
CAN总线用两根线:CAN_H和CAN_L。它采用差分信号传输。什么意思呢?就是信号不是靠一根线对地电压,而是靠两根线之间的电压差。
显性电平(Dominant):CAN_H比CAN_L高2V左右,代表逻辑0。
隐性电平(Recessive):CAN_H和CAN_L电压相等(约2.5V),代表逻辑1。
为什么用差分?抗干扰能力强啊。我在一个项目中遇到过,发动机舱里电磁干扰特别大,单端信号根本没法看。换成CAN差分,稳得很。两根线受到的干扰几乎一样,差值不变,信号就保住了。
总线两端需要各接一个120Ω的终端电阻。这个千万别省。我记得有一次,一个同事调试CAN网络,怎么都通不了。我过去一看,终端电阻没焊。加上去,立马好了。终端电阻的作用是消除信号反射,保证通信质量。
2.2 数据链路层:数据怎么组织
物理层搞定了,咱们看看数据链路层。这一层定义了数据怎么打包、怎么传输。
CAN总线用的是CSMA/CA协议。全称是载波监听多路访问/冲突避免。你想想看,总线上那么多节点,大家都在一条线上发数据,怎么保证不乱?
答案是:先听后说,边说边听。
- 先听后说:发数据前,先监听总线是否空闲。空闲了才能发。
- 边说边听:发数据的同时,也在监听总线。如果发现别人也在发,就启动仲裁机制。
嗯,这里要注意,CAN总线没有主从之分。所有节点地位平等。谁想发就发,靠仲裁决定谁赢。
2.3 帧结构:数据包长什么样
接下来是重头戏——帧结构。CAN总线有四种帧:数据帧、远程帧、错误帧、过载帧。咱们最常用的是数据帧。
一个标准数据帧(11位ID)长这样:
SOF + 11位ID + RTR + IDE + r0 + 4位DLC + 0~8字节数据 + 15位CRC + CRC界定符 + ACK + ACK界定符 + EOF
看着复杂?我给你们拆开讲:
| 字段 | 位数 | 说明 |
|---|---|---|
| SOF | 1 | 帧起始,显性电平,告诉总线我要发数据了 |
| ID | 11(标准)或29(扩展) | 标识符,决定优先级,越小优先级越高 |
| RTR | 1 | 远程帧标志,0是数据帧,1是远程帧 |
| DLC | 4 | 数据长度,0~8字节 |
| Data | 0~64 | 实际数据,最多8字节 |
| CRC | 15 | 循环冗余校验,检测传输错误 |
| ACK | 2 | 应答位,接收节点确认收到 |
| EOF | 7 | 帧结束,隐性电平 |
我个人习惯,在调试时先看ID和DLC。ID错了,优先级就乱了。DLC错了,数据解析就全错。有一次,一个供应商发来的报文DLC总是写8,实际只用了2个字节。我查了半天,才发现是DLC没更新。你说坑不坑?
2.4 仲裁机制:谁先说话
仲裁机制是CAN总线的精髓。多个节点同时发数据,怎么决定谁先发?
答案是:靠ID仲裁。ID越小,优先级越高。
具体怎么仲裁?我举个例子:
- 节点A发ID=0x123(二进制:0001 0010 0011)
- 节点B发ID=0x456(二进制:0100 0101 0110)
两个节点同时发SOF,都是显性电平,没问题。然后发ID的第一位:
- A发0(显性),B发0(显性)→ 继续
- A发0(显性),B发1(隐性)→ A赢了,B退出
为什么?因为显性电平会覆盖隐性电平。B发现自己发的隐性被拉成显性,就知道有人优先级更高,乖乖退出发送,转为接收。
避坑指南:我曾经在项目中遇到过一个问题,两个节点ID相同,结果总线上一直报错。为什么?因为ID相同,仲裁分不出胜负,数据就冲突了。所以,每个节点的ID必须唯一。这是基本规则。
你想想看,这个机制多巧妙。不需要主节点,不需要轮询,谁想发就发,靠ID决定优先级。实时性特别好。ESP这种对实时性要求高的系统,用CAN总线再合适不过了。
2.5 实际应用中的注意事项
讲完理论,说说实际中要注意的:
- 波特率要一致:总线上所有节点的波特率必须相同。常见的有125kbps、250kbps、500kbps。ESP系统一般用500kbps。
- 总线长度有限制:波特率越高,总线长度越短。500kbps时,总线长度一般不超过100米。车上用足够了。
- 节点数量有限制:理论上最多110个节点,实际建议不超过30个。节点太多,总线负载会很高,影响实时性。
- 终端电阻不能省:再次强调,两端各一个120Ω电阻。少了信号反射,多了信号衰减。
警告:千万不要在CAN_H和CAN_L之间直接短路测试。我见过有人用万用表直接量CAN_H和CAN_L之间的电阻,结果把收发器烧了。正确的做法是断电后测量终端电阻。
好了,CAN总线的基础就讲到这里。下一章咱们聊聊ESP系统中CAN报文的具体定义和解析方法。到时候我会拿一个真实的ESP报文出来,手把手教你们怎么读、怎么解析。敬请期待。
公众号:蓝海资料掘金营,微信deep3321