1. CAN总线基础:从起源到物理层
大家好,我是你们这门课的老朋友。今天咱们正式开篇,聊聊CAN总线最底层的那些事儿。
很多人一上来就学报文格式、学滤波配置,结果板子调不通,拿着示波器一脸懵。为什么?因为物理层的东西没吃透。我这些年修过的CAN故障,少说有一半是物理层问题——电平不对、终端电阻没焊、共模干扰没处理好。所以这一章,咱们把地基打牢。
1.1 CAN协议的起源——为什么会有它?
上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、变速箱……每个模块都独立接线,线束又粗又重,故障率还高。
博世(Bosch)公司当时就想:能不能用两根线,把车上所有节点串起来?于是1986年,CAN(Controller Area Network)协议诞生了。它的核心目标就三个:
- 多主通信——任何节点都能主动发数据,不用等主机轮询
- 高可靠性——错误检测和重发机制,保证数据不丢
- 实时性——优先级高的报文,延迟可控
后来ISO把CAN标准化为ISO 11898,一直沿用至今。说实话,30多年前的设计,到现在还是工业、汽车、医疗领域的主力总线,这本身就说明它的底子有多扎实。
我的经验:我最早接触CAN是在一个车载BMS项目里。当时觉得CAN比RS485复杂太多,后来才发现,CAN的可靠性正是靠这些“复杂”换来的。你想想看,两根线能扛住发动机舱的电磁干扰,这本身就是本事。
1.2 物理层特性——CAN_H和CAN_L的秘密
CAN总线物理层,说白了就是一对差分线:CAN_H(高线)和CAN_L(低线)。标准CAN(ISO 11898-2)的电气参数如下:
| 参数 | 值 | 说明 |
|---|---|---|
| 总线电压(显性) | CAN_H ≈ 3.5V, CAN_L ≈ 1.5V | 差分电压约2V |
| 总线电压(隐性) | CAN_H ≈ 2.5V, CAN_L ≈ 2.5V | 差分电压约0V |
| 最大速率 | 1 Mbps(40米内) | 速率与距离成反比 |
| 最大节点数 | 30~110(取决于收发器) | 常用TJA1050支持110节点 |
| 终端电阻 | 120Ω(两端各一个) | 匹配阻抗,抑制反射 |
这里有个关键点:显性位(Dominant)覆盖隐性位(Recessive)。也就是说,只要有一个节点发显性位(逻辑0),总线就是显性状态。所有节点都发隐性位(逻辑1),总线才是隐性。这就是CAN总线仲裁的基础。
注意:我曾经遇到一个案例,现场CAN通信时好时坏。查了两天,最后发现CAN_H和CAN_L线接反了。收发器没烧,但电平完全反相,导致通信间歇性失败。所以焊接前,一定用万用表确认线序。
1.3 差分信号原理——为什么CAN这么抗干扰?
为什么CAN只用两根线,就能在发动机旁边稳定工作?答案就是差分信号。
咱们来做个对比。单端信号(比如UART)靠一根信号线对地传输。如果外界有个电磁干扰,信号线上电压被拉高,接收端就误判了。但差分信号不一样:
- 干扰同时作用在CAN_H和CAN_L上
- 接收器只关心 CAN_H - CAN_L 的差值
- 共模干扰被抵消,差模信号保留
说白了,就是“共同的部分我不要,我只取差值”。这个差值在显性位时约2V,隐性位时约0V,判据非常清晰。
小技巧:调试时用示波器同时抓CAN_H和CAN_L,然后做数学通道CH1-CH2。如果差分波形干净、幅值稳定在2V左右,说明物理层基本没问题。如果差分波形毛刺多、幅值偏低,先查终端电阻和接地。
1.4 总线拓扑结构——怎么把节点连起来?
CAN总线推荐直线型拓扑,也叫总线型。所有节点都挂在同一对双绞线上,两端各加一个120Ω终端电阻。
我画了一张图,帮你直观理解:
这张图里,三个节点通过短截线(stub)挂到主线上。注意:短截线越短越好。我见过有人用1米长的线把节点接到总线上,结果1Mbps通信直接挂掉。为什么?因为短截线会产生信号反射,速率越高越明显。
实际工程中,我建议:
- 1Mbps时,短截线不超过30cm
- 250kbps时,短截线不超过1m
- 能用菊花链(节点串在主线中间)就别用星型
避坑指南:我曾经在一个项目中,现场工人把CAN总线接成了星型拓扑——所有节点用一根线汇聚到中心点。结果总线反射严重,通信完全不可用。最后改成直线型,问题解决。记住:CAN不是以太网,别搞星型。
1.5 终端电阻——为什么必须是120Ω?
终端电阻的作用有两个:
- 阻抗匹配——防止信号在总线末端反射
- 提供回流通路——让显性位的电流形成回路
为什么是120Ω?因为CAN总线使用的双绞线特性阻抗大约是120Ω。两端各并联一个120Ω,从任意节点看进去,总线等效阻抗是60Ω。这个值刚好匹配收发器的输出阻抗。
我教你一个快速判断方法:总线断电时,用万用表量CAN_H和CAN_L之间的电阻。如果读数是60Ω左右,说明两个终端电阻都在。如果是120Ω,说明只装了一个。如果是无穷大,一个都没装——赶紧补上。
我的习惯:每次做CAN项目,第一件事就是画拓扑图,标清楚终端电阻位置。然后打样回来第一件事,用万用表确认电阻值。这个习惯帮我省了至少三次返工。
1.6 本章小结
这一章咱们把CAN总线的底子过了一遍:
- CAN协议诞生于汽车电子需求,核心是多主、可靠、实时
- 物理层靠CAN_H和CAN_L差分传输,显性位覆盖隐性位
- 差分信号天然抗共模干扰,这是CAN能在恶劣环境工作的根本原因
- 直线型拓扑是标准做法,两端必须各有一个120Ω终端电阻