欢迎光临
我们一直在努力

J1939协议学习笔记

1. J1939协议简介

一、协议基础属性:研发 / 应用 / 技术基底

  • 制定主体:美国汽车工程师协会(SAE),是一套标准化的协议组(非单一文件,由多个子标准构成);
  • 核心应用场景:重型车辆及相关移动设备,包括卡车、公交车、移动液压设备(工程机械 / 农机 / 商用车配套液压装置等);
  • 技术底层:基于CAN 总线(ISO11898 标准) 开发的高层协议,是对 CAN 底层的拓展和标准化升级;
  • 替代关系:作为旧版 J1708/J1587 协议的升级款,解决了旧协议传输速率低、扩展性差的问题,成为重型车辆通信的主流标准。
  • 二、协议分层架构:3 大核心层 + 子标准编号

    分层对应子标准核心功能
    物理层 J1939/11 定义重型车辆适配的电气接口(如屏蔽双绞线、250Kbps 固定传输速率、终端匹配要求等)
    数据链路层 无专属编号(核心参考 J1939/21) 制定报文构建规则(如 29 位 ID 格式)、总线访问仲裁、故障诊断与数据传输规则
    应用层 J1939/71/73

    定义报文的实际数据含义(如发动机转速 / 扭矩的参数编码、PGN/SPN 标准定义)

    2. 报文格式及使用方法(J1939/21)

    一、核心传输逻辑:广播为主,单播为辅(J1939 设计核心)

  • 默认广播传输:
    • 大部分报文无目标地址,总线所有设备可直接接收 / 解析,无需主动请求(适配重型车辆中转速、车速等全局共享数据);
    • 优势:兼容性极强,新设备接入无需修改旧程序,软件升级 / 设备拓展成本低。
  • 按需单播传输:
    • 定向请求 / 指令类报文(如仅读取发动机扭矩),可在标识符中嵌入目标地址,实现一对一精准通信,避免无关设备处理无效数据。
  • 二、标识符基础:复用 CAN 2.0B 的 29 位扩展 ID

  • J1939 仅使用 CAN 2.0B 的 29 位扩展 ID(不支持 11 位标准 ID);
  • 对 CAN 标准位做固定限制:
    • 忽略 SOF(帧起始)、SRR(替代远程请求)、IDE(扩展标识位)(仅底层 CAN 协议使用,J1939 解析无需关注);
    • RTR(远程请求位)强制置 0(J1939 不使用 CAN 远程帧,所有数据均为主动发送的数帧)。
  • 三、29 位 ID 核心结构:6 个固定字段

    J1939 将 29 位 ID 按功能拆分为 6 个字段,位长固定,无冗余,是解析报文的基础:

    字段名称位长核心作用
    优先权位(Prio) 3 位 总线仲裁优先级:0 = 最高(如制动 / 转矩控制),数值越大优先级越低(如车速 / 油耗);
    保留位(R) 1 位 备用字段,强制置 0,为协议拓展预留;
    数据页位(DP) 1 位 扩展参数组范围,0/1 两个值,配合后续字段拓展 PGN 定义;
    PDU 格式(PF) 8 位 核心区分字段:判定报文是 PDU1(单播)还是 PDU2(广播);
    特定 PDU(PS) 8 位 含义由 PF 决定(单播 = 目标地址,广播 = 组扩展);
    源地址(SA) 8 位 报文发送设备的地址(0-253 唯一,254 = 未分配,255 = 全局广播);

    四、PDU1/PDU2 核心区分规则(PF 字段是唯一判定依据)

    PS 字段的含义完全由 PF 的数值范围决定,无例外,是区分广播 / 单播的关键:

    PDU 类型PF 字段取值范围PS 字段含义报文类型典型应用场景
    PDU1 0~239 目标地址(接收设备) 定向单播报文 读取某设备的特定参数(如发动机扭矩)
    PDU2 240~255 组扩展(拓展 PGN) 全局广播报文 发送车速、油温等全局共享数据

    五、PGN 核心定义:18 位参数组编号(报文含义的唯一标识)

  • 定义:PGN(参数组编号)是将 “保留位 + DP+PF+PS”4 个字段合并而成的18 位数值,是解读 “报文数据代表什么” 的核心标识(如 PGN=0xF004 对应某类广播参数);
  • 编码逻辑:PGN = (R << 17) + (DP << 16) + (PF << 8) + PS(实操中直接合并十六进制即可);
  • 核心作用:不同 PGN 对应不同的参数含义(如 PGN=61444 对应发动机转速,PGN=65267 对应冷却液温度),是 J1939 报文解析的 “字典索引”。
  • 六、实战案例解析(0x0CF004EE):吃透字段拆解与 PGN 计算

    示例 ID=0x0CF004EE,拆解 + 解读是实操核心,步骤如下:

  • 十六进制拆分:按字节拆分为 0x0C(Prio+R+DP)+ 0xF0(PF)+ 0x04(PS)+ 0xEE(SA);
  • 二进制字段映射:
    • 先将 0x0C 转换为 8 位二进制:0000 1100
    • 按 J1939 29 位结构提取前 5 位有效位:
      • Prio=011(3 位,对应十进制 3)
      • R=0(1 位,固定为 0)
      • DP=0(1 位,数据页为 0)
    • 后续字段:
      • PF=0xF0(8 位,二进制 11110000,十进制 240)
      • PS=0x04(8 位,二进制 00000100,十进制 4)
      • SA=0xEE(8 位,二进制 11101110,十进制 238)
  • 关键判定:
    • PF=240 → 属于 PDU2(广播报文);
    • PS=0x04 → 组扩展 = 4(无目标地址);
    • PGN = R(1 位)+ DP(1 位)+ PF(8 位)+ PS(8 位) → 合并为 0x0F004(18 位,十进制 61444);
    • SA=0xEE → 发送设备地址为 238。
  • 七、地址规则:唯一且有限(实操必守)

  • 设备地址范围:0~253(共 254 个有效地址),网络内必须唯一(两台 ECU 不能用同一地址);
  • 保留地址:254 = 未分配地址(设备未完成地址分配时使用),255 = 全局广播地址(无实际设备对应)。
  • 3. 地址和名称 (J1939/81)
    • ECU 名称(NAME)为 64 位固定长度,是设备全球唯一标识,主要用于 地址冲突仲裁 和设备功能、身份识别。
    • 名称包含随机存取位、行业组、系统实例、车辆系统、保留位、函数、函数实例、ECU 实例、制造商代码、身份编号等字段。
    • 函数字段 0~127 为 SAE 预定义标准设备(发动机、变速箱、仪表等),128~254 为自定义函数,依赖行业组与车辆系统区分。
    • 地址冲突仲裁规则:NAME 数值更小的 ECU 优先级更高,可占用目标地址,NAME 更大的设备需重新选择地址。
    • 有效通信地址范围 0~253,一个网络最多支持 254 个节点 同时在线。
    • 地址 254 为空地址,用于设备上电未配置地址或地址申请失败时使用。
    • 地址 255 为全局广播地址,总线上所有设备都会接收并处理该地址报文。
    • 一个 ECU 可对应 多个名称 + 多个地址,支持在同一物理设备上实现发动机、缓速器等多逻辑节点功能。
    • 设备名称标识功能与唯一身份,地址标识总线上通信位置,二者配合完成组网、通信与冲突处理。
    4. 地址请求
    • J1939 地址分配以静态预分配为主,设备上电即可直接使用,兼顾效率;同时支持动态地址分配,适配后期设备拓展、新增功能的组网需求。
    • 地址请求(动态分配)包含两种核心方式,均为设备入网获取合法地址的关键流程。
    • 方式 1(申请指定地址):设备发送报文申请目标地址,全网设备校验地址占用状态;若地址被高优先级设备占用,高优先级设备会回复地址占用报文,设备 NAME 数值越小,地址申请优先级越高。
    • 方式 2(申请可用地址):设备发送地址表请求报文,全网设备回复自身已占用地址;申请设备根据反馈的地址表,自主选择并申请未被占用的地址,适配工具、追踪器等临时接入设备。
    • 动态地址分配为可选机制,仅当设备检测到地址冲突、无预分配地址时触发,避免无意义的总线交互。
    • 大部分 ECU 配置推荐地址(定义于 J1939/71),优先使用推荐地址入网以加快识别速度;仅推荐地址被占用时,设备才触发动态分配流程申请其他地址。
    5. 报文传递(J1939/21和J1939/7x)
    • 报文传递遵循 J1939/21(传输规则)和 J1939/7x(应用规范),核心原则为相关数据合并传输,减少控制报文占用总线资源。
    • J1939/71 定义标准 PGN,既标识报文参数含义,也规定对应报文的优先级和传输速率,是报文解析和传输的核心依据。
    • 设备无指定参数数据时,对应字节固定填充0xFF(表示 “无法获得”),接收器可据此识别数据丢失,无需额外交互确认。
    • CAN 单帧仅支持 8 字节数据,超 8 字节的大数据需通过多数据包传输,传输规则遵循 J1939/21,核心分两种传输方式。
    • 多包传输包含广播通知报文 (TP_BAM) 和连接管理 (TP_CM) 两类,分别适配不同的大数据传输场景
    6. TP_BAM报文
    • TP_BAM 是 J1939 超 8 字节大数据的广播式多包传输方式,基于全局地址通信,总线中所有设备均可接收该类报文。
    • TP_BAM 传输以CM 连接管理报文为起始,固定 PGN=0x00EC00,报文中的控制字节用于标识当前为 TP_BAM 传输类型。
    • 后续的实际业务数据,通过DT 数据传输报文分段发送,DT 报文固定 PGN=0x00EB00,承接 CM 起始报文完成整包数据传输。
    • TP_BAM 无点对点交互确认,仅单向广播传输,适配需全网设备同步接收大数据的场景,传输效率高。
    7. TP_CM报文
    • TP_CM 是 J1939 里两点之间一对一的多包传输方式,只在发送方和接收方之间通信,不广播。
    • 传输以 CM 报文(PGN=0x00EC00) 开始,控制字为 RTS(请求发送),并携带总字节数、总包数、要传输的 PGN 信息。
    • 接收方回复 CTS(清除发送) 的 CM 报文,告知可以接收的包数量和起始包号。
    • 发送方按 CTS 要求,用 DT 数据报文(PGN=0x00EB00) 分段发数据。
    • CTS 与 DT 反复交互,直到所有数据发完。
    • 传输完成后,接收方发 EOM(结束确认) 的 CM 报文,连接正式关闭。
    • 整个过程有握手、有确认、有流控,可靠但比 TP_BAM 复杂。
    8. 报文接收(J1939/21和J1939/7x)
    报文类型处理规则
    定向地址报文(单播) 检查目标地址是否为本机地址;匹配则必须处理报文,并按要求给出确认 / 应答
    全局请求报文 总线上所有设备(含发送方自身)都必须处理,并回复数据是否可用
    广播报文 设备自行判断报文内容是否与自身相关;相关则处理,无关可忽略,不强制应答
    9. 如何解读J1939报文的示例

    一、示例报文

    CAN 标识符:0xCF00401数据字节:0xFF FF 82 DF 1A FF FF FF

    二、CAN-ID 包含信息解析

    • 优先级:从 ID 高位解析得出,报文优先级为 3
    • 保留位 + 数据页:用于组合计算完整 PGN
    • PF(PDU 格式):0xF0,标识报文为广播类型
    • PS(PDU 特定):0x04,作为组扩展参与 PGN 计算
    • 源地址 SA:ID 最低 8 位,发送设备地址为 1
    • 计算 PGN:0x0F004
    • 报文定义:依据 J1939/71,对应 电子引擎控制器 1 号报文 EEC1

    三、数据字节解析规则

    • 字节为 0xFF 时,表示该参数数据无法获取,为无效值
    • 单字节参数:按协议给定的分辨率 + 偏移量计算实际物理值
    • 多字节参数:采用小端模式,低字节在前,高字节在后拼接计算

    四、报文数据解析过程

  • 无效字节:字节 1、2、6、7、8 均为 0xFF,参数无效
  • 字节 3(0x82 = 十进制 130):发动机转矩百分比计算公式:130 – 125 = 5%
  • 字节 4+5(0xDF、0x1A):发动机转速小端拼接:0x1ADF = 十进制 6879计算公式:6879 × 0.125 = 859.875 rpm
  • 五、J1939 报文通用解读步骤

  • 拆分 29 位 CAN ID,提取优先级、PF、PS、源地址等信息
  • 计算 PGN,对照 J1939/71 确定报文类型与参数定义
  • 过滤数据段中 0xFF 无效字节
  • 按单 / 多字节规则,结合分辨率与偏移量计算真实物理量
  • 赞(0)
    未经允许不得转载:171主机测评 » J1939协议学习笔记
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址