2. J1939协议基础
J1939 是商用车与重型机械领域应用最广的 CAN 高层协议族。它并不是单一协议,而是由物理层、数据链路层、网络层、传输层和应用层共同构成的分层体系。理解这五层各自解决什么问题、报文如何逐层封装、通信机制如何协同,是后续诊断报文解析、故障码读取和网络管理的基础。
一、五层结构的分工与核心对象
J1939 以 ISO 11898-1/-2 的 CAN 物理层与数据链路层为底座,向上定义了网络层、传输层和应用层。物理层规定电气特性、终端电阻、位定时与总线拓扑;数据链路层规定 29 位扩展帧格式、仲裁、位填充与 CRC 校验;网络层负责 8 字节以内的短报文寻址与路由;传输层负责超过 8 字节的数据分包与重组;应用层则定义参数组编号(PGN)、可疑参数编号(SPN)以及各参数的含义、分辨率和量程。
其中最关键的概念是 PGN 与 SPN。PGN 是应用层对一组参数的逻辑编号,决定“这条报文表达什么数据”;SPN 是 PGN 内部单个参数的编号,决定“这个字节或位段代表哪个物理量”。诊断工程师读到的故障码,本质上就是 SPN 加故障模式标识(FMI)的组合。
二、报文格式:29位标识符与PGN的映射
J1939 使用 CAN 29 位扩展帧。标识符由三部分组成:3 位优先级(P)、18 位 PGN 相关字段、8 位源地址(SA)。其中 PGN 字段又细分为保留位、数据页(DP)、PDU 格式(PF)、PDU 特定(PS)。当 PF 小于 240 时,PS 表示目标地址,属于点对点通信;当 PF 在 240 至 255 之间时,PS 表示组扩展,属于广播通信。
29位标识符结构:
| 优先级 P (3) | 保留 R (1) | 数据页 DP (1) | PDU格式 PF (8) | PDU特定 PS (8) | 源地址 SA (8) |
PGN 计算规则:
若 PF < 240:PGN = DP + PF + 0x00(PS 为目标地址)
若 PF ≥ 240:PGN = DP + PF + PS(PS 为组扩展)
示例:
0x18FEEE00 → 优先级6,PGN=0xFEEE,SA=0x00
0x18F00400 → 优先级6,PGN=0xF004,SA=0x00
数据场最多 8 字节。对于长度不超过 8 字节的参数组,直接使用单帧传输;对于超过 8 字节的参数组,必须借助传输层协议完成分包与重组。这是 J1939 与普通 CAN 报文最显著的区别之一。
三、通信机制:广播、点对点与传输层
J1939 的通信机制可分为三类。第一类是广播通信,典型如 PGN 0xFEEE(发动机转速等实时数据),所有节点均可监听。第二类是点对点通信,通过目标地址指定接收方,典型如诊断请求 PGN 0xEA00。第三类是传输层通信,用于大数据块传输,包括 TP.CM(连接管理)和 TP.DT(数据传输)两种报文。
| 层次 | 核心对象 | 典型参数/报文 | 工程关注点 |
|---|---|---|---|
| 物理层 | CAN_H、CAN_L、终端电阻 | 250 kbps / 500 kbps | 线束阻抗、终端匹配、共模干扰 |
| 数据链路层 | 29位扩展帧、CRC | SOF、仲裁场、ACK | 位定时、采样点、错误帧 |
| 网络层 | PGN、源地址、目标地址 | 0xFEEE、0xEA00 | 地址冲突、路由转发 |
| 传输层 | TP.CM、TP.DT | BAM、RTS/CTS | 分包序号、超时重传 |
| 应用层 | SPN、FMI | SPN 190、SPN 100 | 分辨率、量程、故障模式 |
四、典型场景:读取发动机转速与故障码
假设诊断仪需要读取发动机转速。发动机转速对应 PGN 0xFEEE,SPN 190,数据场前两字节为转速值,分辨率为 0.125 rpm/bit。诊断仪监听总线上的 0x18FEEE00 报文,提取字节 1 和字节 2,按小端格式组合后乘以 0.125,即可得到实际转速。
若需要读取故障码,则使用 PGN 0xEA00 发送请求,目标地址为发动机控制器。控制器返回 DM1 报文(PGN 0xFECA),其中包含灯状态、故障码数量以及每个故障的 SPN 和 FMI。若 DM1 数据超过 8 字节,则自动触发传输层 BAM 广播分包。
五、常见误区与复盘
- 误区一:把 PGN 当成 CAN ID。PGN 是应用层逻辑编号,CAN ID 是链路层标识符,两者需要经过优先级、源地址等字段映射,不能直接等同。
- 误区二:忽略传输层超时。TP.CM 与 TP.DT 之间有严格的超时约束,若接收方未在规定时间内响应 CTS,发送方会中止传输并报错。
- 误区三:混淆 SPN 与字节位置。同一 SPN 在不同 PGN 中的数据场位置可能不同,必须结合具体 PGN 定义解析。
- 误区四:忽视地址声明。J1939 节点上电后需通过地址声明报文(PGN 0xEE00)申请源地址,地址冲突会导致通信异常。
掌握 J1939 五层结构、29 位标识符与 PGN 映射规则、广播与点对点通信机制以及传输层分包逻辑,是后续诊断报文解析、故障码读取和网络管理工程实践的前提。只有在分层视角下理解每层职责,才能在复杂车载网络中快速定位问题根因。