
什么是SAE J1939?
我想,那应该是 1939 年吧……
哈哈,这不是一个年份,实际上这个协议的制定工作开始于 1994 年左右,于 1998 年正式发布。
协议制定的背景是,商用车辆与重型机械设备对多功能化、电子化的需求日益增长,其内部各子系统亟需高效通信与协作以实现更复杂的控制与监控功能;同时,为了实现不同制造商设备间的互操作性,确保系统间的无缝通信,于是这个 J1939 就诞生了。
当时,CAN 总线技术已经非常趋于成熟了,于是美国汽车工程师学会(SAE)主导开发了J1939协议系列标准。其核心目标是实现不同制造商的车辆与设备能在同一网络中进行数据交换与协同工作,其通信速率定为250Kbps或500Kbps,通常采用广播通信模式,并兼顾点对点通信能力。
SAE J1939分层结构
但凡提到协议,就不得不拿出一个分层架构来,最典型的就是网络协议的 7 层架构,这里来看一下 J1939 都实现了哪些层。

J1939采用分层通信结构,主要包括物理层、数据链路层、网络层和应用层,其中CAN提供了基本的“物理层”和“数据链路层”。
这种分层结构有助于管理复杂的通信系统,使不同层次的功能分开,同时有助于确保J1939协议在不同的商用车辆和重型机械设备应用中具有灵活性和可扩展性。
SAE J1939物理层
- 通信速率:规定了通信速率为250Kbps。
- 连接器:包括类型、引脚分配和电气特性等内容。
- 传输线路:描述了适用于250Kbps通信速率的电缆和传输线路特性,如采用屏蔽双绞线,总线阻抗为120Ω。
- 总线拓扑:最大线缆长度为40m,最大支线长度为1m,最大节点数量为30个。
- 一致性测试:规范中定义的参数(如总线电平)应如何测试验证。
- 故障:定义了不同故障情况下的通信行为。
SAE J1939 数据链路层
所谓的数据链路层其实就是指的在物理层上可靠的传输一帧数据,这一帧数是什么样的,一帧是多长,帧结构是怎么组织的,这些就是链路层要规定的。
所以,对于 J1939 的数据协议,也就是 PDU 的定义如下:

虽然看起来 CAN 协议帧的结构很复杂,但是 J1393 利用的就是我们熟知的三个数据域:ID,exID 和 DATA 域。
其中,ID 域部分就像 CANopen 等协议一样做了功能性定义,让CAN 的 ID 域得到了更充分的利用。
单独把 J1393 的 PDU 拿出来看一下:

首先,J1393 利用了 CAN 总线的仲裁机制,在 ID 最开始的 3bit 设置了优先级,这样可以保证一些关键帧得到发送的优先权。
其次,对于 PGN部分,它是上层应用协议规定的,我们管他叫参数组编号。
参数组是应用层中定义的,与某个ECU相关的具有相同控制功能的若干个参数的组合,而PGN是用于唯一标识参数组的号码,在应用层中定义。
应用层中的PGN由三个字节组成,从最高位开始的前6个比特默认值为0,然后是EDP位和DP位,接下来两个字节分别是PF和PS。
PF共8位,0-255,当PF<240时,说明是点对点通信,向特定目标通信,这时PS用于表示目标地址,不用于构成PGN,PGN后8位补0。 这里我们标记为 PDU1 格式。
当PF>=240时,采用广播式通信,这时PS用于构成PGN。这里我们标记为 PDU2 格式。
以上可以知道,一个数据页码DP内共有PGN的个数为点对点和广播的总和,也就是:
240 + 16*256 =4336 个。
这里要举个例子,从应用层文档定义来看一下 PGN 37376

文档对编号进行了定义,同时可以计算验证,37376就是DP、PF换算过来的,其中十进制146转换成十六进制是92,即0x009200。
Tips:我们从这个样例中看到了SPN,这是应用层文档对物理参数或状态做的定义。SPN用于诊断目的,可以报告识别控制器程序的异常操作。
最后,J1939 使用 8个 bit 标记设备的源地址。
Tips:参与1939协议通信的所有ECU都需要有一个唯一的名字(64位数据,动态地址分配时用于确认优先级),同时每个节点还分配有一个唯一的地址(8位数据)。
报文类型
SAE J1939目前支持五种报文类型。
命令
从某个源地址向特定目标地址或全局目标地址发送命令类型的参数组。目标地址接收到命令类型的报文后,应根据接收到的报文采取具体的动作。
PDU1 格式(PS为目标地址)和PDU2 格式(PS为组扩展)都能用作命令。命令类型的消息可能包括传动控制、地址请求、扭矩/速度控制等等。
请求
请求类型的报文提供了从全局范围或从特定目标地址获取信息的能力。
请求 PGN能定向到特定目标地址的ECU来检查是否支持特定参数组(即被请求的目标地址能否传送特定PGN)。对请求的响应取决于该PGN是否被支持,若是被支持,响应设备会发送被请求的信息,若该PGN不被支持,响应的设备会发送确认PGN来作为否定消息。
广播/响应
设备主动提供的报文通常通过广播报文发出来,如发动机周期性发往全局地址的水温、油温、油压参数组报文。而收到命令或请求后则是通过响应报文进行回复,如变速器接收到发动机控制命令后返回响应。
应答
对于特定命令、请求需要进行应答,包含肯定应答、否定应答、拒绝访问和无法应答。需要注意应答报文必须被发送到全局地址。
组功能报文
组功能报文是完成某项任务(如专用功能、网络管理、多包传输功能)的若干子功能的集合,通过请求对应组功能的PGN可以探查是否支持该组功能。

SAE J1939多包数据传输协议
当一个特定参数群以长度从9至1785字节的数据来表示时,数据通信是通过多个CAN数据帧实现的。因此,术语多组是用来描述参数群编号的类型的。
若把参数群定义为多组而在特定场合只传输少于9字节的数据时,参数群以单一的CAN数据帧发送,其中DLC置8。
若某特定参数群传输9字节或者更多字节,将使用“传输协议功能”。
通过传输协议功能的连接管理能力来建立和停止多组参数群的通信。此功能通过传送一系列包含分组数据的CAN数据帧(分组)进行数据通信。另外,传输协议功能还提供了对于目的地特定的传输的流控制和握手功能。
消息的拆包与组包
长度大于8字节的消息无法用一个单独的CAN数据帧来装载。因此,它们必须被拆分为若干个小的数据包,然后使用单独的数据帧对其逐一传送。而接收方必须能够接收这些单独的数据帧,然后解析各个数据包并重组成原始的信息。
数据包
CAN数据帧包含一个8字节的数据域。由于那些重组成长信息的单独数据包必须要能够被一个个识别出来,才可以正确重组,因此把数据域的首字节定义为数据包的序列编号。 每个数据包都会被分配到一个从1到255的序列编号。由此可知,最长的数据长度是(255包×7字节/包=)1785个字节。
序列编号
序列编号是在数据拆装时分配给每个数据包,然后通过网络传送给接收方。接收方接收后,利用这些编号把数据包重组回原始信息。
序列编号将从1开始依次分配给每个数据包,直到整个数据都被拆装和传送完毕。这些数据包将从编号为1的数据包开始按编号的递增顺序发送。
(数据)拆装
考虑本协议的用途,过长的数据这里被认为是与一些9字节长或以上的字符串相关的参数群。
第一个数据传送包包含序列编号1和字符串的头7个字节,其后的7个字节跟随序列编号2存放在另一个SAE J1939/CAN数据帧中,再随后的7个字节与编号3一起,就这样直到原始信息中所有的字节都被存放到SAE J1939/CAN数据帧中并被传送。
多组广播信息的数据包发送间隔时间为50到200毫秒。
对于发送到某个指定目标地址的多组消息,发送者将维持数据包发送间隔的最长时间不多于200毫秒。响应者必须知道这些数据包都是具有相同的标识符。
每个数据传送包(除了传送队列中的最后一个数据包)都装载着原始数据中的7个字节。而最后一个数据包的数据域的8个字节中,除了原始数据,余下未使用的字节全部设置为“FF16”。
(数据)重组
数据包被陆续地接收后,多组消息的数据包将会按照序列编号的顺序重新组合成一长串字节。这一长串字节将被传送给负责处理长数据的应用程序模块。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
没有相关内容!
暂无评论...