1. CAN总线基础:CAN协议概述、物理层特性、差分信号与总线拓扑
大家好,我是你们的讲师。今天咱们正式开始聊CAN总线。说实话,我入行那会儿,CAN总线还是个挺"高端"的东西,现在呢?从汽车到工业设备,从机器人到医疗器械,到处都能看到它的影子。为什么这么火?说白了,就是它够可靠、够实时、够抗干扰。
咱们这堂课的目标,是让你彻底搞懂CAN总线的底层原理。别急,咱们从最基础的东西开始。
1.1 CAN协议概述:它到底是个啥?
CAN,全称Controller Area Network,控制器局域网。这是德国博世公司在80年代搞出来的。我当年第一次接触CAN,是在一个汽车ECU的项目里。那时候我还在想,这玩意儿跟串口有啥区别?后来踩了不少坑才明白,CAN的设计哲学跟串口完全不一样。
CAN协议的核心特点,我总结成几句话:
- 多主总线:总线上任何一个节点都可以主动发消息,不需要主机来"点名"。你想想看,这比主从结构灵活多了。
- 基于消息的寻址:CAN不关心"谁发的",只关心"消息是什么"。每个消息有一个ID,节点根据ID决定要不要接收。
- 非破坏性仲裁:多个节点同时发消息怎么办?ID小的优先。这个机制非常巧妙,后面我会细讲。
- 错误检测与重发:CAN有5种错误检测机制,发现错误就自动重发。我在项目中遇到过,有一次总线被干扰了,CAN自己默默重发了三次,数据愣是没丢。
重点记住:CAN协议工作在OSI模型的物理层和数据链路层。咱们做Bootloader刷写,主要跟这两层打交道。
1.2 物理层特性:电压、速率、线缆
物理层,说白了就是"电信号怎么在线上跑"。CAN总线的物理层标准有好几种,最常用的是ISO 11898-2,也就是高速CAN。
我直接给你列个表,看着更清楚:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线电压 | 显性:2.5V + 1V = 3.5V(CAN_H) 隐性:2.5V(CAN_H) | 差分信号,共模电压2.5V |
| 最大速率 | 1 Mbps(40米以内) | 速率跟总线长度成反比 |
| 总线长度 | 40米 @ 1 Mbps 1000米 @ 50 kbps | 越长越慢,这是物理规律 |
| 终端电阻 | 120 Ω(两端各一个) | 防止信号反射 |
| 线缆类型 | 双绞线(屏蔽/非屏蔽) | 双绞线抗干扰能力强 |
嗯,这里要注意:终端电阻必须加在总线的两端,而不是每个节点上。我见过有人每个节点都焊了个120Ω电阻,结果总线直接拉死了,信号根本跳不动。
1.3 差分信号:为什么CAN这么抗造?
差分信号是CAN总线的"看家本领"。你想想,汽车发动机舱里电磁干扰那么严重,单端信号(比如UART)很容易被干扰。但差分信号就不一样了。
原理很简单:
- CAN_H和CAN_L两根线,信号是反相的。
- 接收器只看两根线的电压差:CAN_H - CAN_L。
- 外部干扰同时作用在两根线上,差值基本不变。
我举个例子你就明白了。假设CAN_H是3.5V,CAN_L是1.5V,差值是2.0V。这时候来了个干扰,两根线都抬高了0.5V。CAN_H变成4.0V,CAN_L变成2.0V,差值还是2.0V。你看,干扰被抵消了。
个人经验:我在做农机控制器的时候,现场有大功率电机启动,UART通信直接乱码。换成CAN之后,稳如老狗。差分信号就是这么靠谱。
CAN总线的信号电平有两种状态:
- 显性(Dominant):CAN_H比CAN_L高约2V。逻辑上对应"0"。
- 隐性(Recessive):CAN_H和CAN_L电压相等(约2.5V)。逻辑上对应"1"。
为什么叫"显性"和"隐性"?因为显性信号会"覆盖"隐性信号。多个节点同时发,只要有一个发显性,总线就是显性。这就是仲裁的基础。
1.4 总线拓扑:怎么把节点连起来?
CAN总线的拓扑结构,最标准的就是直线型总线。说白了,就是一根主干线,所有节点都挂在这根线上。
拓扑要点:
- 主干线:从一端到另一端,尽量走直线,不要有分支。
- 分支(Stub):每个节点到主干线的连接线,越短越好。我建议不超过30厘米。
- 终端电阻:主干线两端各一个120Ω电阻。
避坑指南:我曾经在一个项目里,为了布线方便,把CAN总线走成了星型拓扑。结果呢?信号反射得一塌糊涂,通信时好时坏。查了两天才发现是拓扑的问题。记住:CAN总线必须是直线型,别搞花活。
节点数量方面,ISO 11898标准说最多30个节点。但实际项目中,用CAN收发器(比如TJA1050)可以挂110个以上。不过节点越多,总线负载越重,实时性会下降。做Bootloader刷写的时候,我建议总线上不要超过20个节点,否则刷写速度会受影响。
1.5 小结:这些跟Bootloader刷写有什么关系?
你可能会问,讲这么多物理层的东西,跟刷写Bootloader有啥关系?关系大了去了。
- 速率选择:刷写要传大量数据,速率越高越好。但速率受总线长度和节点数量限制。你得根据实际情况选。
- 信号质量:差分信号抗干扰强,但终端电阻、分支长度这些细节没做好,照样出问题。刷写到一半通信断了,ECU就变砖了。
- 总线仲裁:刷写过程中,多个ECU同时应答怎么办?CAN的仲裁机制保证了不会冲突。
好了,这一章就到这里。下一章咱们聊CAN的数据帧结构,那才是真正跟Bootloader协议设计直接相关的内容。到时候我会手把手教你分析一个CAN报文,保证你听完就能看懂。