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.5V2.5V0V
显性(逻辑0)3.5V1.5V2V

嗯,这里要注意:不同标准(比如高速CAN、低速CAN)的电平值略有差异,但原理是一样的。我在项目中遇到过一个问题——某款ECU在低温环境下CAN_H电压漂到了2.7V,导致隐性状态被误判为显性,总线直接锁死。后来查出来是终端电阻匹配出了问题。

避坑指南:我曾经因为终端电阻没焊好,导致总线信号反射严重,通信时好时坏。CAN总线两端必须各接一个120Ω电阻,千万别省。

2.2 CAN数据帧格式

CAN协议定义了四种帧类型:数据帧、远程帧、错误帧、过载帧。我们最常用的是数据帧。数据帧又分标准帧(11位ID)和扩展帧(29位ID)。

标准数据帧的结构,我画个图给你看:

CAN标准数据帧结构 SOF 11位ID (仲裁场) RTR IDE r0 DLC 数据场 (0~8字节) CRC ACK EOF 帧起始 最多8字节 帧结束 各字段说明 • SOF: 1位显性,同步所有节点 • 仲裁场: ID + RTR位,决定总线访问优先级 • 控制场: IDE + r0 + DLC,标识帧类型和数据长度

每个字段都有它的作用。我重点说几个:

  • 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小的先发。具体怎么实现的?靠的是“线与”特性。

我画个流程图帮你理解:

CAN总线仲裁流程 节点A ID = 0x123 节点B ID = 0x456 同时发送SOF + ID位 逐位比较ID 节点A获胜,继续发送 节点B失败,转为接收

具体过程是这样的:

  1. 两个节点同时发送SOF,总线进入同步状态。
  2. 接着发送ID位。从最高位(MSB)开始,逐位比较。
  3. 如果某个节点发送的是隐性位(1),但总线上读到的是显性位(0),说明有更高优先级的节点在发。这个节点立刻退出,转为接收模式。
  4. ID小的节点(显性位更多)最终赢得仲裁,继续发送剩余数据。

核心要点:仲裁过程不会破坏数据。因为赢得仲裁的节点继续正常发送,输掉的节点只是停止发送,不会产生错误帧。这就是CAN总线“无损仲裁”的由来。

我在项目中遇到过一个问题:某ECU的CAN ID设成了0x000,结果它一上电就把总线占死了,其他节点根本发不出去。后来我们规定,保留ID 0x000用于诊断工具,普通节点从0x001开始分配。

避坑指南:我曾经见过一个团队,把两个节点的ID设成一样的。结果两个节点同时发送时,仲裁无法区分,数据场冲突导致CRC错误,总线反复重发。记住:同一总线上,每个数据帧的ID必须唯一。

2.4 小结

这一章我们聊了CAN协议的三个基础:

  • 物理层:差分信号、显性/隐性电平、终端电阻。这些是硬件设计的基础,搞错了通信就起不来。
  • 数据帧格式:SOF、仲裁场、控制场、数据场、CRC、ACK、EOF。每个字段都有它的设计意图,理解透了才能做好协议栈配置。
  • 仲裁机制:ID越小优先级越高,无损仲裁是CAN总线的灵魂。设计网络时,一定要合理规划ID分配。