2. J1939协议基础

J1939 是商用车与重型机械领域应用最广的 CAN 高层协议族。它并不是单一协议,而是由物理层、数据链路层、网络层、传输层和应用层共同构成的分层体系。理解这五层各自解决什么问题、报文如何逐层封装、通信机制如何协同,是后续诊断报文解析、故障码读取和网络管理的基础。

一、五层结构的分工与核心对象

J1939 以 ISO 11898-1/-2 的 CAN 物理层与数据链路层为底座,向上定义了网络层、传输层和应用层。物理层规定电气特性、终端电阻、位定时与总线拓扑;数据链路层规定 29 位扩展帧格式、仲裁、位填充与 CRC 校验;网络层负责 8 字节以内的短报文寻址与路由;传输层负责超过 8 字节的数据分包与重组;应用层则定义参数组编号(PGN)、可疑参数编号(SPN)以及各参数的含义、分辨率和量程。

其中最关键的概念是 PGN 与 SPN。PGN 是应用层对一组参数的逻辑编号,决定“这条报文表达什么数据”;SPN 是 PGN 内部单个参数的编号,决定“这个字节或位段代表哪个物理量”。诊断工程师读到的故障码,本质上就是 SPN 加故障模式标识(FMI)的组合。

J1939 五层协议结构与报文封装 应用层 PGN / SPN / FMI / 参数含义 传输层 TP.CM / TP.DT 分包重组(>8字节) 网络层 PGN 路由 / 源地址 / 目标地址 数据链路层 29位扩展帧 / 仲裁 / CRC / 位填充 物理层 CAN_H / CAN_L / 120Ω / 位定时 数据场内容 SPN 数值 + 状态位,按 PGN 定义排列 TP.DT 数据包 序号 + 7字节数据,共 N 包 29位标识符 优先级(3) + PGN(18) + 源地址(8) CAN 扩展帧 SOF + 仲裁场 + 控制场 + 数据场 + CRC + ACK + EOF 差分电平信号 显性/隐性位,双绞线传输 上层数据逐层封装为 CAN 帧;接收端反向解封装,按 PGN/SPN 还原物理量

二、报文格式: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 广播分包。

工程提示:解析 J1939 报文时,务必先确认 PF 与 PS 的取值关系,再计算 PGN。很多解析错误并非数据场问题,而是把点对点报文的 PS 误当成组扩展,导致 PGN 计算错误。

五、常见误区与复盘

  • 误区一:把 PGN 当成 CAN ID。PGN 是应用层逻辑编号,CAN ID 是链路层标识符,两者需要经过优先级、源地址等字段映射,不能直接等同。
  • 误区二:忽略传输层超时。TP.CM 与 TP.DT 之间有严格的超时约束,若接收方未在规定时间内响应 CTS,发送方会中止传输并报错。
  • 误区三:混淆 SPN 与字节位置。同一 SPN 在不同 PGN 中的数据场位置可能不同,必须结合具体 PGN 定义解析。
  • 误区四:忽视地址声明。J1939 节点上电后需通过地址声明报文(PGN 0xEE00)申请源地址,地址冲突会导致通信异常。
排障建议:当总线通信异常时,建议按“物理层→数据链路层→网络层→传输层→应用层”的顺序逐层排查。先用示波器确认差分电平和终端电阻,再用 CAN 分析仪检查错误帧与仲裁丢失,最后核对 PGN 与 SPN 解析逻辑。

掌握 J1939 五层结构、29 位标识符与 PGN 映射规则、广播与点对点通信机制以及传输层分包逻辑,是后续诊断报文解析、故障码读取和网络管理工程实践的前提。只有在分层视角下理解每层职责,才能在复杂车载网络中快速定位问题根因。