1. CAN总线概述:从起源到物理层
各位同学,咱们今天正式开讲CAN总线。说实话,每次讲到这个章节,我都会想起自己刚入行时被CAN总线折腾的那些日子。那时候没有现在这么多资料,全靠啃芯片手册和示波器一点一点摸。好,闲话少说,咱们从根儿上聊起。
1.1 CAN总线的起源——为什么会有它?
上世纪80年代,汽车里的电子设备开始多起来了。你想想看,发动机要电控、变速箱要电控、ABS要电控……每个模块之间都得连信号线。那时候用的还是点对点连线,一辆车上的线束能有好几十公斤重。
我记得有个老工程师跟我讲过,当年他们调试一辆豪华车,光整理线束就花了两天。线多了,故障率自然就高,接头松动、线皮磨损,哪个都不好查。
1983年,德国Bosch公司开始琢磨一个问题:能不能用两根线,把车上所有的电子模块都串起来?于是,1986年,CAN(Controller Area Network)总线正式诞生了。1987年,Intel推出了第一款CAN控制器芯片——82526。嗯,这芯片现在早停产了,但它的设计思想一直沿用至今。
核心要点:CAN总线最初就是为了解决汽车内部大量点对点连线的问题而设计的。它的目标是用最少的两根线,实现可靠、实时的数据通信。
1.2 CAN总线的特点——它凭什么能活到现在?
CAN总线从80年代活到现在,快40年了。为什么?因为它有几个硬功夫。
| 特点 | 说明 | 我的体会 |
|---|---|---|
| 多主通信 | 任何节点都可以主动发消息,不需要主机轮询 | 实际项目中,这特性让系统响应快很多 |
| 非破坏性仲裁 | 多个节点同时发数据时,优先级高的自动胜出,低优先级的自动退让 | 我曾经用示波器看过仲裁过程,真的很巧妙 |
| 实时性强 | 数据帧传输时间可预测,最坏情况也能算出来 | 做安全系统时,这个特性太重要了 |
| 错误检测与恢复 | 5种错误检测机制,出错自动重发 | 有一次总线被干扰,CRC救了一车数据 |
| 差分信号传输 | 抗干扰能力强,适合汽车这种电磁环境恶劣的地方 | 在发动机舱里跑CAN线,基本不用担心干扰 |
| 成本低 | 只需要两根线,控制器芯片也很便宜 | 现在一颗CAN收发器才几块钱 |
避坑指南:我曾经在一个项目里,把CAN总线的终端电阻给漏接了。结果总线波形乱七八糟,通信时好时坏。查了两天才找到原因。记住:CAN总线两端必须各接一个120Ω的终端电阻,这是硬规矩。
1.3 CAN总线的应用领域——不光在车上
很多人以为CAN总线只用在汽车上。其实不是。我这些年接触过的项目里,CAN总线几乎无处不在。
- 汽车电子:发动机ECU、变速箱TCU、ABS、安全气囊、车身控制、信息娱乐……基本上车上每个电子模块都离不开CAN
- 工业自动化:PLC之间的通信、传感器网络、机器人控制。我在一个工厂里见过用CAN总线连了200多个传感器
- 医疗设备:CT机、监护仪、手术机器人。医疗设备对可靠性要求极高,CAN总线正好合适
- 航空航天:飞机上的航电系统、卫星内部通信。虽然现在有更高级的协议,但CAN还在用
- 船舶电子:发动机监控、导航系统、报警系统
- 电梯控制:电梯里的楼层呼叫、门控、位置检测,很多都是用CAN总线连的
说白了,只要是需要多个设备之间可靠通信、环境又比较恶劣的地方,CAN总线都是首选。
1.4 CAN总线物理层特性——两根线里的门道
CAN总线的物理层,说白了就是那两根线——CAN_H和CAN_L。但这两根线里的门道可不少。
1.4.1 差分信号
CAN总线用的是差分信号传输。什么意思?就是信号不是对地测量的,而是看CAN_H和CAN_L两根线之间的电压差。
- 显性电平(Dominant):CAN_H比CAN_L高,电压差约2V。逻辑上代表"0"
- 隐性电平(Recessive):CAN_H和CAN_L电压相等,电压差约0V。逻辑上代表"1"
为什么会这样设计?你想想看,汽车发动机点火的时候,电磁干扰多强啊。如果用的是单端信号,地电平一波动,信号就乱了。但差分信号不一样,干扰同时作用在两根线上,电压差基本不变。这就是CAN总线抗干扰能力的秘密。
注意:我曾经在一个项目中,把CAN_H和CAN_L线接反了。结果整个网络都不通。CAN总线对线序有严格要求:CAN_H接CAN_H,CAN_L接CAN_L,不能乱来。虽然有些收发器有极性纠正功能,但别指望这个。
1.4.2 总线电平与逻辑
咱们用一张表来总结一下CAN总线的电平逻辑:
| 状态 | CAN_H电压 | CAN_L电压 | 电压差 | 逻辑值 |
|---|---|---|---|---|
| 显性 | 约3.5V | 约1.5V | 约2.0V | 0 |
| 隐性 | 约2.5V | 约2.5V | 约0V | 1 |
注意:显性电平会"覆盖"隐性电平。也就是说,只要有一个节点发送显性电平,总线上就是显性的。这就是仲裁机制能工作的物理基础。
1.4.3 终端电阻
CAN总线两端必须各接一个120Ω的终端电阻。为什么是120Ω?因为CAN总线的特性阻抗大约是120Ω。接上匹配电阻,可以防止信号反射。
我见过不少新手,觉得终端电阻可有可无。结果总线波形乱七八糟,通信时好时坏。记住:没有终端电阻的CAN总线,就像没有刹车的车——能跑,但很危险。
1.4.4 总线长度与速率
CAN总线的通信速率和总线长度是成反比的。速率越高,能跑的距离越短。这是由信号传输的物理特性决定的。
| 通信速率 | 最大总线长度 | 典型应用场景 |
|---|---|---|
| 1 Mbps | 40 m | 车内动力系统 |
| 500 kbps | 100 m | 车身控制 |
| 250 kbps | 250 m | 工业控制 |
| 125 kbps | 500 m | 楼宇自动化 |
| 50 kbps | 1000 m | 远程监控 |
我个人习惯,做车载项目时一般用500 kbps。这个速率够用,距离也够长,而且兼容性最好。
1.5 CAN总线知识体系结构
下面这张图,是我自己画的CAN总线知识体系结构。你可以把它当作整个课程的地图。
这张图把CAN总线的知识体系分成了五个层次。咱们这门课,就是按照这个结构一层一层往下讲的。从物理层开始,到数据链路层,再到应用层协议,最后是实践和调试。每一步我都会把我在项目中踩过的坑、总结的经验分享给你们。
学习建议:我建议你先把这个知识体系图保存下来。每学完一章,就在图上做个标记。这样你就能清楚地知道自己在整个知识体系中的位置,不会迷路。