第1章:CAN协议概述
1.1 CAN总线的起源
说到CAN总线,我得先聊聊它的来历。上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制,每个模块都要连一堆线。线束又粗又重,成本还高。德国博世公司看不下去了,于是在1986年推出了CAN总线。
CAN的全称是Controller Area Network,控制器局域网。说白了,就是让车上各个电子模块能互相聊天。我最早接触CAN是在2008年,那时候还在做车身控制模块。说实话,第一次看到两根线就能让几十个节点通信,确实挺震撼的。
为什么叫CAN?因为它的设计理念就是「能行」。不需要复杂的主站,不需要昂贵的线缆。两根双绞线,一个简单的收发器,就能搞定。嗯,这就是CAN的初心。
1.2 CAN总线的特点
CAN总线能活到现在,自然有它的独到之处。我总结几个关键点:
- 多主通信:任何节点都能主动发消息。不像I2C那样得等主设备叫号。
- 实时性强:优先级高的消息,延迟可以控制在微秒级。
- 错误处理:5种错误检测机制,自动重发。我在项目里见过,总线被干扰得一塌糊涂,CAN照样能扛住。
- 差分信号:抗干扰能力一流。后面我会细讲。
- 成本低:两根线就能挂几十个节点。你想想看,省了多少线束钱。
核心优势:CAN总线最大的价值在于「确定性」。每个消息的优先级是固定的,高优先级的消息永远先发。这在汽车上太重要了——刹车信号可不能等。
1.3 CAN总线物理层
物理层这块,我建议你重点理解。很多问题都出在这里。
1.3.1 差分信号
CAN用两根线传输:CAN_H和CAN_L。它不测单根线的电压,而是看两根线的电压差。为什么这么做?
举个例子。我在做EMC测试时遇到过,一根线被干扰了,电压跳了2V。但另一根线也被同样干扰了,电压也跳了2V。差值没变,数据就保住了。这就是差分信号的魅力。
差分信号还有个好处:共模抑制。外界干扰通常是共模的,两根线同时受影响。但CAN只看差值,共模干扰就被滤掉了。
1.3.2 总线电平
CAN总线有两种状态:显性(Dominant)和隐性(Recessive)。
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 |
|---|---|---|---|
| 隐性(逻辑1) | 2.5V | 2.5V | 0V |
| 显性(逻辑0) | 3.5V | 1.5V | 2V |
这里有个关键点:显性电平会覆盖隐性电平。也就是说,只要有一个节点发显性,总线就是显性。这正好用来实现仲裁——谁先发0,谁就赢。
个人经验:测量CAN总线时,示波器探头要接CAN_H和CAN_L,地线夹子夹GND。千万别只测一根线对地,那样看不出差分信号。
1.3.3 终端电阻
终端电阻,这是新手最容易忽略的地方。CAN总线两端各需要一颗120Ω电阻。为什么是120Ω?
因为CAN总线的特性阻抗大约是120Ω。终端电阻的作用是匹配阻抗,防止信号反射。我曾经见过一个项目,终端电阻没焊,结果总线波形乱七八糟,通信时好时坏。查了两天才找到原因。
终端电阻怎么接?标准做法是:
- 总线最远端的两个节点各接一颗120Ω电阻
- 电阻接在CAN_H和CAN_L之间
- 总阻值应该是60Ω(两个120Ω并联)
避坑指南:我曾经遇到过,有人把终端电阻接在每个节点上。结果总线上挂了10个节点,每个都接了120Ω。并联后阻值只有12Ω,总线直接瘫痪。记住:只有两端接,中间节点不要接。
测量终端电阻有个小技巧:断电状态下,用万用表量CAN_H和CAN_L之间的电阻。如果测到60Ω左右,说明终端电阻接对了。如果测到120Ω,说明只接了一端。如果测到开路,那肯定没接。
嗯,物理层就这些。看似简单,但很多坑都埋在这里。我建议你动手测一测,拿示波器看看波形,比看十遍书都管用。