J1939协议

目录

  • 一、前言
  • 二、J1939的报文格式
    • [2.1 帧结构](#2.1 帧结构)
    • [2.2 帧标识符(重新划分29位ID值)](#2.2 帧标识符(重新划分29位ID值))
    • [2.3 帧数据部分](#2.3 帧数据部分)
  • [三、参数群编号PGN 和 可疑参数编号SPN](#三、参数群编号PGN 和 可疑参数编号SPN)
  • 四、J1939报文类型
    • [4.1 命令报文](#4.1 命令报文)
    • [4.2 请求报文](#4.2 请求报文)
    • [4.3 广播/响应报文](#4.3 广播/响应报文)
    • [4.4 确认报文](#4.4 确认报文)
    • [4.5 群功能报文](#4.5 群功能报文)
  • 五、请求报文的处理流程
    • [5.1 指定目标地址的请求](#5.1 指定目标地址的请求)
    • [5.2 全局目标地址的请求](#5.2 全局目标地址的请求)

一、前言

浅聊一下从事汽车电子为什么要学习J1939协议。上篇文章我们提到CAN总线定义了物理层和数据链路层,而我们实际开发过程中可能更在意的是通过上层去满足项目需求。而J1939便是基于CAN的应用层协议之一(J1939不仅规范了应用层,本文只讨论应用层)。J1939是SAE的推荐标准,广泛应用于商用车(重卡、大客车等道路车辆和工程机械、农业机械、轨道机车、船舶等非道路车辆及设备)上各电子部件间的数字通信。

二、J1939的报文格式

J1939重新划分了CAN报文结构,且是建立在CAN的29位ID值上进行重新划分。主要分为三部分:帧结构、帧标识符和帧数据部分。

2.1 帧结构

  • IDE(1bit,一定是1,代表29位ID值)
  • RTR(1bit,0为数据帧,1为远程帧)
  • 保留位(2bit)
  • DLC(4bit,决定数据部分的长度)

2.2 帧标识符(重新划分29位ID值)

  • 优先级-P(3bit,最高000,最低111,默认011)
  • 保留位-R(1bit)
  • 数据页-DP(1bit)
  • PDU格式-PF(8bit)
  • 特定PDU-PS(8bit,如果PF的值在0-239,PS则为目标地址;如果PF的值在240-255,PS为组扩展)
  • 源地址-SA(8bit)

2.3 帧数据部分

  • 第一个字节:数据包的序列号
  • 其余七个字节:真正的应用层数据
    比如现在需要传输:0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
    则需要分成两帧数据传输,分别为:
    第一帧:0x01 0x00 0x01 0x02 0x03 0x04 0x05 0x06
    第二帧:0x02 0x07 0x08 0x09 0xFF 0xFF 0xFF 0xFF
    所有没有用的字节应置为不可用,全部设置为0xFF。

三、参数群编号PGN 和 可疑参数编号SPN

PGN(8bit)=R(1bit)+DA(1bit)+PF(8bit)+PS(8bit)。虽然PGN表示时是24位,实际上只有18位。它是组相关参数的唯一标识(如发动机数据、刹车状态)。PGN总数为8672个,也就是J1939最多有8672个不同姓名标识的报文。其中PGN(65280-65535)是预留给企业的PGN。

由于J1939协议中涉及车辆的各部分组件太多了,比如电子减速器控制器、电子刹车控制器等等。现需要对这些部组件的参数特征统一编号管理,这个编号就是SPN。简单说SPN就是用于标识PGN中一个具体的信号。

四、J1939报文类型

J1939协议目前支持5种类型的报文通信,分别为命令、请求、广播/响应、确认和群功能,报文的类型由其配置的参数组编号确定。

4.1 命令报文

命令报文是指从某个源地址向特定目标地址或全局目标地址发送命令的参数组。目标地址接收到命令报文后,应根据接收到的报文采取具体的动作。

分析如下图片,可见该报文是变速箱电控单元发给发动机电控单元的扭矩/速度控制,命令发动机输出一定数值的转速和扭矩,则发动机接收到该命令就去执行命令。

4.2 请求报文

请求报文提供了从全局范围或从特定目标地址请求报文的能力。对特定目标地址的请求称为指向特定目标地址的请求,目标地址必须做出响应;如果目标地址不支持请求的PGN,那也必须发出一个NACK的响应以表明它不支持该PGN。

分析如下图片,可见该报文是故障诊断仪请求发动机的电控单元,让它告诉PGN65262所描述的信息。

4.3 广播/响应报文

此报文类型可能是某设备主动提供的报文广播,向总线上的所有节点广播报文信息。此报文类型也可能是命令报文或请求报文的响应。

4.4 确认报文

确认报文是对特定命令或者请求做出的正常广播/ACK/NACK响应,提供了发送方和接收方之间的一种握手机制。

确认报文的数据单元与命令报文比较相似,主要在于帧数据部分不同,具体如下:

byte1:控制位(0为肯定确定;1为否定确认;2为拒绝访问;3为无法响应)

byte2:群功能值

byte3~byte5:0XFF

byte6~byte8:被请求消息的参数群编号

4.5 群功能报文

群功能报文用于特殊功能组(如专用功能、网络管理功能、多包传输功能等),每个组功能由其PGN识别。

专用功能通信并不是标准的通信模式,专用功能报文包括专用A报文和专用B报文。专用A报文为使用PDU1格式(PF<240),其允许制造商将他们的专用报文发送到特定目标节点,各制造商决定如何使用报文的数据域以及报文数据长度。专用B报文为使用PDU2格式(240<PF<255),允许制造商按需定义PS域、数据域的内容以及报文数据长度。综述,专用A报文用于有目标地址的报文,专用B报文用于没有特定目标地址的广播报文。

五、请求报文的处理流程

5.1 指定目标地址的请求

举例,变速器的电控单元(0x03)向发动机电控单元(0x00)发送请求报文,请求发动机序列号为PGN65259(0x00FEEB)。

0x83 0x18 0xEA 0x00 0x03 0xEB 0xFE 0x00

首先发动机电控单元先判断是不是来了请求PGN(0x00EA00),然后在判断报文的PS是不是目标地址。如果满足的话,就核对报文的目标地址0x00是否和自己的地址(0x00)一致,如果地址信息也一致,则把4字节的ID(0x18 0xEA 0x00 0x03)和3字节的数据包(0xEB 0xFE 0x00)存在请求队列中,等待单片机空闲时处理这些信息。

5.2 全局目标地址的请求

举例,变速器的电控单元(0x03)向全局地址(0xFF)发送请求报文,请求发动机序列号为PGN65259(0x00FEEB)。

0x83 0x18 0xEA 0xFF 0x03 0xEB 0xFE 0x00

首先发动机电控单元先判断是不是来了请求PGN(0x00EA00),然后在判断报文的PS是不是全局地址(0xFF)。如果满足的话,则把4字节的ID(0x18 0xEA 0x00 0x03)和3字节的数据包(0xEB 0xFE 0x00)存在请求队列中,等待单片机空闲时处理这些信息。发动机电控单元需要核对请求报文中的PGN65259是不是自己的PGN,是就回复一个数据帧给变速器的电控单元(0x03)。