2. 车载网络基础
CAN(Controller Area Network)是J1939协议的底层承载网络。理解CAN的物理层、数据链路层、帧格式、仲裁机制与错误处理,是掌握J1939报文收发、地址声明、多包传输和故障诊断的前提。本节从电气信号出发,逐层向上梳理CAN总线的工作机制,并结合J1939应用场景说明关键参数与常见误区。
一、CAN总线核心原理
CAN采用多主、广播式、差分信号的总线结构。所有节点并联在同一对差分线上,任意节点发送的报文都会被总线上其他节点接收。CAN不使用主从轮询,而是通过报文标识符(ID)决定优先级,实现无冲突的仲裁访问。
其核心机制可概括为三点:
- 差分传输:CAN_H与CAN_L电压差表示显性(Dominant,逻辑0)和隐性(Recessive,逻辑1),抗共模干扰能力强。
- 非破坏性仲裁:多个节点同时发送时,ID数值越小优先级越高,显性位覆盖隐性位,失败节点自动退出并等待下次发送。
- 位填充与同步:发送器在连续5个相同电平后插入1个相反电平,接收方据此保持位同步,避免时钟漂移导致采样错误。
二、物理层:电气特性与拓扑
CAN物理层定义总线电平、终端匹配、线缆阻抗和节点连接方式。高速CAN(ISO 11898-2)是车载主流,典型参数如下:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线速率 | 250 kbps / 500 kbps | J1939常用250 kbps,部分商用车用500 kbps |
| 显性电平 | CAN_H≈3.5V,CAN_L≈1.5V | 差分电压约2V |
| 隐性电平 | CAN_H≈CAN_L≈2.5V | 差分电压约0V |
| 终端电阻 | 120Ω × 2 | 总线两端各一个,防止信号反射 |
| 线缆阻抗 | 120Ω 双绞线 | 屏蔽双绞线更佳 |
| 节点数 | 最多30个(典型) | 受驱动能力和总线负载限制 |
物理层故障是车载网络最常见的排障对象。终端电阻缺失会导致信号反射、误码率上升;CAN_H与CAN_L短路会拉低差分电压,使总线进入错误被动甚至总线关闭状态;屏蔽层接地不当会引入共模干扰。使用示波器观察CAN_H/CAN_L波形,是判断物理层健康度的直接手段。
三、数据链路层:帧格式与仲裁机制
CAN数据链路层负责位编码、帧封装、仲裁、CRC校验、应答和错误管理。标准CAN帧分为数据帧、远程帧、错误帧和过载帧,其中数据帧是J1939报文的主要载体。
CAN 2.0B扩展数据帧的关键字段顺序如下:
SOF(1) | 标识符A(11) | SRR(1) | IDE(1) | 标识符B(18) | RTR(1)
| 控制场(6) | 数据场(0~8字节) | CRC(15+1) | ACK(2) | EOF(7) | IFS(3)
J1939使用29位扩展标识符,其编码结构为:
| 优先级P(3) | 保留R(1) | 数据页DP(1) | PDU格式PF(8) | PDU特定PS(8) | 源地址SA(8) |
示例:0x18FEEE00
优先级 = 6
PF = 0xFE(PDU2格式,目标地址在PS中)
PS = 0xEE(目标地址)
SA = 0x00(源地址)
仲裁机制是CAN区别于其他总线的重要特征。当多个节点同时发送时,每个节点在发送每一位的同时回读总线电平。若某节点发送隐性位而总线上出现显性位,说明有更高优先级报文正在发送,该节点立即停止发送并转为接收,等待总线空闲后重发。这一过程不会破坏已获胜报文的任何位,因此称为“非破坏性仲裁”。
四、错误处理与故障界定
CAN节点通过发送错误计数器(TEC)和接收错误计数器(REC)管理自身状态,形成错误主动、错误被动和总线关闭三种状态:
- 错误主动(Error Active):TEC和REC均小于128,节点可正常发送主动错误帧。
- 错误被动(Error Passive):TEC或REC超过127,节点仍可通信,但只能发送被动错误帧,发送后需额外等待。
- 总线关闭(Bus Off):TEC超过255,节点自动脱离总线,停止发送和接收,需软件干预或复位后才能恢复。
常见错误类型包括位错误、填充错误、CRC错误、格式错误和应答错误。J1939网络排障时,若某节点频繁进入Bus Off,通常需要检查:终端电阻是否正常、CAN_H/CAN_L是否短路或反接、波特率是否一致、是否存在强干扰源、节点供电是否稳定。
五、案例:J1939报文发送失败的排查路径
某商用车在整车联调时,发动机ECU的J1939报文无法被仪表接收。按以下顺序排查:
- 用示波器测量CAN_H/CAN_L静态电平,确认隐性电平约2.5V,排除短路。
- 测量总线两端终端电阻,应为约60Ω(两个120Ω并联),若为120Ω说明一端缺失。
- 用CAN分析仪监听总线,确认波特率是否为250 kbps,观察是否有错误帧。
- 检查发动机ECU的29位ID配置,确认PF、PS、SA是否符合J1939地址声明结果。
- 查看ECU错误计数器,若TEC持续上升,重点检查线束屏蔽和接地。
最终发现是仪表节点终端电阻未焊接,导致信号反射,发动机ECU在仲裁和应答阶段频繁出错,TEC累积后进入错误被动,报文被大量丢弃。补焊终端电阻后通信恢复正常。