第1章:CAN总线基础——从起源到帧结构

1.1 CAN总线的起源与历史

说到CAN总线,我得先聊聊它的出身。上世纪80年代,汽车电子开始爆发,各种ECU(电子控制单元)像雨后春笋一样冒出来。那时候的通信方式,说白了就是点对点连线——每个传感器、执行器都要单独拉线到控制器。你想想看,一辆车几十个ECU,线束比人的血管还复杂,重量大、成本高、故障率还高。

1983年,德国博世公司(Bosch)开始琢磨一个问题:能不能搞一套总线,让所有节点共用两根线通信?这个想法在当时挺大胆的。1986年,他们在SAE(美国汽车工程师学会)大会上正式发布了CAN总线协议。我记得第一次看到这个协议文档时,心里就一个感觉:这玩意儿设计得太巧妙了。

1991年,博世发布了CAN 2.0规范,这是CAN总线发展史上的里程碑。后来ISO(国际标准化组织)把它标准化为ISO 11898,从此CAN总线成了汽车电子的事实标准。到今天,哪怕是最新的新能源汽车,OBC(车载充电机)、BMS(电池管理系统)、VCU(整车控制器)之间的通信,依然离不开CAN总线。

1.2 CAN 2.0A与CAN 2.0B的区别

很多刚入行的朋友会问我:CAN 2.0A和CAN 2.0B到底差在哪?我直接说结论:核心区别就是ID长度

特性 CAN 2.0A(标准帧) CAN 2.0B(扩展帧)
ID长度 11位 29位
最大节点数 约2032个 约5.3亿个
帧格式标识 IDE位=0 IDE位=1
兼容性 基础版本 向下兼容2.0A

我在做OBC项目时,遇到过一个问题:BMS用的是扩展帧,而OBC控制器只支持标准帧。结果通信死活不通。后来查了芯片手册才发现,有些CAN控制器默认只处理标准帧,需要手动配置才能接收扩展帧。嗯,这里要注意:CAN 2.0B的控制器可以收发2.0A的帧,但反过来不行

避坑指南:我曾经在一个项目中,因为没注意CAN控制器的版本,买了一批只支持2.0A的芯片,结果整车网络里混着扩展帧,导致通信间歇性失败。后来全部换成2.0B的芯片才解决问题。所以选型时,我建议直接上支持CAN 2.0B的控制器,省得后面踩坑。

1.3 CAN总线物理层特性

差分信号

CAN总线为什么抗干扰能力强?核心秘密就是差分信号。它用两根线传输:CAN_H和CAN_L。逻辑1(隐性位)时,两根线电压差接近0V;逻辑0(显性位)时,CAN_H比CAN_L高2V左右。

你想想看,如果外界有电磁干扰,两根线上受到的干扰基本是一样的。接收器只关心两根线的电压差,干扰就被抵消掉了。这就是差分信号的魅力。我在做OBC的EMC测试时,亲眼见过差分信号把共模干扰滤得干干净净,换成单端信号早就乱码了。

终端电阻

终端电阻是CAN总线里最容易忽略但又最关键的东西。标准规定:总线两端各接一个120Ω电阻。为什么是120Ω?因为CAN总线的特性阻抗大约是120Ω,终端电阻的作用就是匹配阻抗,防止信号反射。

警告:我曾经见过一个新手工程师,把终端电阻焊在了总线中间,结果信号反射得一塌糊涂,通信距离从100米直接缩到10米。记住:终端电阻必须放在总线的最两端,不是中间,也不是一端。

如果总线长度很短(比如1米以内),不接终端电阻也能工作。但我建议:不管多短,都接上。因为不接电阻时,总线处于高阻态,容易受干扰。我在实验室调试时吃过这个亏,不接电阻时偶尔丢帧,接上后稳如泰山。

1.4 CAN总线帧结构详解

CAN总线的数据帧,说白了就是一串二进制位,按固定格式排列。我把它拆成7个部分来讲,这样好记。

SOF(帧起始)

一个显性位(逻辑0),告诉所有节点:我要开始发数据了。SOF的作用是同步总线上的所有节点。我习惯用示波器抓SOF的下降沿来测量总线同步精度。

仲裁场

这是CAN总线最聪明的设计。仲裁场包含ID和RTR位。多个节点同时发送时,谁ID小谁优先。为什么?因为显性位(0)会覆盖隐性位(1)。说白了就是:谁的数字小,谁就赢

我在OBC项目中,把充电控制报文的ID设为0x100,BMS的ID设为0x200。这样OBC的优先级更高,紧急情况下可以打断BMS的报文。这个设计在充电故障处理时特别有用。

控制场

控制场包含IDE位和DLC(数据长度码)。IDE位区分标准帧和扩展帧,DLC告诉接收方数据场有多少字节。注意:DLC只能是0到8,因为CAN帧最多带8字节数据。

数据场

这就是真正要传的数据,0到8个字节。在OBC通信中,数据场里通常放着电压、电流、温度等参数。我习惯把数据场按小端格式排列,这样和MCU的内存对齐,省去转换的麻烦。

CRC(循环冗余校验)

15位CRC校验码,加上1位CRC界定符。CRC的作用是检测传输错误。我见过一个案例:某OBC在高温环境下CRC错误率飙升,后来发现是CAN收发器的驱动能力不够,导致信号边沿变缓,CRC计算出错。换了个驱动能力强的收发器就解决了。

ACK(应答场)

发送方在ACK槽位发送隐性位,接收方如果正确收到帧,就把这个位拉成显性位。如果发送方没收到显性位,就知道没人收到它的数据,会自动重发。这个机制很巧妙,不需要额外的应答帧。

EOF(帧结束)

7个隐性位,表示帧结束。EOF之后还有3个位的ITM(帧间空间),然后才能发下一帧。

小技巧:我调试CAN总线时,最喜欢用逻辑分析仪抓SOF到EOF的完整波形。看CRC是否正确、ACK有没有被拉低,基本能判断90%的通信问题。记住:先看物理层,再看协议层,别一上来就怀疑软件。

1.5 本章小结

CAN总线从1986年诞生到现在,已经快40年了。它用差分信号解决了抗干扰问题,用仲裁机制解决了多节点冲突,用CRC保证了数据可靠性。这些设计思想,放到今天依然先进。下一章,我会讲CAN总线的位时序和同步机制,这是理解CAN通信精度的关键。

嗯,先消化这些吧。有什么问题,欢迎在评论区交流。