第1章:CAN总线基础回顾
1.1 CAN协议概述
CAN总线,全称Controller Area Network,是德国Bosch公司在80年代搞出来的。说实话,这玩意儿最初是为了汽车里的各种电子设备能好好说话。
我刚开始接触CAN的时候,觉得它就是个串口通信。后来踩了坑才发现,完全不是那么回事。CAN总线有几个核心特点,我简单说说:
- 多主通信:总线上任何一个节点都能主动发消息,不用等谁批准
- 实时性强:优先级高的消息,延迟能控制在微秒级
- 错误检测牛:有5种错误检测机制,我见过最离谱的案例,总线被干扰得一塌糊涂,数据愣是没丢
- 差分传输:这个后面细说,抗干扰能力是真的强
你想想看,一辆车上几十个ECU,要是都用点对点连线,那线束得多恐怖?CAN总线用两根线就把所有节点串起来了,省线、省空间、还省钱。
核心要点:CAN不是简单的串口替代品,它是一套完整的通信协议,包含物理层、数据链路层、应用层。我建议初学者先把物理层搞明白,后面学起来会顺很多。
1.2 物理层特性
CAN总线的物理层,说白了就是两根线:CAN_H和CAN_L。但别小看这两根线,里面的门道不少。
我记得第一次用逻辑分析仪抓CAN信号,看到波形直接懵了——怎么不是方波?后来才明白,CAN用的是"显性"和"隐性"电平。
| 信号状态 | CAN_H电压 | CAN_L电压 | 差分电压 |
|---|---|---|---|
| 显性(逻辑0) | 3.5V | 1.5V | 2.0V |
| 隐性(逻辑1) | 2.5V | 2.5V | 0V |
这里有个坑,我当年就栽过:显性电平会覆盖隐性电平。什么意思呢?就是如果两个节点同时发数据,显性位(0)会"赢"过隐性位(1)。这就是CAN总线仲裁的基础。
调试小技巧:用逻辑分析仪抓CAN信号时,建议同时抓CAN_H和CAN_L。只看一根线,你可能会误判。我习惯把差分信号算出来看,这样干扰信号一眼就能认出来。
1.3 差分信号与抗干扰
为什么CAN要用差分信号?说白了就是为了抗干扰。
你想想看,工业现场电机一启动,电磁干扰满天飞。单端信号在这种环境里,分分钟被干趴下。但差分信号不一样——干扰是共模的,两根线上受到的干扰几乎一样,一相减就抵消了。
我在一个项目里遇到过这种情况:现场有台大功率变频器,一启动,RS485直接瘫痪。换成CAN总线后,同样的线缆、同样的距离,稳如老狗。这就是差分信号的优势。
差分信号的几个关键参数:
- 共模电压范围:-2V到+7V,这是CAN收发器能正常工作的范围
- 差分电压阈值:接收器判断显性/隐性的门槛,一般是0.5V到0.9V
- 总线终端电阻:120Ω,这个不能省,我见过有人偷懒不接,结果信号反射得一塌糊涂
注意:终端电阻必须接在总线两端,不是每个节点都接。我曾经见过一个项目,每个节点都焊了120Ω电阻,结果总线负载太重,信号幅度直接掉到阈值以下。嗯,排查了整整一天才找到原因。
1.4 总线拓扑
CAN总线的拓扑结构,最标准的就是直线型(也叫总线型)。所有节点都挂在同一条主干线上,用短支线连接。
拓扑规则其实很简单:
- 主干线:就是CAN_H和CAN_L两根线,从头走到尾
- 支线长度:建议不超过0.3米,高速CAN(1Mbps)时尤其要注意
- 节点间距:没有严格限制,但支线越长,信号质量越差
- 总线长度:和波特率有关,1Mbps时最长40米,125kbps时可以到500米
我个人的习惯是,能用直线型就别用星型或环型。星型拓扑在CAN里容易出问题,因为信号反射会在分支点叠加,搞不好就把波形搞坏了。
有一次帮朋友调试一个设备,他用的是星型拓扑,总线上挂了8个节点。结果只要某个节点一发送,其他节点就收不到。查了半天,发现是分支太长,信号反射把显性位给"吃掉"了。后来改成直线型,问题立马解决。
经验总结:CAN总线的物理层设计,说白了就是三件事——差分信号、终端电阻、总线拓扑。这三样搞明白了,后面解码、分析、调试就顺了。我建议你手头备个逻辑分析仪,抓几段波形看看,比看十遍书都管用。
好了,CAN总线的基础就回顾到这里。下一章我们聊聊怎么用逻辑分析仪抓CAN信号,以及那些解码时容易踩的坑。