引用百度百科:
SAE J1939(以下简称J1939)是美国汽车工程协会(SAE)的推荐标准,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”(Track & Bus Electrical & Electronics Committee)下属的“卡车与大型客车控制和通讯网络附属委员会”(Track & Bus Control and Communications Network Subcommittee)开发编写。
J1939基于德国Bosch公司(Robert Bosch GmbH)开发的控制器局域网络(CAN:Controller Area Network),可达到250Kbps的通讯速率。它描述了重型车辆现场总线的一种网络应用,包括CAN网络物理层定义、数据链路层定义、应用层定义、网络层定义、故障诊断和网络管理。在SAE J1939协议中,不仅仅指定了传输类型、报文结构及其分段、流量检查等,而且报文内容本身也做了精确的定义。目前,J1939是在商用车辆、舰船、轨道机车、农业机械和大型发动机中应用最广泛的应用层协议。
CAN总线原理参考文章:https://blog.csdn.net/tq384998430/article/details/79126597、https://www.cnblogs.com/spoorer/p/6649303.html
目前国家开始执行国二升国三标准,据我所知对于柴油机而言国二和国三标准的最大差别就是国三是电喷,国二是传统机械式的,虽然我不是很了解汽车电子行业,但是我知道使用电喷就需要有专门的电子电路进行电喷控制,这个控制设备就是ECU或者叫ECM模块。ECU模块就是一个嵌入式设备用于汽车发动机控制,也可以叫做行车电脑,是控制发动机的核心部件,当然,一辆完整的汽车控制系统了需要ECU之外还有其他控制设备,例如刹车系统、安全气囊、转向系统等等。各个控制设备之间使用CAN总线连接到一个局域网中,CAN总线的优越特性使得其适合汽车行业,并且得到了广泛的使用。
不过汽车网络是很复杂的,虽然都是基于CAN总线协议进行通信但是不同的系统使用的上层协议是有差别的,例如家用汽车使用的协议标准和卡车使用的协议标准是不一样的。国三标准规定柴油机必须遵循SAE J1939协议,SAE J1939是在CAN总线基础上定义的,它的数据链路层规定了CAN总线使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps。这里不讨论SAE J1939协议的物理层,只专注软件层面。
SAE J1939协议将CAN 2.0B的29bit扩展帧标识符进行的分段定义:
最高的三位为Priority(优先级)字段。接下来的18位为PGN,PGN由EDP(1bit)、DP(1bit)、PF(8bits)、PS(8bits)组成,剩下的8位为SA(Source Address 源地址)。参考我之前的文章《CAN总线学习①-总线仲裁机制》介绍的CAN总线的仲裁原理,可以知道Priority字段数值越小在仲裁的时候会被优先分配到总线占用权利。我上面说过一个完整的汽车系统不仅仅只有一个ECU模块,还需要有很多其他的控制设备(功能模块),SAE J1939协议将每个控制设备都用一个目标地址来寻址,SA源地址字段正是出于这个目的设计的,各种不同的控制设备的源地址如下表:
标识符 |
装置 |
|
Hex |
Dec |
|
0x 00 |
0 |
发动机控制单元 |
0x 03 |
3 |
传动系统控制单元(变速箱) |
0x 0B |
11 |
电控刹车系统 (EBS) |
0x 0F |
15 |
发动机缓速器 |
0x 10 |
16 |
驱动系统缓速器 |
0x 17 |
23 |
仪表 |
0x 21 |
33 |
车身 |
0x 24 |
36 |
PTO |
0x 27 |
39 |
车辆智能中心 |
0x 29 |
41 |
排气缓速器 |
0x 2B |
43 |
车载诊断系统 |
0x EE |
238 |
转速表 |
0x F9 |
249 |
故障诊断-售后服务工具 |
PGN是最重要的一个字段,全称为Parameter Group Number,组成元素包括EDP(Extended Data Page)、DP(Data Page)、PF(PDU Format)、PS(PDU Specific),其中PDU是Protocol Data Unit的简写。我没有深究这些字段的含义,因为我看资料一般都是写PGN:65226之类的,并没有将PGN拆开解释。
SAE J1939协议发送小于等于8字节的报文时使用一个CAN帧就可以,发送长度大于8字节的报文是需要分成多个CAN帧的。这里只讨论数据长度小于等于8字节时的报文。SAE J1939的CAN扩展帧定义:
可以看出来SAE J1939协议其实就是在CAN协议的基础上封装了一层,相比较计算机网络的7层协议来说已经简单很多了,可能这就是SAE J1939协议的设计目的,不为了多强大的性能和丰富的功能,只要稳定和速度。
下面以一个SAE J1939的报文ET1为例操刀解析一下。
ET1报文是由发动机的ECU模块以1000ms的周期发送出来的。报文的优先级为6,PGN为0xFEEE,拆开PGN得到EDP和DP都为1,PF为0xFE,PS(DA)为0xEE。报文的SA源地址为0x00,表示报文来自的控制设备为发动机控制单元就是ECU。数据字段的第一个字节为发动机冷却液温度,第二个字节为发动机燃油温度,第三个字节为发动机机油温度,5到8字节未定义。这样如果我们设计的设备通过CAN总线连接到ECU模块上的话会接收到来自ECU的ET1报文,我们将报文的数据解析出来就可以获取到发动的三个重要运行参数了,同理,其他众多的参数也是这样获取到的。
当然了,除了可以读取来自ECU的数据,我们还能够写数据到发动机中去,按照SAE J1939协议设置好CAN帧的优先级、PGN、源地址和数据,发送给ECU即可。
附 缩写表: