一、PDU
SAE J1939协议是美国汽车工程协会的推荐标准,它基于CAN总线,对扩展数据帧中仲裁场的29位标识符进行重新解释,帧的其他部分不变。它包含一个单一的协议数据单元PDU。
PDU的构成如下,不同的应用场景,个别位的解释可能会不同,但总体并不影响使用。
P:优先权,从最高0设置到最低7。
R/EDP:保留位/扩展数据页,以备后续开发使用。一般设置为0。
DP:数据页,选择参数群描述的辅助页,从页0开始分配,一般设置为0。
PF:PDU格式,它有两个功能,一是确定PDU的格式,PDU分为两种格式PDU1和PDU2。二是确定数据域对应参数群编号的域。参数群编号不仅用来标识命令、数据、请求、确认和否定外,还可以标识CAN多包发送的信息。
PS:PDU特定,它的定义取决于PDU的格式,如下图所示
目标地址用DA标识,全局目标地址(255)要求所有设备作为消息响应者做出监听和响应。
SA:源地址。
二、PGN
PDU中有一个重要的概念——参数群编号PGN,因为汽车中有许多参数,为了方便,把这些参数归类,把一些参数放入一个组中,而PGN就是用来描述这个组的编号的。知道了包中的PGN,我们就知道了这个包所传输的数据是什么。
PGN的组成如下图所示,PGN一共有24位,实际有效的位数只有1+1+8+8=18位,故剩余的6个高位全部补0。
下图具体分析了PGN的构成,非常重要:
首先PGN一共3个字节,
第1个字节的8-3位是填充位,都填充为0,位2是R,位1是DP,可以看到DP为0或1。
第2个字节是PF,它分为两段,一段是0-240,这一段*有240个编号,因为PS是目的地址。但当PF是240-255时,这一段的编号就大大增加,因为此时PS不再是目的地址,而是扩展编号,即PF和PS一同表示编号,故编号数大大增加。
第3个字节是PS,它与PF息息相关,PF是0-240,PS是目的地址,PF是240-255,PS与PF一起共同表示编号。
三、SPN
SPN,特定参数,它就是用来表示具体的物理参数。比如SPN190=发动机转速、SPN513=扭矩。就是说一个SPN码代表了一个物理参数。
之前讲的PGN所代表的的参数组,就是由一个个的SPN组成的。例如PGN 61444=发送机控制器参数组,这个参数组里面包含了发动机转速、扭矩等。即PGN 61444=SPN 190+SPN 513+…。
而每个帧中数据的部分就是SPN的实际数据,假设PGN所代表的的参数组是由2个SPN构成的,第一个SPN为2字节,第二个SPN为3字节,那么这个帧数据的大小就是5字节。
四、多包发送
CAN总线一个帧最多只能发送8个字节,而SAE中的PDU支持0~64个字节,故超出8个字节,就需要多包发送,即传输协议功能。
发送者需要先请求发送消息RTS,RTS里面包含了整个消息的字节数,要传送的消息包数等。当节点接收到之后,需要响应一个CTS,CTS里面包含了想要接收的第一个数据包的序列编号等。而RTS和CTS都是用一种特殊的PGN,PGN=0xEC00。
RTS数据域的具体格式如下:
CTS数据域的具体格式如下:
一旦发送者接收到了CTS,就要开始发送数据,每一个数据包都是8个字节,第一个字节代表了数据包的序列编号,从1开始。而真正的有效数据字节只有7个。如果要发送的数据无法填充满8个字节,则用0xFF补全。数据包也是使用一种特殊的PGN,PGN=0xEB00。
数据包的具体格式如下:
下图是一个实际的传输过程
首先,发送者发送了一个RTS,控制字节是0x10,整个消息的字节大小为9,全部数据报数为2,PGN=0x001100。
其次,接收者响应了一个CTS,控制字节是0x11,接收的数据包数为2,要请求的数据包编号为1,PGN=0x001100。
后面紧跟着两个数据包,包编号分别为1和2,数据包的字节大小为9,余下的部分用0xFF补全。
通过查看PGN=0x001100发现,它确实是一个需要发送9字节的报文。
这里还没有消息结束应答包,有的CAN总线多包发送完后,有一个结束应答包。结束应答包的控制字节为0x13。