当前位置: 首页 > news >正文

【标准解析】商用车CAN网络通信标准(J1939)

本篇文章详尽的解析了J1939标准,其定义了商用车上电子控制单元(ECU,如发动机控制器、变速箱控制器、ABS控制器等)之间进行通信的规则,并实现ECU之间的数据交换(如发动机转速、车速、油压、故障代码)和控制指令传递(如巡航控制、PTO控制)。J1939标准化了商用车ECU之间的通信,定义了消息格式(PGN、SPN)、地址分配、数据传输机制、网络管理等规则,不同供应商的ECU只要符合J1939规范,均可无缝的接入到商用车的CAN网络中。

文章不仅立足于J1939标准本身,以一定逻辑关系逐步深入解读,并且还在某些诸如PGN和多包传输等关键点举以实例,帮助读者为后边的AutoSAR基础软件模块J1939TP的理解和使用打好基础。

目录

J1939标准概述

协议数据单元格式

PGN和SPN 

地址管理 

分段多包报文传输 

点对点

广播

传输协议限制

多包传输实例


J1939标准概述

1939标准是由汽车工程师协会 (SAE) 定义的一套基于控制器局域网 (CAN) 的高层通信协议标准,用于商用车和工程机械中电子控制单元的通信。它被设计用于满足重型车辆(如卡车、客车、工程机械、农用机械、船舶发动机等)中电子控制单元 (ECU) 之间进行实时、可靠的数据交换需求。简单来说,它是重型车辆领域广泛采用的“通用语言”,让车辆上不同的电子部件(发动机控制器、变速箱控制器、制动系统控制器、仪表盘、远程信息处理系统等)能够相互理解和交换信息。

J1939是基于CAN的,CAN提供了基本的“物理层”和“数据链路层”,这是OSI模型的最低层。 基本上CAN只允许在CAN总线上进行简单通信,但仅此而已。而J1939作为高层协议,可以实现更复杂的通信(多包传输)。还有许多其他基于CAN的更高层协议,例如CANopen,DeviceNet,UDS,它们通常在各自的行业代表一种一定程度的标准。

J1939是商用车辆(尤其是重型车辆)领域的主导和事实上的标准协议,所以我们可以使用相同的J1939.dbc文件来解析来自不同车企的两辆卡车发动机转速,但是乘用车的车企都会有自己独立的通信报文定义(通信协议/信号矩阵),所以我们无法使用问界M9的DBC来解析小米SU 7的数据。

J1939提供了大量的规范文档,可以从官网进行下载,可根据如下命名结构选择需要的文件。

可以看出,J1939相关的规范文档是根据OSI Layer进行的分类,下面是J1939对应到OSI分层结构的示意图。

我们主要关心以下三个部分:

  • 物理层(J1939/11):描述了针对客车的电气接口。

  • 数据链路层(J1939/21):描述了构建报文、访问总线以及诊断传送故障的规则。

  • 应用层(J1939/71和J1939/73):定义了在网络中传送的每条报文的具体数据,包括PGN以及SPN详情内容解释等。

J1939/11 是 SAE J1939 标准系列中专门定义物理层(Physical Layer)规范的部分,特别是针对电气接口和连接器。简单来说,J1939/11规定了车辆上的电子控制单元(ECU)之间如何通过CAN总线在物理层面的电气特性定义,以确保信号能够可靠地传输。以下是 J1939/11包含的主要内容:

  • 通信速率:规定了通信速率为250Kbps(最新的支持500Kbps)。
  • 连接器:包括类型、引脚分配和电气特性等内容。

  • 传输线路:描述了适用于250Kbps通信速率的电缆和传输线路特性,如采用屏蔽双绞线,总线阻抗为120Ω。

  • 一致性测试:规范中定义的参数(如总线电平)应如何测试验证。

SAE J1939-21的全称是 " Recommended Practice for Serial Control and Communications Vehicle Network - Part 21: Data Link Layer"(J1939数据链路层定义)。它是整个SAE J1939标准家族的核心基础之一,定义了在物理层(如 J1939-11 定义的 250Kbps 双绞线)之上,数据如何在 CAN总线上可靠、有序地传输的规则和机制。简单来说,J1939-21规定了协议数据单元格式、寻址和通信模式、传输协议 - 多帧报文传输的底层通信协议。它是实现 J1939 网络中各 ECU 之间相互“对话”的基础语言规则。

协议数据单元格式

协议数据单元(PDU)由七部分组成,分别是优先级,拓展数据页,数据页,PDU格式,PDU特定域(可作为目标地址、组扩展或专用),源地址和数据。 PDU将被分组封装在一个或多个CAN数据帧(普通CAN扩展帧)中,通过物理介质传送到其他网络设备。每个CAN数据帧中只可能包含有一种PDU(这跟J1939-22不同,该协议定义了在CANFD扩展帧中实现动态组包的功能,一个CAN帧包含了多个PDU,这里就不展开讲了,只聚焦J1939-21的内容)。

下面我们逐一介绍一下PDU格式中各个部分的含义:

  • 优先级(P):占3bit,根据CAN2.0B 的仲裁机制,ID越小优先级越高,按照J1939协议的划分,优先级在整个ID的最前面,实际上依然控制着CAN报文的优先级。只不过在J1939协议中优先级仅仅用于优化发送数据时的报文延迟,接收报文时则完全忽略优先级。 J1939中的优先级可以从最高的0(000b)到最低优先级7(111b)。默认情况下控制类报文的优先级为3,其他报文的优先级为6。 当分配新的PGN或总线上流量改变时,允许提高或者降低优先级。

  • 扩展/数据页(EDP/DP):EDP与DP配合确定参数组描述的辅助页信息,只有在页码0上所有可用的PGN全部分配使用完毕之后,才可以使用页码1。

  • PDU格式(PF)与PDU特定域(PS):PF域主要用于确定PDU的格式,同时它也是PGN的重要组成部分。协议规定PF<240时使用PDU1格式,PF>=240(0xF0)时使用PDU2格式。PS的确定主要取决于PDU格式,当采用PDU1格式时PS域为目的地址(DA),当采用PDU2格式时PS域为组拓展(GE)。PDU1格式的报文既可以发送到特定地址,也可以发送到全局地址(DA=255)。PDU2格式的报文只能发送到全局地址。在PDU1格式的报文中,DA定义消息发送至特定地址,其他设备在接收到此消息时对其进行忽略操作。需要注意的是所有设备应对255(FF)广播地址进行监听和相应。在PDU2格式的报文中,GE作为组扩展位与PDU 格式域的低四位(注意:当PDU 格式域最高四位被置1,说明PS域是组扩展)规定了每个数据页4096个参数组。

PGN和SPN 

参数组(PG)是具有彼此相关性且传输速率相同的一组信号。每个参数组都有唯一的编号,即PGN(Parameter Group Number,参数组编号)。PGN可以通过CAN帧的ID得到,它根据PDU格式不同有所区别:针对PDU1格式报文(PF<240),PGN不需要包含PS部分,因为它表示目标地址(DA),当报文为PDU1格式报文(PF>=240),则PGN需要包含PS部分,因为它表示组扩展(GE)。“数据页”位和“扩展数据页”位也是PGN的一部分,是两位最高有效位。

举两个例子,首先我们举一个PDU1格式的报文。报文ID:0x0CD5FF17,第一个字节是0x0C,转为二进制是 0000 1100,可以看到优先级是011(对应十进制的3),EDP=0,DP=0。第二个字节是PF=0XD5(十进制是218<240),第三个字节是CA=FF,(因为PF<240,则GE为0).所以PGN码是00D500。然后我们再举一个PDU2格式的报文。报文ID:0x18FEEE17,第一个字节是0x18,转为二进制是 0001 1000,可以看到优先级是110(对应十进制的6),EDP=0,DP=0。第二个字节是PF=0xFE(254>240),则第三个字节是GE=0xEE,(因为PF>240, GE=0xCA),第四个字节是0x17,为源地址,代表是谁发送的数据,最终算得PGN码是:00FEEE。我们有了PGN,就可以在J1939-22处查找对应PGN包含的信息。 

  • J1939不仅定义PGN,还定义其内容。所谓的内容就是一般情况下用户自定义私有协议中所说的信号。J1939规范为PGN内容条目定义了术语:SPN(Suspect Parameter Number,参数编号),SPN就是一种信号ID,它可以代表物理值、状态或命令。目前,J1939-DA以表格形式列出了所有指定的SPN。SPN是由SAE 指定的数字。PGN的描述中指定了SPN在PGN内的起始位置(如上图所示)。SPN的解析顺序为从LSB(右)到MSB(左),字母数字数据除外。一个SPN可以存在于多个PGN中。

所有SPN在定义中的描述均相同,且具有以下属性:

  • SPN:参数编号和名称。
  • 说明:SPN参数的通用说明。
  • 数据长度:数据长度(以位或字节为单位)。
  • 分辨率:分辨率,或原始值到物理值的转换公式。 
  • 数据范围:物理值的有效范围。
  • 类型:信号类型,例如测量、状态或应用相关信号。

J1939标准将SPN描述定义为 SLOT (Scaling, Limit, Offset and Transfer Function, 比例、界限、偏移和转换函数)。在SLOT 定义中,通常不使用SPN的整个值范围作为有效数据。例如,如果8个位的值 (28 = 256) 表示 0…255, 则仅将 0…250 定义为有效数据。251…255,描述SPN的属性或状态。在限位开关的定义中,本来一个位(bit)即可表示门状态(打开/关闭)。但是采用SLOT的定义方式,则需要两位,如下:

  • 00 – 打开。
  • 01 – 关闭。
  • 10 – 错误。
  • 11 – SNA (Signal Not Available, 信号不可用)。

通过这种方式可以传递传感器故障或电路断路,并降低解析错误的风险。并且如果相应类型的设备不支持该信号,则使用信号状态SNA(如果SPN的所有位均为1,则SPN的状态为SNA)。

PGN根据使用分为三类,PDU1格式的特定PGN,用于发送给特定地址的ECU,还有PDU2格式的全局PGN,用于发送给CAN总线上所有ECU的参数组,最后也是我们下边要着重讲的,功能参数组。这些参数组不用于交换过程信息,而是用于管理和控制协议本身。主要包含的PGN如下图。

我们后边专门针对地址管理和多包传输来详解这些PGN的使用。


地址管理 

主动参与J1939通信(例如:需发送报文)的每个ECU都需要具备一个全球唯一的64位长度“名称(NAME)”。根据标准定义,NAME描述了设备的标识、编号、来源(生产商)以及功能相关等信息。除了标识功能、产品序列号,在动态地址分配期间,可以使用设备名称确定ECU的优先级。J1939 NAME的组成如下图“64-bit ECU Name Fields”所示。

CAN协议只定义了报文寻址方式,不存在节点寻址信息。这意味着所有信息都由标识符标记,并基于此报文标识符进行数据场信号提取和解析。除报文寻址以外,J1939使用节点地址寻址,其报文标识符中包含有8位发送节点的有效地址,这使得点对点通信成为可能。因此J1939网段中的每个发送节点都必须具备一个有效的节点地址。 节点地址由8个位的值构成,并且可以一次性永久分配到节点(静态网络),也可以在网络中由节点独立搜索分配(动态网络)。使用哪一种网络取决于各自的应用。

如果在卡车的传动系统中以经典方式应用J1939协议,通常会发现一个在车辆出厂时已指定了网络拓扑结构和地址的静态网络。在此类网络中,地址分配和拓扑结构在车辆的整个生命周期内保持不变。在动态网络中,网络的拓扑结构可能会在运行期间发生更改,可能会添加已知和未知的网络节点。网络中甚至可能存在多个同一类型的ECU。动态网络的典型应用是在农业工程中使用的ISO 11783协议,该协议描述了拖拉机与其附加设备(工具)之间的通信。

J1939 的网络管理禁止与普通汽车环境中的网络管理相混淆。汽车中的网络管理用于将网络(子网)中的ECU设置为 “约定”的空闲状态,同时不丢失总线中的任何信息。J1939将该术语定义为动态网络中的通信(进入网络)和设备地址管理的访问控制。其中,设备地址和NAME发挥着关键作用。

J1939网络管理的最简单形式如下:在启动之后和开始通信之前,每个ECU发送“地址声明”,借助“地址声明”参数组(PGN 0x00EE00)公开设备地址和预定义的设备地址。在静态网络中,此操作主要用于确定网络拓扑结构。例如,可以使用诊断工具快速确定车辆中是否存在减速器。

“地址声明”也适用于动态网络。此外,网络管理还可用于解决地址冲突。例如,后加入的ECU使用网络中某节点已在使用的地址,网络管理即可发挥该作用。“地址冲突“确保网络中的所有节点地址都是唯一的,绝不能重复。

NAME用于解决冲突,以及确定地址的优先级。如果通过“地址声明”检测到地址冲突,则所涉及的设备必须比较其NAME。从 MSB (Most Significant Bit, 最高有效位)). 开始,逐位比较。在比较时,CAN仲裁的规则同样适用:0会覆盖1。数值越小的NAME优先级越高,优先级较高的ECU可以使用该地址。在这种情况下,具有较低优先级NAME的ECU的行为取决于其配置,如下为ECU的四种基本配置:

  • 自行配置:地址丢失后,设备将自行搜索介于128到247之间的新地址,并尝试获取该地址。

  •  程序配置:设备会发送带有NULL地址(254)的“地址声明”PGN,表示其“无法声明地址”。可以使用“命令地址”网络管理服务为ECU分配新的设备地址。此操作可以使用外部工具或网络中的“智能”设备来完成。

  • 手动配置:对于此类ECU,只能借助开关设置新地址。此配置的常用方法是根据ECU的位置,借助处理器I/O端口对地址进行编码。例如,车门ECU可以独立确定是在左侧还是在右侧进行安装,然后选择相应的地址。
  • 不可配置:此类ECU只能通过对设备软件进行重新编程来接收新地址。

可能在网络中多次出现的ECU必须支持上述中的“自行配置” 。该配置行为由NAME中的最高有效位(MSB)“仲裁地址(AAC)” 决定。此位用于ECU地址冲突失败后独立搜索新设备地址。如果ECU仅在网络中出现一次,则可以使用固定的设备地址,不必设置“AAC”位。这样操作的结果是,自配置ECU的NAME优先级低于未设置该位的ECU。

J1939网络管理中的一个重要机制是使用“请求”PGN,用于请求网络中ECU的PGN。”地址声明“PGN也体现了该机制的应用。例如,ECU必须通过“地址声明”PGN来回答“地址声明请求”PGN。

注意: 如果发出请求的ECU具有有效地址,则该ECU还必须回答自己的请求。

请求机制常应用于动态网络,并在通信开始时使用。因此,要参与通信的ECU可以在“地址声明”之前请求地址情况。注意:“地址声明请求”PGN是J1939中的例外情况。换言之,该PGN是唯一无需有效地址即可发送的参数组,因此可以从空地址(254)发送。


分段多包报文传输 

PGN的数据长度不限于8个字节。但由于使用CAN作为物理传输层,因此发送方必须将长度超过8个字节的数据包分为多个数据包,然后通过CAN报文分包发送。接收方必须按其顺序进行重组。报文打包时顺序编号被分配给发送到CAN线上的每个包,接收后顺序编号用于将报文包重新组合成报文。最后一个数据包的8个字节的数据场,包含一个字节的顺序编号和至少一个字节的与参数组相关的数据,剩余的未使用的字节全部用0xFF来填充。

J1939标准对此定义了一组规则,即传输协议(TP)。如前文所说,多包传输分别涉及了两个PGN,分别是传输协议命令0x00EC00(TP.CM)和传输协议数据0x00EB00(TP.CM)。下图为传输协议命令,也称连接管理(控制字节为发送CAN帧数据域的第一个字节,后边的字节意义根据控制字节不同而不同)。

下图为传输协议数据,也称数据传输。

可以看出,多包数据传输,CAN帧中数据的第一字节为包序号,第二字节到第八字节为打包的数据内容。如果最后一包不足8个字节,剩余的字节以FF填充 

依据通信类型,定义了以下两种传输协议。

点对点

发送方通过此种协议与接收方建立连接,建立连接之后可以完成点对点的连续数据传输。接收方可以控制和影响各个数据包传输(流控制)。接收方和发送方均可中止连接(例如在发生错误时)。连接模式数据传输协议不受任何时间限制。所有节点均可以最大允许速度彼此交换数据。点对点传输涉及的控制字节包括:

  • TP.CM_RTS:请求发送,控制字节等于16,从控制字节之后的字节顺序表示为【总的报文的大小,字节数,占两个字节】、【总的数据包数,占一个字节】、【响应一个CTS能够发送的最大数据包数,FF16表明对发送节点没有限制,占一个字节】、【打包报文PGN的LSBByte,占一个字节】、【打包报文PGN的中间字节,占一个字节】、【打包报文PGN的MSBByte,占一个字节】。
  • TP.CM_CTS:允许发送,对RTS命令的回答(肯定应答,流控),控制字节等于17,从控制字节之后的字节顺序表示为【可以发送的包数量,占一个字节】、【要发送的下一包编号,占一个字节】、【SAE保留,占两个字节】、【打包报文PGN的LSBByte,占一个字节】、【打包报文PGN的中间字节,占一个字节】、【打包报文PGN的MSBByte,占一个字节】。
  • TP.CM_EmoACK:报文结束应答,控制字节等于19,从控制字节之后的字节顺序表示为【总的报文规模,字节数量,占两个字节】、【包的总数量,占一个字节】、【SAE保留,占两个字节,以FF填充】、【打包报文PGN,占三个字节】。
  • TP.CM_ConAbort:控制字节为255,从控制字节之后的字节顺序表示为【连接中止原因】、【SAE保留,占三个字节,以FF填充】、【打包报文PGN,占三个字节】。

下图为一次点对点的整体流程。

其中TP_DT为之前提到的传输协议数据PGN。


广播

全局通信BAM(Broadcast Announce Message,广播通知消息)。发送方独自管理流控制。报文发送到所有节点,接收方无法干预通信。即使接收方缺少一条报文,也无法传达此情况。如有必要,接收方必须等待新的报文。由于接收方无法影响BAM通信中的流控制,因此发送方必须在各个数据包之间保持最小时间间隔,即50-200毫秒。这样,慢速的网络节点就可以跟上通信的节奏。广播传输涉及的控制字节包括:

  • TP.CM_BAM:广播通告报文,控制字节等于32,从控制字节之后的字节顺序表示为【总的报文规模,字节数,占两个字节】、【总的报文规模,字节数,占一个字节】、【SAE保留,占一个字节,以FF填充】、【打包报文PGN,占三个字节】。

下图为一次广播的整体流程。

 其中TP_DT为之前提到的传输协议数据PGN。

传输协议限制

作为传输协议,肯定有一些时间超时参数,下图为多包传输涉及的一些超时延时时间。

同时,也不可避免会有连接的限制,包括同一时刻,发送节点对一个节点只能发起一个点对点会话发送节点同一时刻只能发起一个广播公告。接收节点必须能够同时接收来自多个不同节点的连接(包括点对点会话和广播公告)。接收节点能够同时支持由同一个发送节点发起的一个点对点会话和一个广播公告。连接状态下,接收节点对来自同一源地址的不同PGN的RTS请求必须被拒绝。

多包传输实例

步骤一:发送者请求发送(TP.CM_RTS)

协议表示有一个23 个字节的消息被拆装成4个数据包将被发送。

步骤二:接收者应答发送(流控,TP.CM_CTS) 

应答表示接收者已经准备好处理从编号 1 开始的 2 个数据包。

步骤三: 发送者传输数据(TP.DT)

发送者通过网络用TP.DT消息发送了前2个数据包。 

发送者通过网络用TP.DT消息发送了前2个数据包。 

步骤四:接受者发送应答发送(流控,TP.CM_CTS)
接收者者再发送了一条TP.CM_CTS消息表示它可以接收从编号3开始的两个数据包。(若在最长延迟500毫秒后,还需要再延时一段时间才能接收数据,那么必须再发一条TP.CM_CTS消息来保持连接。)

步骤五:发送者数据传输 

发送者通过网络用TP.DT消息发送了后2个数据包。

步骤六:接收者发送结束应答(TP.CM_EndofMsgAck)。

一旦3号和4号数据包被传送完毕,接收者发送了一条 TP.EndofMsgACK消息,表示所有的数据包都接收到了,现在关闭连接。


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

相关文章:

  • 使用ONNX模型实现M-LSD算法
  • Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
  • 负载均衡LB》》LVS
  • 9个数据分析指令为工作赋能
  • lambda的惰性求值方法与及早求值方法
  • 嵌入式学习之系统编程(八)IPC、管道(有名与无名)和信号通信(6.3)
  • 10分钟学会使用.Net技术开发一个Ai智能体应用
  • ArcGIS Pro制作水平横向图例+多级标注
  • Python 实现 Web 静态服务器(HTTP 协议)
  • ArcGIS Pro 3.4 二次开发 - 栅格
  • Tauri2学习笔记
  • ArcGIS Pro裁剪栅格影像
  • ArcGIS Pro 3.4 二次开发 - 场景图层
  • Flink 系列之二十二 - 高级概念 - 保存点
  • Notepad++ 官方下载
  • DeepSeek辅助实现的DuckDB copy to自定义函数
  • 十、MySQL InnoDB引擎底层解析
  • Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
  • 职场生存发展指南 | 边界 / 责任 / 社交 / 情绪
  • 每日算法题(12-1)ACM输出九九乘法表-20250609
  • 进网站显示建设中怎么解决/万能推广app
  • 有没有接单做加工的网站/衡阳网站建设公司
  • 如何把网站转网站/做网络推广怎么收费
  • 深圳建工集团/seo外链推广工具下载
  • 新闻网站建设汇报/百度指数功能模块有哪些
  • 农村电商网站有哪些/淄博网站推广