一、CAN总线基础:CAN协议起源、物理层特性、数据帧结构

大家好,我是老李。做汽车电子这行十几年了,CAN总线可以说是我最熟悉的"老伙计"。今天咱们就来聊聊CAN总线的底子——它的起源、物理层长什么样,以及数据帧到底怎么组织的。

说实话,我刚入行那会儿,CAN总线还是个"新玩意儿"。现在呢?每辆车里少说几十个ECU,全靠它串起来。你想想看,没有CAN,汽车电子就是一堆孤岛。

1.1 CAN协议的起源——为什么会有它?

上世纪80年代,汽车越来越"聪明"。但问题来了:每个电子单元都自己拉一堆线,线束又重又贵,还容易出故障。

我记得当时有个项目,光车门上的线束就有30多根。开关个窗户,信号要绕一大圈。工程师们都在想:能不能用两根线,把所有设备串起来?

1983年,德国Bosch公司开始搞这个事。1986年,CAN(Controller Area Network)协议正式发布。说白了,就是给汽车电子装了个"共享电话线"——谁有话要说,就在线上喊一声,大家都能听到。

核心思想:多主机、广播式通信。任何节点都可以随时发送,不需要主节点调度。

后来ISO把它标准化了,就是ISO 11898。现在几乎所有汽车、工业设备都在用。我做过一个农机项目,拖拉机里也是CAN,可见它有多普及。

1.2 CAN总线物理层特性——两根线撑起一片天

物理层,说白了就是信号怎么在线上跑。CAN总线物理层有几个关键点,我一个个说。

1.2.1 差分信号传输

CAN用两根线:CAN_H和CAN_L。信号靠两根线的电压差来传递。

  • 显性电平(Dominant):CAN_H比CAN_L高2V左右。逻辑上代表"0"。
  • 隐性电平(Recessive):CAN_H和CAN_L电压相等(约2.5V)。逻辑上代表"1"。

为什么会用差分?抗干扰啊!我遇到过好几次,车间里电机一启动,单端信号就乱跳。但CAN总线纹丝不动。因为干扰同时作用在两根线上,电压差不变。

我的经验:布线时,CAN_H和CAN_L一定要绞在一起。绞得越密,抗干扰越好。我曾经见过一个项目,线没绞,结果通信老是丢包。绞了之后,问题全没了。

1.2.2 总线电平与终端电阻

CAN总线两端各需要接一个120Ω的终端电阻。为什么是120Ω?因为双绞线的特性阻抗大约就是120Ω。不接的话,信号会在末端反射,波形就乱了。

参数 高速CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
总线长度 ≤ 40 m @ 1 Mbps ≤ 500 m
终端电阻 120Ω(两端) 不需要
显性电平 CAN_H=3.5V, CAN_L=1.5V CAN_H=5V, CAN_L=0V

嗯,这里要注意:高速CAN和低速CAN的物理层不兼容。我见过有人把低速CAN节点接到高速总线上,结果通信时好时坏。排查了半天才发现是混用了。

1.2.3 总线拓扑与节点数

CAN总线是总线型拓扑,所有节点挂在两根线上。理论上最多可以挂110个节点,但实际中我建议别超过30个。为什么?节点多了,总线负载就高,实时性会下降。

我曾经做过一个项目,挂了40多个节点,结果总线利用率到了80%以上。优先级低的报文经常发不出去。后来只好拆成两路CAN。

1.3 CAN总线数据帧结构——报文长什么样?

数据帧是CAN通信的基本单位。标准格式(CAN 2.0A)有11位ID,扩展格式(CAN 2.0B)有29位ID。咱们先看标准格式。

1.3.1 标准数据帧结构

一个标准数据帧,由以下几个部分组成:

SOF | 11位ID | RTR | IDE | r0 | DLC | 数据段(0-8字节) | CRC | ACK | EOF

我来拆开讲:

  • SOF(Start of Frame):1位显性电平。告诉所有节点:"我要开始发了"。
  • ID(Identifier):11位。用来标识报文优先级。数值越小,优先级越高。
  • RTR(Remote Transmission Request):1位。显性表示数据帧,隐性表示远程帧。
  • IDE(Identifier Extension):1位。显性表示标准格式,隐性表示扩展格式。
  • r0:保留位,显性。
  • DLC(Data Length Code):4位。表示数据段有多少字节。范围0-8。
  • 数据段:0到8字节。真正要传的数据。
  • CRC(Cyclic Redundancy Check):15位CRC校验 + 1位隐性分隔符。
  • ACK(Acknowledge):2位。发送方发隐性,接收方在ACK Slot位拉成显性,表示收到了。
  • EOF(End of Frame):7位隐性电平。表示帧结束。

重点:ID决定了谁能抢到总线。我调试时经常用CAN分析仪看ID,数值小的报文总是先发。这就是CAN的"非破坏性逐位仲裁"机制。

1.3.2 扩展数据帧(CAN 2.0B)

扩展帧就是把11位ID扩展成29位。结构上多了SRR、IDE和18位扩展ID。

SOF | 11位基础ID | SRR | IDE | 18位扩展ID | RTR | r1 | r0 | DLC | 数据段 | CRC | ACK | EOF

SRR位替代了标准帧的RTR位。IDE位现在是隐性,表示这是扩展帧。

我个人习惯:能用标准帧就用标准帧。扩展帧虽然ID多,但帧长,总线利用率低。只有在节点特别多、ID不够用时才用扩展帧。

1.3.3 其他帧类型

除了数据帧,还有三种帧:

  • 远程帧:RTR位为隐性。用来请求对方发送数据。我很少用,因为大多数场景下,节点主动发数据就够了。
  • 错误帧:由6个显性位组成。任何节点检测到错误,就发错误帧,把总线"搞乱",让所有节点重发。
  • 过载帧:节点忙不过来时发,让对方等一等。

避坑指南:我曾经遇到过一个bug,某个节点老是发错误帧,把总线堵死了。查了半天,发现是它的晶振频率不准,导致位时序不对。所以,CAN节点的时钟精度一定要够,至少±1.5%以内。

1.4 位时序与同步——数据怎么在线上对齐?

CAN总线没有单独的时钟线。所有节点靠"位同步"来对齐时钟。每个位被分成4段:

  • 同步段(Sync_Seg):1个时间量子(Tq)。用于同步。
  • 传播段(Prop_Seg):1-8 Tq。补偿物理延迟。
  • 相位缓冲段1(Phase_Seg1):1-8 Tq。用于重同步。
  • 相位缓冲段2(Phase_Seg2):1-8 Tq。用于重同步。

采样点通常在Phase_Seg1和Phase_Seg2之间。我一般把采样点设在87.5%左右。这样抗干扰能力最强。

举个例子,1 Mbps速率下,一个位时间=1 μs。如果Tq=125 ns,那一个位就是8个Tq。分配成:Sync=1, Prop=3, Phase1=3, Phase2=1。采样点在87.5%处。

我的建议:设计CAN节点时,一定要算好位时序。用CAN分析仪看实际波形,确认采样点位置。我见过太多因为位时序不对导致的通信问题。

1.5 小结

好了,CAN总线的基础就这些。总结一下:

  • CAN起源于Bosch,解决汽车线束过多的问题。
  • 物理层用差分信号,抗干扰强。终端电阻不能少。
  • 数据帧有标准帧和扩展帧,ID决定优先级。
  • 位时序要算准,采样点位置很关键。

下一章,咱们聊CAN总线信号矩阵的设计方法。那才是真正干活用的东西。到时候我会拿一个实际项目中的矩阵来拆解,保证你听完就能上手。

嗯,今天就到这儿。有问题随时交流。