一、协议数据单元(PDU)
1. 优先级(P)
消息优先级可从最高 0(000)设置到最低 7(111)。
2. 保留位(R)
保留此位以备今后开发使用。
3. 数据页(DP)
用来选择参数组描述的辅助页。
4. PDU格式(PF)
用来确定PDU的格式,以及数据域对应的参数组编号。
5. 特定PDU(PS)
特定 PDU 是一个 8 位域,它的定义取决于 PDU 格式(PF),根据 PDU 格式(PF) 它可能是目标地址或者群扩展。
- 若 PDU 格式(PF)段的值小于 240,特定 PDU 段是目标地址。
- 若 PDU 格式(PF)段的值在 240 和 255 之间,特定 PDU 包含 群扩展(GE)值。
6. 源地址(SA)
源地址域长 8 位。网络中一个特定源地址只能匹配一个设备。
因此,源地址域确保 CAN标识符符合 CAN 协议中的唯一性要求。
7. 数据域
- 当用不多于 8 字节的数据即表示一个给定参数群时,可使用 CAN 数据帧全部的 8 个字节。
- 当一个特定参数群以长度从 9 至 1785 字节的数据来表示时,数据通信是通过传输协议功能的连接管理能力来建立和关闭多包参数组的CAN通信。
二、传输协议功能(多包数据传输)
传输协议功能是数据链路层的一部分,它可再细分为两个主要功能:消息的拆装和重组 和连接管理。
在以下的段落中,
术语 “发送者”(originator) 指那些发出请求发送消息的电控单元或设备。
术语 “响应者”(responder) 指那些发出应答发送消息的电动单元或设备。
1. (消息)拆装和重组
长度大于8字节的消息无法用一个单独的CAN数据帧来装载。
因此,它们必须被拆分为若干个小的数据包,然后使用单独的数据帧对其逐一传送。
而接收方必须能够接收这些单独的数据帧,然后解析各个数据包并重组成原始的信息。
(1)数据包
CAN数据帧包含一个8字节的数据域。由于那些重组成长信息的单独数据包必须要能够被一个个识别出来,才可以正确重组,因此把数据域的首字节定义为数据包的序列编号。
每个数据包都会被分配到一个从1到255的序列编号。
由此可知,最长的数据长度是(255包×7字节/包=)1785个字节。
(2)序列编号
序列编号是在数据拆装时分配给每个数据包,然后通过网络传送给接收方。
接收方接收后,利用这些编号把数据包重组回原始信息。
序列编号将从1开始依次分配给每个数据包,直到整个数据都被拆装和传送完毕。
这些数据包将从编号为1的数据包开始按编号的递增顺序发送。
(3)(数据)拆装
过长的数据,是指那些无法用一个单独的CAN数据帧全部装载的数据(例如,数据域长于8个字节的消息)。
考虑本协议的用途,过长的数据这里被认为是与一些9字节长或以上的字符串相关的参数群。第一个数据传送包包含序列编号1和字符串的头7个字节,其后的7个字节跟随序列编号2存放在另一个SAE J1939/CAN数据帧中,再随后的7个字节与编号3一起,就这样直到原始信息中所有的字节都被存放到SAE J1939/CAN数据帧中并被传送。
每个数据传送包(除了传送队列中的最后一个数据包)都装载着原始数据中的7个字节。而最后一个数据包的数据域的8个字节包含:数据包的序列编号和与参数群相关数据的至少一个字节,余下未使用的字节全部设置为“FF”。
(3)(数据)重组
数据包被陆续地接收后,多组消息的数据包将会按照序列编号的顺序重新组合成一长串字节。这一长串字节将被传送给负责处理长数据的应用程序模块。
2. 连接管理
连接管理是用于处理在特定目标地址传输时节点间虚拟连接的打开、使用和关闭。
(1)多组消息广播
长消息可能是没有指定目标地址的,换句话说,它们是广播消息。
(2)连接的开始
当某个节点传送一条请求发送消息给一个目标地址时,连接就开始了。
(3)数据传输
当连接的发送者接收到准备发送消息后,数据传输正式开始。
(4)连接的关闭
当接收到数据流的最后一个数据包时,响应者将发送一个消息结束应答给消息的发送者。
3. 传输协议----连接管理消息(TP.CM)
连接管理(TP.CM)协议表:
参数群标称符: | 传输协议——连接管理(TP.CM) |
---|---|
定义: | 用于9字节或以上的数据的参数群的传输。 传输协议中所定义的每种特定消息都包含以下定义部分。 |
重复传输速度: | 每次传送一个参数群编号 |
数据长度: | 8个字节 |
数据页位(DP): | 0 |
PDU格式(PF): | 236 |
特定PDU(PS): | 目标地址 |
默认优先级: | 7 |
参数群编号(PGN): | 60416(0x00EC00) |
(1)连接模式----请求发送(TP.CM_RTS)
TP.CM_RTS 消息只能由发送者发送。
数据(字节) | 内容 |
---|---|
1 | 控制字节=16,指定目标地址请求发送(RTS) |
2,3 | 整个消息大小,字节数目(低字节在前) |
4 | 全部数据包的数目 |
5 | 保留给 SAE 设定使用,该字节应设为 0xFF |
6,7,8 | 所装载数据的参数群编号(PGN) |
(2)连接模式----准备发送(TP.CM_CTS)
TP.CM_CTS 消息只能由接收者发送。
数据(字节) | 内容 |
---|---|
1 | 控制字节=17,指定目标地址准备发送(CTS) |
2 | 可发送的数据包数目 |
3 | 下一个将要发送的数据包编号 |
4,5 | 保留给 SAE 设定使用,该字节应设为 0xFF |
6,7,8 | 所装载数据的参数群编号(PGN) |
(3)消息结束应答(TP.CM_EndofMsgAck)
TP.CM_EndofMsgACK 消息只能由接收者发送。
数据(字节) | 内容 |
---|---|
1 | 控制字节=19,消息结束应答 |
2,3 | 整个消息大小,字节数目(低字节在前) |
4 | 全部数据包的数目 |
5 | 保留给 SAE 设定使用,该字节应设为 0xFF |
6,7,8 | 所装载数据的参数群编号(PGN) |
(4)放弃连接(TP.CM_Abort)
TP.Conn_Abort 消息可以由发送者或者接收者发送。
数据(字节) | 内容 |
---|---|
1 | 控制字节=255,放弃连接 |
2~5 | 保留给 SAE 设定使用,该字节应设为 0xFF |
6,7,8 | 所装载数据的参数群编号(PGN) |
(5)广播公告消息(TP.CM_BAM)
TP.CM_BAM 消息只能由发送者发送。
数据(字节) | 内容 |
---|---|
1 | 控制字节=32,广播公告消息(BAM) |
2,3 | 整个消息大小,字节数目(低字节在前) |
4 | 全部数据包的数目 |
5 | 保留给 SAE 设定使用,该字节应设为 0xFF |
6,7,8 | 所装载数据的参数群编号(PGN) |
4. 传输协议----数据传送消息(TP.DT)
数据传送(TP.DT)协议表:
参数群标称符: | 传输协议——数据传送(TP.DT) |
---|---|
定义: | 用于与同一个参数群相关的8字节以上的数据传送。 |
重复传输速度: | 每次传送一个参数群编号 |
数据长度: | 8个字节 |
数据页位(DP): | 0 |
PDU格式(PF): | 235 |
特定PDU(PS): | 目标地址(对于TP.CM_BAM数据传送使用全局地址(DA=255))(对于RTS/CTS数据传送不允许用全局地址) |
默认优先级: | 7 |
参数群编号(PGN): | 60160(0x00EB00) |
TP.DT 数据传送,只能由发送者发送。
数据(字节) | 内容 |
---|---|
1 | 包序号 |
2~8 | 打包的数据内容,如果最后一包不足8个字节,剩余字节用0xFF填充。 |
三、多包数据传输----举例说明
假设:发送者地址----0x55,接收者地址----0x22
1. 帧ID
PDU | P (优先级) | R (保留位) | DP (数据页) | PF (PGN中间两字节) | PS (目标地址) | SA (源地址) | |
帧ID位 | 28 27 26 | 25 | 24 | 23~16 | 15~8 | 7~0 | |
TP.CM 发送者 | TP.CM_RTS TP.CM_Abort TP.CM_BAM | 0x1CEC2255 | |||||
TP.CM 接收者 | TP.CM_CTS TP.CM_Abort TP.CM_EndofMsgAck | 0x1CEC5522 | |||||
TP.DT 发送者 | TP.DT | 0x1CEB2255 |
2. 多包数据传输----流程
具体数据传输次序流程图如下:
具体说明如下:
在传送中数据包成员的PGN 值统一标识为 65259(0x00FEEB)。
步骤1:发送者----请求发送(TP.CM_RTS)
有一个 23 个字节的消息被拆装成 4 个数据包将被发送。
帧ID | 数据1 | 数据2 | 数据3 | 数据4 | 数据5 | 数据6 | 数据7 | 数据8 | |
---|---|---|---|---|---|---|---|---|---|
TP.CM_RTS | 0x1CEC2255 | 控制字 16 | 总字节数 (低字节在前) | 数据包数目 | 保留 | 参数群编号(PGN) | |||
10 | 17 | 00 | 04 | FF | 00 | FE | EB |
步骤2:接收者----应答发送(TP.CM_CTS)
应答表示接收者已经准备好处理从编号 1 开始的 2 个数据包。
帧ID | 数据1 | 数据2 | 数据3 | 数据4 | 数据5 | 数据6 | 数据7 | 数据8 | |
---|---|---|---|---|---|---|---|---|---|
TP.CM_CTS | 0x1CEC5522 | 控制字 17 | 可发送数据包数目 | 数据包开始编号 | 保留 | 参数群编号(PGN) | |||
11 | 02 | 01 | FF | FF | 00 | FE | EB |
步骤3:发送者----传输数据(TP.DT)
发送者通过网络用 TP.DT 消息发送了前2个数据包。
帧ID | 数据1 | 数据2 | 数据3 | 数据4 | 数据5 | 数据6 | 数据7 | 数据8 | |
---|---|---|---|---|---|---|---|---|---|
TP.DT | 0x1CEB2255 | 数据包序号 | 数据内容 | ||||||
01 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | ||
02 | 08 | 09 | 0A | 0B | 0C | 0D | 0E |
步骤4:接收者----应答发送(TP.CM_CTS)
接收者发出一条TP.CM_CTS 消息,表示它想保持连接但不能马上再接收任何数据包。
在最长延迟 500 毫秒后,它必须再发一条 TP.CM_CTS 消息来保持连接。
在这个例子中,接收者者再发送了一条TP.CM_CTS 消息,表示它可以接收从编号 3 开始的两个数据包。
帧ID | 数据1 | 数据2 | 数据3 | 数据4 | 数据5 | 数据6 | 数据7 | 数据8 | |
---|---|---|---|---|---|---|---|---|---|
TP.CM_CTS | 0x1CEC5522 | 控制字 17 | 可发送数据包数目 | 数据包开始编号 | 保留 | 参数群编号(PGN) | |||
11 | 02 | 03 | FF | FF | 00 | FE | EB |
步骤5:发送者----传输数据(TP.DT)
发送者通过网络用 TP.DT 消息发送了后2个数据包。
帧ID | 数据1 | 数据2 | 数据3 | 数据4 | 数据5 | 数据6 | 数据7 | 数据8 | |
---|---|---|---|---|---|---|---|---|---|
TP.DT | 0x1CEB2255 | 数据包序号 | 数据内容 | ||||||
03 | 0F | 10 | 11 | 12 | 13 | 14 | 15 | ||
04 | 16 | 17 | FF | FF | FF | FF | FF |
步骤6:接收者----结束应答(TP.CM_EndofMsgAck)
一旦 3 号和 4 号数据包被传送完毕,接收者发送了一条 TP.EndofMsgACK 消息,表示所有的数据包都接收到了,现在关闭连接。
帧ID | 数据1 | 数据2 | 数据3 | 数据4 | 数据5 | 数据6 | 数据7 | 数据8 | |
---|---|---|---|---|---|---|---|---|---|
TP.CM_EndofMsgAck | 0x1CEC5522 | 控制字 19 | 总字节数 (低字节在前) | 数据包数目 | 保留 | 参数群编号(PGN) | |||
13 | 17 | 00 | 04 | FF | 00 | FE | EB |