在乘用车领域比较熟知的是CAN(FD)、LIN、FlexRay、Ethernet等通信协议,但对于J1939往往所知甚少。其实在CAN总线协议诞生之初,J1939协议便随之诞生,并且始终在商用车、工程机械等领域发挥着重要作用。而在乘用车领域,随着新能源汽车的发展,为了保证电动汽车与充电基础设施互联互通,我国在2015年发布了GB/T 27930-《电动汽车非车载传导式充电机与电池管理系统之间的通信协议》,其使用的也正是J1939协议。因此,本期将对J1939协议做个基础介绍,方便大家快速了解J1939协议包含的内容。
J1939是由美国汽车工程师学会(Society of Automotive Engineers,简称SAE)开发的一系列标准,其目的是使不同制造商的车辆和设备能够在同一个网络上进行通信,实现数据交换和协作。J1939是基于CAN总线技术的,主要的通信速率是250Kbps或500Kbps,通常采用广播通信的方式,同时也支持点对点通信。
在20世纪后半叶,随着商用车辆、重型机械设备等对多功能化和电子化的需求急剧增加,其内部不同子系统之间需要进行高效的通信和协作来实现更先进的控制和监控功能。同时,为了在不同制造商和设备之间实现互操作性来确保不同系统之间的通信能够无缝进行,制定一套标准化的通信协议变得尤为重要。而此时CAN总线技术的出现为实时、可靠且高速的通信提供了可能。在此背景下,一直倡导在汽车和机械领域制定标准的美国汽车工程师学会(SAE)组织开发了J1939协议的一系列标准规范,该工作于1994年左右开始,并在1998年正式发布了J1939协议,成为了商用车辆和重型机械设备领域中通信和控制的主要标准之一。
J1939采用分层通信结构,主要包括物理层、数据链路层、网络层和应用层,其中CAN提供了基本的“物理层”和“数据链路层”。这种分层结构有助于管理复杂的通信系统,使不同层次的功能分开,同时有助于确保J1939协议在不同的商用车辆和重型机械设备应用中具有灵活性和可扩展性。
J1939协议的标准文档构成通常包括一系列文件,这些文件共同定义了协议的规范、特性和实施细节。
1)SAE J1939: Serial Control and Communications Heavy Duty Vehicle Network。通常被称为J1939协议的顶级文档,主要包括了关于J1939协议的概述、基本原则和总体架构,以及对其他相关J1939标准和文档的引用,当前最新版本于2023年发布。
2)SAE J1939-01: On-Highway Equipment Control and Communication Network。定义了公路设备实现控制和通信网络所需J1939协议文件的最小子集,当前最新版本于2021年发布。
3)SAE J1939-02: Agricultural and Forestry Off-Road Machinery Control and Communication Network。定义了农林非道路机械实现控制和通信网络所需J1939协议文件的最小子集,当前最新版本于2019年发布。
4)SAE J1939-03: On-Board Diagnostics Implementation Guide。介绍了J1939协议中诊断功能的基本概念,提供了关于如何实施诊断功能的指导,当前最新版本于2021年发布。
5)SAE J1939-05: Marine Stern Drive and Inboard Spark-Ignition Engine On-Board Diagnostics Implementation Guide。提供了关于如何在船舶引擎和尾驱系统上实施诊断功能的指导,当前最新版本于2012年发布。
6)SAE J1939-11: Physical Layer, 250 Kbps, Twisted Shielded Pair。主要关注针对250 Kbps通信速率和使用屏蔽双绞线情况下的物理层规范,当前最新版本于2016年发布。
7)SAE J1939-13: Off-Board Diagnostic Connector。主要定义离线诊断设备连接器的要求,当前最新版本于2016年发布。
8)SAE J1939-14: Physical Layer, 500 kbit/s。主要定义500Kbps通信速率下的物理层规范,当前最新版本于2022年发布。
9)SAE J1939-15: Physical Layer, 250 Kbps, Un-Shielded Twisted Pair (UTP) 。主要关注针对250 Kbps通信速率和使用非屏蔽双绞线情况下的物理层规范,当前最新版本于2018年发布。
10)SAE J1939-21: Data Link Layer。主要关注数据链路层规范,当前最新版本于2022年发布。
11)SAE J1939-22: CANFD Data Link Layer。主要关注基于CANFD的数据链路层规范,当前最新版本于2022年发布。
12)SAE J1939-31: Network Layer。主要关注网络层规范,当前最新版本于2023年发布。
13)SAE J1939-71: Vehicle Application Layer。主要关注应用层规范,当前最新版本于2022年发布。
14)SAE J1939-73: Application Layer – Diagnostics。主要关注应用层诊断规范,当前最新版本于2022年发布。
15)SAE J1939-74: Application – Configurable Messaging。主要定义应用层的可配置消息规范,当前最新版本于2021年发布。
16)SAE J1939-75: Application Layer – Generator Sets and Industrial。主要关注J1939协议发电机组和工业领域的应用,当前最新版本于2021年发布。
17)SAE J1939-81: Network Management。主要关注网络管理规范,当前最新版本于2017年发布。
18)SAE J1939-82: Compliance – Truck and Bus。主要关注卡车和公共汽车领域的合规性要求,当前最新版本于2015年发布。
19)SAE J1939-84: OBD Communications Compliance Test Cases for Heavy Duty Components and Vehicles。主要关注OBD通信的合规性测试,当前最新版本于2017年发布。
J1939物理层的协议主要有J1939-11,J1939-13,J1939-14,J1939-15等。以J1939-11为例,主要包含以下内容:
1)通信速率:规定了通信速率为250Kbps。
2)连接器:包括类型、引脚分配和电气特性等内容。
3)传输线路:描述了适用于250Kbps通信速率的电缆和传输线路特性,如采用屏蔽双绞线,总线阻抗为120Ω。
4)总线拓扑:最大线缆长度为40m,最大支线长度为1m,最大节点数量为30个。
5)一致性测试:规范中定义的参数(如总线电平)应如何测试验证。
6)故障:定义了不同故障情况下的通信行为。
J1939数据链路层的协议主要有J1939-21,J1939-22等。其中J1939-21主要是针对CAN数据链路层,J1939-22则主要是针对CANFD数据链路层。以J1939-21为例,其基于CAN2.0B规范定义了J1939报文的报文格式、报文类型和传输协议等,在物理层之上提供了可靠的数据传输功能,实现应用层报文的数据交换,接下来将针对J1939-21中的定义展开介绍。
1)协议数据单元(Protocol Data Unit, PDU)
J1939报文使用的基于CAN2.0B的拓展帧格式定义了一个完整的标准化通讯策略,通过PDU定义了一个框架,用来组织数据帧中J1939协议相关的信息。PDU由数据帧中的ID和数据场组成,数据帧和PDU的对应关系如下图所示。
图2. CAN2.0B帧格式与J1939PDU的对应关系
▪️P(Priority),优先级字段,用于在仲裁过程中控制报文优先级。
▪️EDP(Extended Data Page),为扩展数据页位,在J1939中固定取值为0。
▪️P(Data Page),数据页位,可用来扩展参数组的数量。
▪️PF(PDU Format),为PDU格式字段,通过不同的取值来确定参数组编号(Parameter Group Number, PGN)是按照PDU1格式还是PDU2格式。
▪️PS(PDU Specific),特定协议数据单元字段,当PF的值为0-239时PS表示目标地址(PDU1格式),当PF的值为240-255时PS字段表示组扩展(PDU2格式),且报文只能广播。
▪️SA(Source Address),源地址字段,整个网络中SA的值必须是唯一的。
▪️Data Field,数据场,对于Classic CAN来说是8个字节,而CANFD则最多有64个字节数据。如果需要传输更多的数据,则需要借助J1939的传输协议。
参数组是应用层中定义的与某个ECU相关的具有相同控制功能的若干个参数的组合,而PGN是用于唯一标识参数组的号码,在应用层中定义。PGN由三个字节组成,从最高位开始的前6个比特默认值为0,然后是EDP位和DP位,接下来两个字节分别是PF和PS。
3)可疑参数编号(Suspect Parameter Number, SPN)
某个特定PDU对应的PGN是由一系列参数组成的,而SPN则是指明该PGN数据场中各个字节对应的是哪些具体的参数。下图为PGN 65262这个参数组的示例,包含发动机冷却液温度、燃油温度、发动机机油温度等参数,不同的参数由不同的SPN区分。
从某个源地址向特定目标地址或全局目标地址发送命令类型的参数组。目标地址接收到命令类型的报文后,应根据接收到的报文采取具体的动作。PDU1 格式(PS为目标地址)和PDU2 格式(PS为组扩展)都能用作命令。命令类型的消息可能包括传动控制、地址请求、扭矩/速度控制等等。
请求类型的报文提供了从全局范围或从特定目标地址获取信息的能力。请求 PGN能定向到特定目标地址的ECU来检查是否支持特定参数组(即被请求的目标地址能否传送特定PGN)。对请求的响应取决于该PGN是否被支持,若是被支持,响应设备会发送被请求的信息,若该PGN不被支持,响应的设备会发送确认PGN来作为否定消息。
设备主动提供的报文通常通过广播报文发出来,如发动机周期性发往全局地址的水温、油温、油压参数组报文。而收到命令或请求后则是通过响应报文进行回复,如变速器接收到发动机控制命令后返回响应。
对于特定命令、请求需要进行应答,包含肯定应答、否定应答、拒绝访问和无法应答。需要注意应答报文必须被发送到全局地址。
组功能报文是完成某项任务(如专用功能、网络管理、多包传输功能)的若干子功能的集合,通过请求对应组功能的PGN可以探查是否支持该组功能。
当被传输的数据大于8字节(对于CANFD则是大于64字节),需要使用传输协议对参数组进行拆包与重组和连接管理,实现多包传输。
当需要传输的数据域无法用一个单独的CAN数据帧完全装载时(数据长度大于8个字节),例如一个PDU的数据域包含18个字节,就需要将数据域拆分。在拆包和重组过程中,使用数据场的第一个字节作为序列号为拆包进行排序,接收方则根据这个序列号对接收到的多个包进行排序重组。第一个J1939报文的数据场包含序列号1和数据域的前1-7个字节,第二个J1939报文的数据场包含序列号2和数据域的其后的8-14个字节,最后一个J1939报文的数据场就包含序列号3和数据域最后的四个字节,数据场剩下未使用的字节全部填充为0xFF。
连接管理指的是传输单个较大参数组的双方之间建立虚拟连接过程中涉及的建立连接、使用连接传输数据和关闭连接三个过程。连接管理使用的是PGN 60416,相关的报文称为Transport ProtocolConnection Management(TP.CM),包含Connection Mode Request to Send(TP.CM_RTS), Connection Mode Clear to Send(TP.CM_CTS), End of Message Acknowledgment(TP.CM_EndOfMsgACK), Connection Abort(TP.Conn_Abort), Data Transfer Message (TP.DT), Broadcast Announce Message(TP.CM_BAM)。点对点通信的连接管理过程如下所示:
当某个发送节点需要传输超过8个字节的数据时,首先发送TP.CM_RTS报文,并且携带了需要传输数据的总长度。接收节点收到TP.CM_RTS之后,可以通过发送TP.CM_CTS报文表示可以发送,连接建立成功,其中TP.CM_CTS报文中携带了发送方允许发送报文的数量信息。
当发送节点收到TP.CM_CTS报文后开始通过TP.DT报文发送拆包后的数据,根据TP.CM_CTS报文中的数量信息发送特定数量后需等待下一个TP.CM_CTS报文才能继续发送数据包。
当接收节点接收最后一个数据包后,向发送接节点发送TP.CM_EndOfMsgACK报文表示数据接收完毕关闭连接。
对于广播发送大数据包时的连接管理则比较简单,不需要建立连接和关闭连接,只需要发送方通过TP.CM_BAM报文通知接收方即将会发送大包数据。
SAE J1939网络层的协议主要有J1939-31等,主要描述了J1939不同网段之间进行通信需要的服务和功能。介绍了四种为不同网段之间实现互连提供功能的ECU类型:转发器(实现转发功能)、网桥(实现转发和过滤功能)、路由器(实现转发、过滤和地址转换功能)和网关(实现转发、过滤、地址转换和报文重组功能)。
SAE J1939应用层的协议主要有J1939-71,J1939-73等。
J1939-71定义了针对车辆应用的信号(即SPN)和报文(即PGN)。下图分别是该规范中发动机燃气流量PGN 61450参数组的定义和发动机进气质量流量SPN 132的定义。
DM1 – Diagnostic Message 1:DM1报文用于报告当前故障和相关的故障信息,它提供了有关车辆或设备上发生的故障的详细信息,包括故障代码、故障位置、严重性等。DM1报文的PGN是65226,该报文是法规强制要求实现的,通常是以广播形式周期性发送。
DM2 – Diagnostic Message 2:DM2报文用于报告历史故障和相关的故障信息,其PGN是65227。
DM3 – Diagnostic Message 3:DM3报文用于清除记录的诊断故障码,其PGN是65228。
另外在J1939-73中还定义了DTC(Diagnostic Trouble Code)的格式,长度为4个字节,如下表所示。此处SPN主要用于识别诊断信息所关联的对象,FMI定义了SPN的故障模式,OC表示故障发生的次数,CM位目前协议规定其值应为0,其取值为1主要是为了兼容早期版本,此时对应的SPN还需要经过换算才能得到真实的SPN值。
J1939的网络管理协议主要是J1939-81,需要注意的是此处的网络管理不是用来实现网络休眠唤醒的,而是对节点地址的配置和管理。一般情况下地址都是提前分配好的,因此针对这部分本文不再展开介绍。
J1939协议由各个层级的多个规范组成,本文介绍了当前J1939包含的协议并针对部分常见协议做了介绍。协议的规范以及版本众多给不同节点之间的互操作性带来了挑战,因此针对J1939的测试验证是不可缺少的重要一环。北汇信息专注于汽车电子测试、与众多OEM合作,在针对J1939的物理层、数据链路层、应用层的测试开发和测试实施有着丰富的经验,也欢迎大家共同探讨。
1)J1939-11 Physical Layer – 250k bits/s, Twisted Shielded Pair
2)J1939-21 Data Link Layer
3)J1939-71 Vehicle Application Layer
4)J1939-73 Application Layer – Diagnostics
5)https://zhuanlan.zhihu.com/p/628924045
6)https://copperhilltech.com/blog/guide-to-sae-j1939-parameter-group-numbers-pgn/
原文始发于微信公众号(北汇信息):【科普系列】SAE J1939协议解读