大家好,又见面了,我是你们的朋友全栈君。
转自:http://blog.sina.com.cn/s/blog_bf97bd7e0102wl2y.html
这几天在公司看了SAE推行的 J1939标准(SAE:美国汽车工程协会),这里整理下学习要点,主要包含以下几个协议:
物理层 SAE J1939-11(未看)
数据链路层 SAE J1939-21
网络层 SAE J1939-31(未看)
应用层 SAE J1939-71
故障诊断 SAE J1939-73
网络管理层 SAE J1939-81
下面主要介绍数据链路层和应用层:
介绍前,首先介绍下缩写:
PGN:参数组(群)编号
PDU:协议数据单元
SPN:可疑参数编号
SOF:帧起始位
SRR:代用远程请求
RTR:远程传输请求
IDE:标识符扩展为
DLC:数据长度码
J1939-21 数据链路层:
数据链路层:为物理链接之间提供一种可靠的数据传输(发送CAN数据帧必需的同步、出错控制、顺序控制和流控制)。
有几个概念先介绍下:
帧 (Frame):组成一个完整信息的一系列有序的数据位;
其中CAN帧以帧起始(SOF)开始,以帧结束(EOF)结尾;
标准帧:定义为11位标识符
扩展帧:定义为29位标识符
报文(Message):一个或多个具有相同参数组编号(PGN)的CAN数据帧;(一个或多个
CAN数据帧具有相 同PGN号,就是报文)
包(Packet):一个单一的CAN数据帧就是1个包;(一个报文包含参数组的长度小于等
于8字节,也称为包)
多包报文:当具有相同参数组编号(PGN)的所有数据需要使用多个CAN数据帧来传输时使
用的一种J1939报 文。(每个CAN数据帧拥有相同的标识符,但每个包中数据不同)
协议数据单元(PDU):
格式如下图:
|
优先级 |
扩展数据页(保留) |
数据页位 |
PDU格式 |
PDU特定域 |
源地址 |
数据域 |
|
域 |
P |
R |
DP |
PF |
PS |
SA |
DATA |
|
位 |
3 |
1 |
1 |
8 |
8 |
8 |
8Byte |
|
其中,
优先级(P):3位用来表示优先级范围,所有控制 消息的缺省值是3(0112),其他所有信息、专用、请求和ACK的缺省优先级是6(1102)
数据页位(DP):数据页位选择参数群描述的辅助页。在分配页一的PGN之前,先分配完页零的可用PGN。
数据扩展页(EDP)和数据页(P)关系:
扩展数据页位 (EDP) |
数据页位 (DP) |
功能描述 |
0 |
0 |
SAE J1939 第0页PGN |
0 |
1 |
SAE J1939 第1页PGN |
1 |
0 |
SAE J1939 保留 |
1 |
1 |
定义位ISO 15765-3报文 |
PDU格式(PF)和PDU特定域(PS)的关系:
PDU格式(PF) |
PDU格式 |
PDU特定域(PS) |
PF<240 |
PDU1格式 |
PS是目标地址(DA) |
PF = 240-255 |
PDU2格式 |
PS是组扩展(GE)值 |
PDU1和PDU2时的参数组编号(PGN)数目为:
EDP
|
DP |
PF |
PS
|
PDU1时参数组编号 |
0 |
0或者1 |
0-239 |
目标地址 |
2X240(PF的值)=480 |
EDP |
DP |
PF |
PS |
PDU2时参数组编号 |
0 |
0或者1
|
240-255共16个数 |
组扩展值0-255 (共256个数) |
2X16X256=8192 |
其中PGN计算公式为:
PGN = DP<<|PF<<8|PS;
例:数据页位:0,PDU格式:235,特定PDU段:目标地址(对于TP.CM_BAM数据传送使用全局地址(DA=255))(对于RTS/CTS数据传送不允许用全局地址)
则PGN = 235*256+0 = 60160(0xEB0016)
11101011<<8|0
多包发送:
BAM:广播通知/公告消息
DT:数据传送消息
多包数据发送拆装与重组:大于8字节消息发送,必须拆分,
拆分原则:数据域的首字节定义为数据包序列编号:1-255;
最大拆分数据长度是255包*7字节/包 = 1785个字节
其中,RTS(发送者),请求发送
CTS(响应者),准备发送
广播数据传送次序如下图: