第2章 CAN总线基础:从起源到实战

好,咱们开始聊CAN总线。说实话,这玩意儿在车载网络里,就像人的脊柱一样重要。我入行那会儿,第一个接触的就是CAN,一晃十几年过去了,它依然是车载网络的中流砥柱。

2.1 CAN总线起源与特点

CAN总线,全称Controller Area Network,控制器局域网。上世纪80年代,德国博世公司为了解决汽车里线束太多、太重的问题,搞出了这个东西。你想想看,那时候一辆豪华车里的线束,拉出来能有几公里长,又重又难维护。

CAN总线的设计初衷很朴素:用两根线,把车上所有的电子控制单元(ECU)串起来。大家共用一条“高速公路”,谁有话要说,就在路上喊一嗓子。这个想法在当时相当超前。

它的几个核心特点,我简单列一下:

  • 多主站通信:任何节点都可以主动发消息,不需要等主机点名。这在实时性要求高的场景下特别有用。
  • 实时性强:消息的优先级通过ID来区分,优先级高的消息,总线访问延迟有保障。
  • 可靠性高:有完善的错误检测机制,包括CRC校验、位填充、格式检查等。我在项目里见过,哪怕线束被老鼠咬了一口,CAN总线依然能顽强工作。
  • 成本低:两根双绞线,一个收发器芯片,成本控制得死死的。

我个人习惯:在选型时,如果系统对实时性和可靠性要求极高,比如动力系统、安全气囊,CAN总线是首选。但如果只是传个车窗升降信号,用LIN总线更划算。

2.2 CAN总线物理层

物理层,说白了就是信号怎么在线上跑。CAN总线用两根线:CAN_H(高线)和CAN_L(低线)。它采用差分信号传输,这是抗干扰的关键。

2.2.1 差分信号

为什么用差分信号?我举个例子。假设你在车里,旁边有大功率电机在转,电磁干扰很强。如果只用一根线传信号,干扰一上来,信号就变了。但差分信号不一样:

  • CAN_H和CAN_L上的电压是相反的
  • 接收端只看两者的差值:V_diff = CAN_H - CAN_L
  • 干扰同时作用在两根线上,差值基本不变

说白了,就是“共模抑制”。干扰是共模的,信号是差模的。这个设计,让CAN总线能在发动机舱那种恶劣电磁环境下稳定工作。我记得有一次,客户抱怨说某个节点偶尔丢帧,查了半天发现是CAN_H和CAN_L线接反了。嗯,这种低级错误,新手很容易犯。

2.2.2 总线电平

CAN总线有两种逻辑状态:显性(Dominant)和隐性(Recessive)。

状态 CAN_H电压 CAN_L电压 差分电压
隐性(逻辑1) 2.5V 2.5V 0V
显性(逻辑0) 3.5V 1.5V 2V

这里有个关键点:显性位会覆盖隐性位。也就是说,如果两个节点同时发消息,一个发显性,一个发隐性,总线上最终呈现的是显性。这个特性,是后面仲裁机制的基础。

避坑指南:我曾经遇到过一个问题,总线一直处于显性状态,所有节点都发不了消息。查到最后,发现是某个节点的CAN_H对地短路了。所以,设计时一定要考虑总线故障保护。

2.3 CAN总线数据链路层

数据链路层,负责把数据组织成帧,然后送上总线。这里有两个核心内容:帧结构和仲裁机制。

2.3.1 帧结构

CAN总线上有四种帧类型:数据帧、远程帧、错误帧、过载帧。咱们最常用的是数据帧。一个标准数据帧(CAN 2.0A)长这样:

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

我来拆解一下:

  • SOF(帧起始):一个显性位,告诉所有节点“我要发消息了”。
  • ID(标识符):11位,用来标识消息的优先级。数值越小,优先级越高。
  • RTR(远程发送请求):数据帧里是显性,远程帧里是隐性。
  • DLC(数据长度码):4位,表示数据段有多少字节。范围0-8。
  • 数据段:0到8个字节,这就是你要传的实际数据。
  • CRC(循环冗余校验):15位校验码,保证数据完整性。
  • ACK(应答):接收节点如果正确收到,会在这一位发显性,告诉发送方“我收到了”。
  • EOF(帧结束):7个隐性位,表示帧结束。

你可能会问:为什么数据段最多只有8个字节?嗯,这是为了确保实时性。数据包短,传输时间就短,高优先级的消息就能更快抢到总线。在动力系统里,一个发动机转速信号,4个字节就够了。

2.3.2 仲裁机制

仲裁,说白了就是“抢总线”。多个节点同时发消息时,谁优先级高,谁先发。

过程是这样的:

  1. 所有想发消息的节点,同时从SOF位开始发送。
  2. 在ID段,每个节点逐位发送自己的ID。
  3. 如果一个节点发送了隐性位(1),但检测到总线上是显性位(0),说明有更高优先级的节点在发消息。这个节点立刻退出,转为接收模式。
  4. 最后,ID最小的节点赢得仲裁,继续发送剩余的数据。

这个机制,保证了总线访问的确定性。不会出现以太网那种“碰撞-重传”的随机延迟。你想想看,在刹车系统里,如果消息延迟不确定,那后果不堪设想。

注意:仲裁机制依赖于物理层的“显性覆盖隐性”特性。所以,总线上的终端电阻(120欧姆)必须正确安装。我见过一个项目,终端电阻没焊好,导致信号反射,仲裁失败,整个网络乱成一锅粥。

好了,CAN总线的基础就聊到这儿。下一章,咱们会深入CAN的更高层协议,比如CANopen和J1939。这些东西在实际项目中,比裸CAN好用得多。