资源描述
J1939协议了解
今天读了J1939协议介绍文档, 下面关键说说我了解:
网络应用分为多个层
物理层 SAE J1939-11
数据链路层 SAE J1939-21
网络层 SAE J1939-31
应用层 SAE J1939-71
故障诊疗 SAE J1939-73
网络管理层 SAE J1939-81
1、 下面关键说说数据链路层和应用层
数据链路层: 为物理连接之间提供可靠数据传输。包含发送CAN 数据帧所必需同时、 次序控制、
犯错控制和流控制。
首先要明白多个概念
PGN: 参数组编号
帧(Frame): 组成一个完整信息一系列有序数据位。帧又被划分成多个域, 每个域包含了预定义类型数据。
CAN 数据帧(CAN Data Frame):组成CAN 协议帧所必需有序位域, 以帧起始(SOF)开始以帧结束(EOF)结尾。
标准帧(Standard Frame):CAN2.0A规范中定义使用11 位标识符CAN 数据帧。
扩展帧(Extended Frame):CAN2.0 B规范中定义使用29 位标志符CAN 数据帧。
包(Packet):一个单一CAN 数据帧就是一个包。当一条报文包含参数组数据长度小于等于8个字节时, 这么报文也称为包。
报文(Message):指一个或多个含有相同参数组编号(PGN)数据帧。也就是说只要一个或多个CAN数据帧含有相同PGN号, 那她们就是属于一个报文。
多包报文(Multipacket Messages):当含有相同参数组编号全部数据需要使用多个CAN 数据帧来传输时使用一个J1939报文。每个CAN 数据帧拥有相同标识符, 但在每个包中数据不一样。
协议数据单元PDU格式
PDU是J1939传输数据格式, 它基于CAN协议扩展帧传输方法。即它标识符是29位。
优先级: 最高0(000)设置到最低7(111 )。全部控制报文缺省优先级是3(011 )。
扩展数据页(EDP)和数据页(DP)关系:
什么是第0页PGN, 什么是第1页PGN?作用有什么不一样? 还不是太清楚
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
在说说J1939标识符合CAN协议对应格式:
J193929位标识符格式
CAN协议扩展帧格式
首先, J1939标识符是29位, 所以它使用是CAN协议扩展帧格式来传输数据。29位标识符在寄存器中存放位置, 恰好对应CANID28-ID029位。我们关键在ID18和ID17直接有两个位, SRR和IDE要求是必需写1, 它不包含在我们J1939标识符, 还有ID0后一位RTR位也不包含在我们标识符中, 这一位是无效位, 应该写0。
标识符对应CAN扩展帧位数:
优先权3位-----------------àID28 ID27 ID26
扩展数据页EP-------------àID25
数据页DP-------------------àID24
PDU格式PF------------- àID23~ID16
PDU特定域PS----------àID15~ID8
源地址SA-----------------àID7~ID0
假如ECU读回来一串数据怎么判定参数组编号PGN呢?
首先, 把数据前29个字节(标识符)提取出来。
然后进行解析, 解析方法:
把ID28~ID24提取出来组成一个字节(对应优先权位、 EP、 DP)
把ID23~ID16提取出来组成一个字节(对应PF8位)
把ID15~ID8提取出来组成一个字节(对应PS8位)
上述ID25~ID8就组成了数据PGN(参数组编号)
比如:
收到前29个字节是 0x67,0x98,0x1c,0xa2
看看它们存放方法:
BIT7
6
5
4
3
2
1
0
IDR0
ID28
ID27
ID26
ID25
ID24
ID23
ID22
ID21
0
1
1
0
0
1
1
1
0x67
IDR1
ID20
ID19
ID18
SRR=1
IDE=1
ID17
ID16
ID15
1
0
0
1
1
0
0
0
0x98
IDR2
ID14
ID13
ID12
ID11
ID10
ID9
ID8
ID7
0
0
0
1
1
1
0
0
0x1c
IDR3
ID6
DI5
ID4
ID3
ID2
ID1
ID0
RTR
1
0
1
0
0
0
2
0
0xa2
把ID28~ID24提取出来, 其中标识符只包含ID25和ID24, 即PGN第一个字节是00(二进制),
把ID23~ID16提取出来, 组成二进制: 11110000(PF字节8位)
把ID15~ID8提取出来, 组成00001110(对应PS8位)
把上述3个字节连接起来组成一个二进制数: 00 11110000 00001110, 把它转换成16进制就是0XF00E, 转换成十进制是: 61454, 这就是它PGN号。
2、 应用层
应用层为应用过程访问OSI 环境提供了一个方法,包含支持应用管理功效和通用机制。它以PGN和SPN方法具体要求了车辆使用每个参数数据长度, 数据类型, 分辨率和数据范围等。
应用层报文使用PGN作为一组参数标号。一组参数称为“参数组”(PG), PGN是其唯一标识号。参数组内有一个或多个具体参数, 每个具体参数都有一个唯一标号, 称为“怀疑参数编号”, 即SPN。
以一个实例讲解PGN使用
以PGN65213为例, 首先是它J1939协议定义:
假定我们只使用了协议中前3个参数, 估计风扇转速比, 风扇驱动器状态, 风扇转速。下面是这3个参数在字节中存放方法, 估计风扇转速比是一个字节, 它占用了byte18位, 风扇驱动器状态是4个字节, 占用了byte2后四位, 风扇转速是2字节, 占用byte3和byte4. 其她没有使用位要写1.
她们每一个参数对应一个SPN, 在SPN中都有它斜率和分辨率要求。
比如 第一个参数 Estimated Percent Fan Speed, 我们看它SPN号是975, 我们再来查看SPN975内容, 发觉她是一个表示百分比数, 范围是0%到100%, 分辨率是0.4%, 偏移量是0。假如我们想写个50%进去, 怎么把50%转换为二进制数放到字节中呢,
计算方法: 50%/分辨率+偏移量=要写入字节数, 我们来计算下50%/0.4%+0=125, 这个数是十进制, 把它转换为二进制就是: 0111 1101, 我们把这数放到字节1中就能够了。
展开阅读全文