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 实际应用中的注意事项

讲完理论,说说实际中要注意的:

  1. 波特率要一致:总线上所有节点的波特率必须相同。常见的有125kbps、250kbps、500kbps。ESP系统一般用500kbps。
  2. 总线长度有限制:波特率越高,总线长度越短。500kbps时,总线长度一般不超过100米。车上用足够了。
  3. 节点数量有限制:理论上最多110个节点,实际建议不超过30个。节点太多,总线负载会很高,影响实时性。
  4. 终端电阻不能省:再次强调,两端各一个120Ω电阻。少了信号反射,多了信号衰减。

警告:千万不要在CAN_H和CAN_L之间直接短路测试。我见过有人用万用表直接量CAN_H和CAN_L之间的电阻,结果把收发器烧了。正确的做法是断电后测量终端电阻。

好了,CAN总线的基础就讲到这里。下一章咱们聊聊ESP系统中CAN报文的具体定义和解析方法。到时候我会拿一个真实的ESP报文出来,手把手教你们怎么读、怎么解析。敬请期待。


公众号:蓝海资料掘金营,微信deep3321