第1章:CAN总线基础
1.1 CAN协议的起源——从一根线说起
CAN总线,全称Controller Area Network,控制器局域网。这东西最早是1983年由德国博世公司搞出来的。你可能会问,为什么博世要搞这个?说白了,当时汽车里的电子设备越来越多,空调、ABS、发动机控制、变速箱……每个模块之间都要通信,传统的点对点接线方式,线束又重又贵,还容易出故障。
我记得我第一次接触CAN总线,是在一个商用车项目上。那时候我还在想,为什么不用RS485或者别的什么总线?后来拆了一台实车,看到那密密麻麻的线束,我瞬间就明白了——CAN总线就是为了解决这个“线束灾难”而生的。
1986年,博世正式发布了CAN协议。1993年,它成了国际标准ISO 11898。嗯,这里要注意,CAN总线从一开始就不是为了高速大数据量传输设计的,它的核心目标是:可靠、实时、低成本。
核心要点:CAN总线是一种多主总线,所有节点都可以主动发送数据,没有主从之分。这一点和I2C、SPI完全不同。
1.2 物理层特性——电压、速率、距离
CAN总线的物理层,说白了就是两根线:CAN_H和CAN_L。它用的是差分信号传输,这个后面会细说。先看看几个关键参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线电压 | CAN_H: 2.5V~3.5V CAN_L: 1.5V~2.5V |
显性电平:CAN_H=3.5V,CAN_L=1.5V 隐性电平:两者均为2.5V |
| 最大速率 | 1 Mbps(ISO 11898-2) | 实际常用250kbps、500kbps |
| 最大距离 | 40m @ 1Mbps 1km @ 50kbps |
速率越低,距离越远 |
| 终端电阻 | 120Ω(两端各一个) | 用于抑制信号反射 |
你想想看,为什么速率和距离成反比?其实很好理解。信号在线上传输会有衰减,速率越高,信号边沿越陡,反射和衰减的影响就越明显。我在一个项目中遇到过,总线长度只有30米,但用了1Mbps的速率,结果通信老是丢帧。后来查了半天,发现是终端电阻没接好。嗯,从那以后我每次布线都会再三确认终端电阻。
个人建议:BMS项目中,我一般用250kbps。这个速率足够传输电池电压、温度、电流等数据,而且抗干扰能力比500kbps好不少。别一味追求高速,稳定才是王道。
1.3 差分信号——为什么CAN这么抗造?
CAN总线用的是差分信号传输。什么意思呢?就是信号不是用一根线对地来传输的,而是用两根线之间的电压差来表示。
- 显性电平(Dominant):CAN_H比CAN_L高2V左右,逻辑上代表“0”
- 隐性电平(Recessive):CAN_H和CAN_L电压相等(约2.5V),逻辑上代表“1”
为什么会这样设计?说白了,就是为了抗干扰。你想啊,如果外界有电磁干扰,它同时作用在CAN_H和CAN_L上,两根线上的电压会同时升高或降低,但它们的差值基本不变。这就是共模抑制。
我曾经在一个电机驱动项目上吃过亏。电机启动时,地线上有几十伏的尖峰干扰,用单端通信的UART直接挂了,但CAN总线纹丝不动。从那以后,我对差分信号就特别信任。
避坑指南:我曾经遇到过一个问题——CAN总线在实验室跑得好好的,一到车上就出乱码。查了三天,最后发现是CAN_H和CAN_L线在布线时没有双绞,而且和动力线走在了同一个线槽里。记住:CAN线一定要双绞,而且要远离高压动力线!
1.4 总线拓扑——手拉手还是星型?
CAN总线的拓扑结构,标准要求是直线型(总线型)。所有节点都挂在一根主干线上,每个节点用尽量短的支线连接。
为什么不能用星型?你想想看,星型拓扑会有多个分支点,信号反射会非常严重。我见过一个项目,为了布线方便,把CAN总线接成了星型,结果通信距离超过50米就完全没法用。后来改成直线型,问题就解决了。
拓扑结构的关键点:
- 主干线:两端各接一个120Ω终端电阻
- 支线:越短越好,一般不超过30cm
- 节点数:标准CAN最多110个节点(实际受驱动能力限制)
- 总线长度:和速率有关,见上面的表格
经验之谈:在BMS项目中,电池模组内部的CAN节点往往比较多。我建议每个模组内部用短支线连接到主干线,主干线沿着电池包走一圈。终端电阻一定要放在电池包的两端,而不是在BMS主控板上。这个细节很多人会忽略。
1.5 小结——CAN总线到底好在哪?
说了这么多,总结一下CAN总线的核心优势:
- 多主通信:任何节点都可以主动发数据,不需要主机轮询
- 实时性好:优先级高的报文可以立即发送,不会因为总线忙而等待
- 抗干扰强:差分信号,共模抑制比高
- 错误检测:有CRC校验、位填充、格式检查等多重机制
- 成本低:两根线就能搞定,线束少,重量轻
嗯,这就是CAN总线的基础。下一章我们会深入CAN的数据链路层,看看报文到底是怎么组织的。到时候我会拿一个BMS的实际报文来拆解,保证你看完就能上手。