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协议基础的核心知识点串起来了。你可以把它当作本章的思维导图。
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接反了。嗯,这种低级错误,咱们就别犯了。