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 速率降低可延长距离
个人经验:我建议大家在用CANalyzer做物理层测试时,先量一下CAN_H和CAN_L对地的电压。正常静态时应该在2.5V左右。如果偏差超过0.3V,大概率是某个节点的收发器出了问题。

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个连续的显性位,这会破坏其他节点的报文,强制所有节点知道出错了。

避坑指南:我曾经遇到过一个案例,总线上频繁出现错误帧,用CANalyzer一抓,发现是某个节点的CAN收发器坏了,一直发送显性位。这种问题排查起来很头疼,建议先用示波器看波形。

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%处 取决于配置
关键点:采样点位置很重要。我建议采样点设置在bit时间的80%~90%之间。太早了容易采到信号抖动,太晚了可能来不及处理。在CANalyzer的CAN Statistics窗口里,你可以看到采样点的实际位置。

好了,这一章的内容就到这里。物理层和数据链路层是CAN总线的基础,后面咱们用CANalyzer做故障定位时,这些知识会反复用到。下一章,咱们开始实战——用CANalyzer抓第一帧报文。