1. CAN协议基础:CAN总线起源、物理层特性与拓扑结构

各位同学,咱们今天正式开讲CAN总线。说实话,我每次带新人入门,都会从这一章开始。为什么?因为CAN总线是车载网络里最基础、也最成熟的技术。你想想看,一辆车上少说几十个ECU,它们怎么通信?靠的就是CAN。

我最早接触CAN总线是在2008年,那时候做车身控制模块。当时被一个总线信号干扰问题折腾了两周,最后发现是终端电阻匹配没做好。嗯,从那以后我就养成了一个习惯——先搞懂物理层,再谈协议。

1.1 CAN总线的起源

CAN,全称Controller Area Network,控制器局域网。这玩意儿是1983年由德国Bosch公司发明的。当时汽车电子化程度越来越高,ECU之间需要一种可靠、实时、低成本的总线来交换数据。

1986年,Bosch在SAE大会上正式发布了CAN协议。1993年,它成了国际标准ISO 11898。到今天,几乎每一辆燃油车和电动车都在用CAN。

核心要点:CAN总线最初是为汽车设计的,但它后来也广泛用于工业自动化、医疗设备、航空航天等领域。不过咱们这门课只聊车载场景。

1.2 物理层特性:差分信号

CAN总线的物理层,说白了就是两根线——CAN_H和CAN_L。它用的是差分信号传输。什么是差分信号?我简单解释一下。

传统单端信号,一根信号线对地传输,容易受干扰。差分信号呢,用两根线传同一个信号,但相位相反。接收端看的是两根线的电压差,而不是对地电压。这样一来,外部电磁干扰对两根线的影响几乎相同,差值不变,信号就保住了。

我的经验:在实车布线时,CAN_H和CAN_L一定要双绞在一起。绞距越密,抗干扰能力越强。我曾经见过一个项目,因为线束厂偷懒没绞,导致总线在发动机启动时频繁丢帧。后来重新绞线,问题就解决了。

1.3 总线电平与显性/隐性

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

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

你看,隐性时两根线都是2.5V,差分电压为0。显性时CAN_H拉到3.5V,CAN_L拉到1.5V,差分电压2V。总线空闲时是隐性状态,谁要发数据就拉显性。

这里有个关键点:显性位会覆盖隐性位。也就是说,如果多个节点同时发送,只要有一个发显性0,总线就是0。这就是CAN总线仲裁的基础。我当年第一次看协议文档时,觉得这个设计太巧妙了——不需要额外的仲裁线,靠电平就能搞定冲突。

注意:不同CAN标准(如高速CAN、低速CAN、容错CAN)的电压值略有差异。上面这张表对应的是ISO 11898-2高速CAN,也是目前最常用的。如果你做低速CAN或单线CAN,电压值要重新查手册。

1.4 CAN总线拓扑结构

CAN总线采用多主总线拓扑。什么意思?就是总线上所有节点地位平等,谁都可以主动发数据,不需要主节点来调度。

典型的CAN网络结构是这样的:

┌─────────┐    ┌─────────┐    ┌─────────┐    ┌─────────┐
│  ECU 1  │    │  ECU 2  │    │  ECU 3  │    │  ECU 4  │
│ (节点)  │    │ (节点)  │    │ (节点)  │    │ (节点)  │
└────┬────┘    └────┬────┘    └────┬────┘    └────┬────┘
     │              │              │              │
     └──────────────┴──────────────┴──────────────┘
     ──────────────────────────────────────────────── CAN_H
     ──────────────────────────────────────────────── CAN_L
     │              │              │              │
   ┌─┴─┐          ┌─┴─┐          ┌─┴─┐          ┌─┴─┐
   │120Ω│          │   │          │   │          │120Ω│
   └───┘          └───┘          └───┘          └───┘
   终端电阻        节点内部        节点内部       终端电阻

看到没?总线两端各有一个120Ω的终端电阻。这个电阻不是随便加的,它的作用是匹配阻抗、消除信号反射。没有终端电阻,或者电阻值不对,总线信号就会振铃、过冲,严重时直接通信失败。

避坑指南:我曾经在一个项目中,测试工程师发现总线波形有严重的过冲。查了半天,发现终端电阻被焊成了12Ω。嗯,少了一个0,结果整个网络都不稳定。所以每次做样机,我都会亲自量一下终端电阻。

1.5 节点连接方式

每个CAN节点通过CAN收发器连接到总线上。收发器负责把逻辑信号转换成差分电平,反过来也把差分电平还原成逻辑信号。

典型的节点内部结构:

┌─────────────────────────────────┐
│            ECU 节点              │
│  ┌──────────┐   ┌────────────┐  │
│  │ CAN控制器 │───│ CAN收发器   │──┤──→ CAN_H
│  │ (内置MCU) │   │ (如TJA1050)│  │
│  └──────────┘   └────────────┘  │──┤──→ CAN_L
│                                 │
│  ┌──────────┐                   │
│  │ 终端电阻  │ (仅两端节点需要)  │
│  └──────────┘                   │
└─────────────────────────────────┘

这里要注意:只有总线两端的节点才需要接终端电阻。中间节点不需要。如果每个节点都接120Ω,那并联后的等效电阻就远小于120Ω了,信号反射会更严重。

1.6 总线长度与波特率的关系

CAN总线的通信距离和波特率是成反比的。波特率越高,能传的距离越短。为什么?因为信号在线上传播需要时间,波特率高了,位时间短了,信号反射和延迟的影响就大了。

波特率 最大总线长度 典型应用
1 Mbps 40 m 动力系统、底盘控制
500 kbps 100 m 车身控制、信息娱乐
250 kbps 250 m 诊断、低速车身模块
125 kbps 500 m 工业控制、远程IO
50 kbps 1000 m 楼宇自动化、长距离

在乘用车上,动力CAN通常是500 kbps,车身CAN是125 kbps或250 kbps。诊断CAN一般是500 kbps。我建议你设计网络时,先确定最远节点距离,再反推波特率。

实战建议:如果你不确定总线长度,保守一点选250 kbps。这个速率在绝大多数乘用车场景下都够用,而且抗干扰能力比500 kbps强不少。

1.7 本章知识结构图

下面这张SVG图,把CAN协议基础的核心知识点串起来了。你可以把它当作本章的思维导图。

CAN协议基础 - 知识结构 CAN总线基础 起源:Bosch 1983 物理层:差分信号 总线电平:显性/隐性 拓扑:多主总线 终端电阻:120Ω 波特率 vs 距离 节点:控制器+收发器 应用:动力/车身/诊断 避坑:电阻/绞线/电平 提示:先理解物理层,再学协议层,事半功倍

1.8 本章小结

好了,咱们把CAN协议基础捋一遍:

  • 起源:Bosch 1983年发明,1993年成为ISO标准
  • 物理层:差分信号,CAN_H和CAN_L双绞传输
  • 总线电平:隐性2.5V/2.5V,显性3.5V/1.5V,显性覆盖隐性
  • 拓扑结构:多主总线,两端各一个120Ω终端电阻
  • 节点结构:CAN控制器 + CAN收发器
  • 波特率与距离:成反比,500 kbps典型距离100米

这些内容看起来简单,但都是后面章节的基础。你想想看,如果连差分信号和终端电阻都搞不清楚,后面学CAN帧结构、位时序、错误处理,那肯定越学越糊涂。

我个人的习惯是,每接触一个新项目,第一件事就是拿示波器看总线波形。确认电平对不对、终端电阻匹配不匹配、信号有没有反射。这一步做扎实了,后面调试协议栈会省很多时间。

最后提醒一句:别小看物理层。我见过太多工程师,协议栈写得飞起,结果上车一跑就出问题。查到最后,要么是终端电阻没焊,要么是CAN_H和CAN_L接反了。嗯,这种低级错误,咱们就别犯了。