1. CAN总线基础回顾:物理层与数据链路层核心概念
各位同学,咱们今天正式开课。做CAN总线诊断这么多年,我见过太多工程师一上来就拿着CANalyzer抓波形,结果连报文都读不懂。说白了,基础不牢,地动山摇。今天这一章,咱们就把CAN总线最核心的物理层和数据链路层掰开揉碎了讲清楚。
1.1 物理层:信号是怎么在线上跑的
CAN总线物理层,说白了就是两根线——CAN_H和CAN_L。它用的是差分信号传输。为什么用差分?抗干扰能力强啊。我当年在测试一款新能源车时,电机启动瞬间干扰特别大,单端信号根本没法看,但CAN总线纹丝不动。
物理层有几个关键参数,我列个表给大家看:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线电平 | 显性:CAN_H≈3.5V,CAN_L≈1.5V 隐性:CAN_H≈2.5V,CAN_L≈2.5V |
显性电平覆盖隐性电平 |
| 传输速率 | 125kbps ~ 1Mbps | 速率越高,总线长度越短 |
| 终端电阻 | 120Ω(两端各一个) | 消除信号反射 |
| 总线长度 | 40m @ 1Mbps | 速率降低可延长距离 |
1.2 数据链路层:报文是怎么组织的
数据链路层负责把物理层的信号组织成有意义的报文。CAN总线有四种报文帧:数据帧、远程帧、错误帧、过载帧。咱们一个一个说。
1.2.1 数据帧——最常用的帧
数据帧用来传输数据。它分标准帧和扩展帧两种。标准帧的ID是11位,扩展帧是29位。你想想看,为什么要有扩展帧?因为现在车上节点太多了,11位ID根本不够用。
数据帧的结构是这样的:
帧起始(1bit) → 仲裁场(12或32bit) → 控制场(6bit) → 数据场(0~8byte) → CRC场(16bit) → 应答场(2bit) → 帧结束(7bit)
这里我重点说一下数据场。最多8个字节,为什么是8个?因为CAN总线设计时考虑的是实时控制,8个字节对于大多数控制信号足够了。我在做发动机ECU测试时,转速、水温、油压这些信号,一个数据帧全搞定。
1.2.2 远程帧——请求数据的帧
远程帧用来请求其他节点发送数据。它的结构和数据帧很像,但没有数据场。我记得有一次,一个同事调试了半天,发现某个节点就是不响应,最后发现是远程帧的ID写错了。嗯,这种低级错误其实挺常见的。
1.2.3 错误帧——总线出问题时的帧
错误帧是节点检测到总线错误时自动发送的。它由错误标志和错误界定符组成。错误标志是6个连续的显性位,这会破坏其他节点的报文,强制所有节点知道出错了。
1.2.4 过载帧——忙不过来的帧
过载帧是节点在接收数据时来不及处理,主动要求延迟发送的帧。说实话,在实际项目中过载帧很少见。我做了这么多年,也就碰到过一两次,而且都是因为节点CPU负载太高导致的。
1.3 总线仲裁机制——谁说了算
CAN总线是广播式的,所有节点都能发。那问题来了:如果两个节点同时发,听谁的?这就是仲裁机制要解决的问题。
仲裁机制的核心是:ID越小,优先级越高。发送时,每个节点逐位比较自己的ID和总线上的电平。如果自己的ID位是隐性(1),但总线上是显性(0),说明有更高优先级的节点在发,自己就乖乖退出发送。
我给大家画个简单的例子:
节点A ID: 0x123(二进制:0001 0010 0011)
节点B ID: 0x456(二进制:0100 0101 0110)
逐位比较:
第1位:A=0, B=0 → 相同,继续
第2位:A=0, B=1 → A是显性,B是隐性
→ B退出发送,A继续
你看,A的ID小,所以赢了。这就是为什么关键信号(比如刹车、油门)的ID要设得小一些。
1.4 位时序——时间怎么算
位时序是CAN总线最容易被忽视的部分。说白了,就是每个bit的时间怎么划分。一个bit被分成4段:同步段、传播段、相位缓冲段1、相位缓冲段2。
为什么要分这么细?因为总线上有多个节点,每个节点的时钟不可能完全同步。通过位时序的调整,可以实现重新同步。
我给大家一个常用的配置参数:
| 参数 | 说明 | 典型值 |
|---|---|---|
| 同步段 | 用于同步,固定1个Tq | 1 Tq |
| 传播段 | 补偿物理延迟 | 1~8 Tq |
| 相位缓冲段1 | 采样点前调整 | 1~8 Tq |
| 相位缓冲段2 | 采样点后调整 | 1~8 Tq |
| 采样点位置 | 通常在87.5%处 | 取决于配置 |
好了,这一章的内容就到这里。物理层和数据链路层是CAN总线的基础,后面咱们用CANalyzer做故障定位时,这些知识会反复用到。下一章,咱们开始实战——用CANalyzer抓第一帧报文。