J1939概括
SAE J1939 是商用车领域网络和通信的一种开放标准,定义了商用车中ECU如何通过CAN总线进行通信,该协议几乎覆盖所有商用车。比较经典的应用场景便是公交车、大卡等,农业、军工、船舶等领域也有一定的应用。协议工作在250k(新协议支持500k),使用29位CAN标识符。
J1939法规文件结构
J1939提供了大量的规范文档,可以从官网进行下载,可根据如下命名结构选择需要的文件。
下图为已有的章节及文档
协议数据单元
协议数据单元(PDU)由七部分组成,分别是优先级,拓展数据页,数据页,PDU格式,PDU特定域(可作为目标地址、组扩展或专用),源地址和数据场。 PDU将被分组封装在一个或多个CAN数据帧中,通过物理介质传送到其他网络设备。每个CAN数据帧只可能有一种PDU
优先级(P)
这三位仅用作优化消息延迟使用,接受者会对其进行忽略。报文优先级最高为0最低为7,所有控制报文的缺省优先级为3;其他报文、请求、专用和ACK的缺省优先级为6。
数据页(DP)
用于选择参数描述的辅助页
PDU格式(PF)
PF域主要用于确定PDU的格式,同时它也是PGN的重要组成部分。协议规定PF<240时使用PDU1格式,PF>=240时使用PDU2格式
PDU特定域(PS)
PS的确定主要取决于PDU格式,当采用PDU1格式时PS域为目的地址(DA),当采用PDU2格式时PS域为组拓展(GE)
PDU1格式
PDU2格式
目的地址(DA)
定义消息发送至特定地址,其他设备在接收到此消息时对其进行忽略操作。需要注意的是所有设备应对255(FF)广播地址进行监听和相应
组拓展(GE)
组扩展与PDU 格式域的低四位(注意:当PDU 格式域最高四位被置1,说明PS域是组扩展)规定了每个数据页4096 个参数组
参数群编号(PGN)
在 CAN 数据帧的数据域中需要指明参数群时,PGN 表示成 24 位,包括以下要素:拓展数据页、数据页位、PDU 格式域和PDU特定域。转化到 PGN 的过程中,若 PF小于 240(F016),PGN 的低字节置 0,反之则将其设置为PDU特定域的值。
可通过下载在线文档到本地用于自动转换 https://docs.qq.com/sheet/DSXNnSURoeURQS1d1?tab=000001
报文类型
1939共定义了五种报文类型,分别为命令、请求、广播/响应、确认和组功能。特定消息类型由其分配的参数群编号识别。针对出现在 CAN 数据帧中数据域的多字节参数,优先存放在最低字节。因此,如果要将一个2字节的参数存放在 CAN 数据帧的字节 7 和字节 8中,LSB 应被放在字节 7,MSB 应放在字节 8。
命令
此消息类型包括那些从某个源地址命令特定目的地或全局目的地的参数群,目的地接收到命令类型的消息后应该采取特定的动作。PDU1 格式(PS 为目标地址)和 PDU2 格式(PS 为群扩展)都能用作命令。命令类型的消息可能包括传动控制、地址请求、扭矩/速度控制等。
请求
请求类型的报文提供了从全局范围或从特定目标地 址请求信息的能力。 最典型的一个请求类型的报文是“请求PGN”报文。
对于特定目标地址的请求,目标地址必须做出响应。如果目标地址不支持请求的PGN,也必须发出一个NACK 的响应以表明它不支持该PGN。有些PGN 是多包的,因此一个单帧请求的响应可能有多个CAN 数据帧。如果是全局请求, 当一个节点不支持某个PGN 时,不能发出NACK 响应。
决定发送 PGN 到全局或特定地址一般有以下规则
广播/响应
此报文类型可能是某设备主动提供的报文广播,也可能是命令或请求的响应。总线上的数据交换大多采用这类报文,如ECU以一定的周期广播某个参数。
确认
确认报文有两种形式。第一种是 CAN 协议规定的,它由确认消息已被至少一个节 点接收的“帧内”确认组成。另外,如果没有出现 CAN 出错帧,消息将被进一步确认,不出现出错帧意味着所有其他的开启并连接在总线上的设备都正确地收到了此消息。 第二种形式的确认由应用层规定,是对于特定命令、请求的“普通广播”或“ACK” 或“NACK”响应。最典型的一个确认类型的报文是“Acknowledgment”报文
肯定确认:控制字节=0(ACK)
否定确认:控制字节=1(NACK)
拒绝访问:控制字节=2
无法响应:控制字节=3
组功能
此消息类型用于一组特殊功能(如专用功能、网络管理功能、多组传输功能等),每个组功能由其 PGN 识别,具体可见SAE J1939-21
常规测试点
重放
与常规重放一致,不过多介绍
UDS诊断
J1939使用29位CAN标识符,根据ISO-27145可知其诊断格式应为18DAXXF1
因此我们可以构造18DBFFF1用于广播进行诊断,跟根据返回数据使用18DAXXF1进行针对性诊断。另外除了F1以外还可以使用F9,F9在J1939中为诊断仪地址。剩下的变就是常规UDS测试,对于UDS一般有常规测试点如:27、22、2E等