转自: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(响应者),准备发送
广播数据传送次序如下图:
上图中广播公告消息格式为(TP.CM_BAM):全局目标地址
字节: | 1 | 控制字节=32,广播公告消息(BAM) |
| 2,3 | 整个消息大小,字节数目 |
| 4 | 全部数据包的数目 |
| 5 | 保留给SAE设定使用,该字节应设为FF16 |
| 6-8 | 所装载数据的参数群编号 |
而数据传送消息格式(TP.DT):
Byte: 1 序列号 1-255(1Byte)
2-8 分组数据(7 Bytes)
注意多包参数组的最后一个包可能需要不到8个字节数据,
多余的字节填充0xff16
故障诊断
故障诊断代码DTC构成:
a、可以参数编号(SPN)
b、故障模式标志(FMI)
c、发生次数(OC)
d、可以参数标号的转换方式(CM)
其中,DM1:当前故障码(正在发送的所有故障)
DM2:历史故障码
DTC由四个字节构成
DTC | |||||
字节3 SPN低8位 (第8位为最高有效位) | 字节4 SPN第2字节 (第8位为最高有效位) | 字节5 SPN高3位(第8位为最高有效位) FMI低5位(第5位为最高有效位) | 字节6 | ||
SPN | FMI | CM | OC | ||
8bit | 3bit | 5bit | 1bit | 7bit |