第3章:CAN总线基础——物理层、数据帧结构、波特率设置与测量
大家好,我是你们的老朋友。今天咱们聊聊CAN总线的基础。说实话,我见过太多工程师,一上来就调代码、抓报文,结果车跑起来各种丢帧、总线错误。为什么?说白了,就是物理层和波特率没搞明白。
CAN总线这东西,看着简单,其实坑不少。我刚开始做诊断开发那会儿,也栽过跟头。有一次,一台样车死活连不上诊断仪,折腾了两天,最后发现是终端电阻虚焊了。嗯,从那以后,我养成了一个习惯——先查物理层,再谈协议。
3.1 CAN物理层:信号怎么在线上跑?
CAN总线用两根线传输信号:CAN_H(高线)和CAN_L(低线)。它不像UART那样用单线高低电平表示0和1,而是用差分信号。你想想看,差分信号的好处是什么?抗干扰能力强啊!
具体来说:
- 显性电平(逻辑0):CAN_H比CAN_L高约2V。比如CAN_H=3.5V,CAN_L=1.5V,差分电压约2V。
- 隐性电平(逻辑1):CAN_H和CAN_L都维持在2.5V左右,差分电压接近0V。
关键点:总线空闲时是隐性电平。谁要发数据,谁就把总线拉成显性。这就是所谓的“线与”机制——显性电平会覆盖隐性电平。
我在项目中遇到过一个问题:某供应商的ECU,在高温箱里测试时,CAN_H电压漂到了4V。结果呢?总线一直处于显性状态,其他节点全哑火了。所以,物理层电压范围一定要测,别偷懒。
3.2 终端电阻:为什么必须加?
CAN总线两端各需要一颗120Ω的终端电阻。为什么是120Ω?因为CAN总线的特性阻抗大约是120Ω。不加电阻,信号会在总线末端反射,导致波形畸变。
我记得有一次,一个同事说:“我就测一块板子,不加电阻行不行?”我说你试试看。结果波形振铃得一塌糊涂,数据帧CRC错误率飙升。后来他乖乖焊上了电阻。
避坑指南:我曾经见过有人把终端电阻焊在中间节点上,而不是两端。这样反射抑制效果大打折扣。记住:电阻必须在总线的最远端。
3.3 CAN数据帧结构:报文里藏着什么?
CAN总线传输的基本单位是“帧”。咱们最常用的是数据帧。一个标准数据帧(CAN 2.0A)长这样:
| 字段 | 长度 | 说明 |
|---|---|---|
| SOF(帧起始) | 1 bit | 显性电平,同步所有节点 |
| 标识符(ID) | 11 bit | 决定报文优先级,数值越小优先级越高 |
| RTR(远程帧标志) | 1 bit | 数据帧为显性,远程帧为隐性 |
| IDE(扩展标志) | 1 bit | 标准帧为显性,扩展帧为隐性 |
| DLC(数据长度码) | 4 bit | 表示数据字节数(0~8) |
| 数据场 | 0~64 bit | 实际传输的数据,最多8字节 |
| CRC(循环冗余校验) | 15 bit | 校验数据完整性 |
| ACK(应答) | 2 bit | 接收节点发送显性电平确认 |
| EOF(帧结束) | 7 bit | 隐性电平 |
你可能会问:为什么ID越小优先级越高?因为CAN总线仲裁时,谁先发显性位谁就赢。ID数值小,意味着高位先出现显性,自然就抢到了总线。
个人经验:设计诊断报文时,我习惯把诊断请求的ID设得比普通报文低一些。这样诊断仪发请求时,能更快抢到总线,不会因为被高优先级报文阻塞而超时。
3.4 波特率设置:快与慢的权衡
CAN总线的波特率常见的有125kbps、250kbps、500kbps、1Mbps。波特率越高,传输越快,但总线长度就得缩短。为什么?因为信号在线上传播需要时间,波特率高了,位时间短了,反射和延迟的影响就大了。
我给大家一个参考:
- 125kbps:总线长度可达500米,适合商用车、工程机械。
- 250kbps:长度约250米,J1939协议常用。
- 500kbps:长度约100米,乘用车诊断(ISO 15765)常用。
- 1Mbps:长度约40米,适合短距离高速通信。
设置波特率时,不光要设对数值,还要配好采样点。采样点一般设在位时间的70%~80%位置。比如500kbps,位时间是2μs,采样点设在1.4μs~1.6μs处比较稳妥。
重要提醒:总线上所有节点的波特率必须一致,采样点最好也一致。否则,一个节点采样时另一个节点正在跳变,数据就全乱了。
3.5 波特率测量:怎么知道设对了?
光靠眼睛看代码里的配置,我不放心。我习惯用示波器实测。方法很简单:
- 把示波器探头接到CAN_H和GND上。
- 触发方式设为下降沿触发。
- 抓一个完整的数据帧波形。
- 测量一个位的时间(比如从第一个下降沿到第二个下降沿)。
- 用1除以位时间,就是实际波特率。
举个例子:你配置的是500kbps,位时间应该是2μs。如果示波器量出来是2.1μs,那实际波特率就是476kbps,偏差4.8%。CAN控制器一般能容忍±1%的偏差,超过这个范围就会出问题。
避坑指南:我曾经遇到一个案例,某ECU的晶振精度不够,标称16MHz,实际只有15.8MHz。结果CAN波特率偏了1.25%,在常温下勉强能用,一到高温就疯狂报错。所以,晶振精度一定要选±0.5%以内的。
3.6 常见故障排查思路
如果你遇到CAN通信问题,别急着翻协议栈。按这个顺序查:
- 第一步:测电压。CAN_H对地、CAN_L对地、CAN_H与CAN_L之间。正常时,隐性电平约2.5V,显性时差分约2V。
- 第二步:测电阻。断开所有节点,测CAN_H与CAN_L之间的电阻。正常应该是60Ω(两颗120Ω并联)。如果只有120Ω,说明少了一颗终端电阻。
- 第三步:看波形。用示波器看信号质量。上升沿和下降沿是否陡峭?有没有振铃?
- 第四步:抓报文。用CAN分析仪看有没有错误帧、过载帧。如果有,八成是物理层或波特率的问题。
嗯,这套流程我用了十几年,基本没失手过。你按这个来,能省下不少排查时间。
最后说一句:CAN总线的基础,说白了就是物理层和波特率。这两样搞扎实了,后面的诊断协议、UDS、OBD都是水到渠成的事。别嫌基础,基础不牢,地动山摇。