文章目录
- 前言
- 一、SAE J1939物理层
- 二、SAE J1939数据链路层
- 1、帧结构
- 1.1、帧起始(SOF)
- 1.2、优先级(P)
- 1.3、扩展数据页EDP(R)
- 1.4、数据页(DP)
- 1.5、替换远程请求Substitute Remote Request (SRR)
- 1.6、标识符扩展位(IDE)
- 1.7、PDU格式(PF)
- 1.8、PDU特定域(PS)
- 1.9、目标地址(DA)
- 1.10、组扩展(GE)
- 1.11、源地址(SA)
- 1.12、远程传输请求位(Remote Transmission Request ,RTR)
- 1.13、控制段
- 1.14、CRC段
- 1.15、ACK段
- 1.16、帧结束
- 1.17、参数组编号(PGN)
- 1.18、怀疑参数编号(SPN)
- 2、Protocol Data Unit (PDU) Formats 协议数据单元格式
- 2.1、PDU1
- 2.2、PDU2
- 2.3、PDU总结
- 三、举栗子
- 3.1、选择DBC文件的报文
- 3.2、按位解析
- 3.3、查询文档
- 总结
前言
最近刚接触重型卡车的项目,所使用的是J1939协议以及OSEK网络,于是就顺便记录些笔记分享出来,欢迎指点哈~
J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。
该标准主要用于卡车、公共汽车和移动液压等重型车辆。
物理层(J1939/11) 描述了针对客车的电气接口。
数据链路层(J1939/21) 描述了构建报文、访问总线以及诊断传送故障的规则。
应用层(J1939/71和J1939/73) 定义了在网络中传送的每条报文的具体数据,包括PGN以及SPN详情内容解释等。
话不多说,走你~
一、SAE J1939物理层
SAE J1939的物理层描述了电气接口和物理介质,没啥精髓。定义的内容包括:
1. 物理介质为屏蔽双绞线;
2. 传输速率为250Kbps;
3. 同一网络上最大子系统数为30个;
4. 最大传输线长度为40m;
5. 物理层还定义了数据的物理特性及总线的电气连接特性。
二、SAE J1939数据链路层
J1939协议的精髓全在这里,那就让我们展开叙述。
SAE J1939以CAN2.0B为基础,通过CAN总线进行数据通信。并且拥有18位扩展标识符共29位标识符(CAN 2.0B);
它的数据链路层定义了信息帧的数据结构、编码规则,包括通信优先权、传输方式、通信要求、总线仲裁、错误检测及处理,
它负责将CAN扩展帧的29位标识符重新分组定义,使报文的标识符就能够描述报文的全部特征,包括目标地址、源地址等内容。
1、帧结构
“CAN 2.0B”包括两种消息格式的规范,标准帧和扩展帧。
“CAN 2.0B”的兼容性意味着通过使用不同的帧格式位码,保证二者能同时在同一网络中使用。
就此而言, SAE J1939也能够自适应这两种CAN数据帧格式。但是, SAE J1939只使用扩展帧格式全面定义了标准化的通信。所有标准帧格式消息都按照规则作为专用消息使用。因此, SAE J1939设备必须使用扩展帧格式。标准帧格式消息可以在网络中存在,但只能以规定的方式运行。
1.1、帧起始(SOF)
占1bit,SOF信号只有一个数据位,是一个显性电平(逻辑0),它用于通知各个节点将有数据传输,
其他节点通过帧起始信号的电平跳变沿来进行硬同步。
(这一点和CAN保持一致)
1.2、优先级(P)
占3bit,根据CAN2.0B 的仲裁机制,ID越小优先级越高,按照J1939协议的划分,优先级在整个ID的最前面,实际上依然控制着ID大小,即CAN报文的优先级。
只不过在J1939协议中优先级仅仅用于优化发送数据时的报文延迟,接收报文时则完全忽略优先级。 J1939中的优先级可以从最高的0(000b)到最低优先级7(111b)。
默认情况下控制类报文的优先级为3,其他报文的优先级为6。 当分配新的PGN或总线上流量改变时,允许提高或者降低优先级。
1.3、扩展数据页EDP(R)
占1bit,扩展数据页(EDP)联合数据页(DP)可以决定CAN报文帧中CAN ID的结构,目前为保留位,均设置为0。
1.4、数据页(DP)
占1bit,用于联合扩展数据页EDP来决定CAN ID结构,当EDP为0时,DP为0或者1分别表示第0页或者第1页PGN。如下图所示:
1.5、替换远程请求Substitute Remote Request (SRR)
占1bit,只存在于扩展帧格式,扩展帧中的SRR位为隐性位(隐性电平(逻辑1))
1.6、标识符扩展位(IDE)
占1bit,当IDE为0时,表示标准格式帧;当IDE为1时,表示扩展格式帧。
(这一点和CAN保持一致)
1.7、PDU格式(PF)
占8bit,PF用来确定PDU的格式,两种格式计算得到PGN的方式不同,我们在下面介绍这两种计算方式。
1.8、PDU特定域(PS)
占8bit,PS的定义取决于PF, 它可能表示目标地址( Destination Address, DA),可能表示组扩展(Group Extension,GE),
如果PF < 0xF0则表示为DA,否则表示为GE。
1.9、目标地址(DA)
占8bit,DA是报文的目标地址,除目标地址的设备外,其他设备应该忽略此报文。
如果目标地址为0xFF,则表示为全局地址,此时所有设备都应该监听此报文并在收到报文后做出响应。
1.10、组扩展(GE)
组扩展与PDU 格式域的低四位(注意:当PDU 格式域最高四位被置1,说明PS 域是组扩展)规定了每个数据页4096 个参数组。
这4096个参数组仅使用PDU2格式可用。此外,在每个数据页中提供了240个参数组,仅供PDU1格式使用。总共有8672个参数组可以使用当前可用的两个数据页面来定义。
可用参数组总数的计算公式1如下:
1.11、源地址(SA)
占8bit,发送报文的设备的地址,网络上只能有一个具有给定源地址的设备。因此,源地址根据CAN的要求,字段确保CAN标识符是唯一的。地址管理和分配情况详见SAE J1939-81。在SAE J1939-81中定义了程序,以防止源地址的重复。有关源地址分配,请参考SAE J1939附录B,表B2至表B9。
1.12、远程传输请求位(Remote Transmission Request ,RTR)
当RTR=逻辑0时,表示数据帧;=逻辑1时,表示遥控帧。在 SAE J1939 中始终设置一个显性的 0。
(这一点和CAN保持一致)
1.13、控制段
在控制段中的r1和r0为保留位,默认设置为显性位。它最重要的是DLC段(Data Length Code),数据长度码,
它由四个bit组成,用于表示本报文中的数据段含多少个字节,DLC段表示的数字是0~8 (因为数据段的大小是0到8字节大小)。
(这一点和CAN保持一致)
1.14、CRC段
为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码和接收到的CRC码不同,则它会向发送节点反馈错误信息,利用错误帧请求它重新发送报文。
CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。 在CRC校验码之后,有一个CRC界定符,它是隐性位,主要是把CRC校验码与后面的ACK段间隔开。
(这一点和CAN保持一致)
1.15、ACK段
占2bit,ACK段包括一个ACK槽位和ACK界定符位。类似I2C总线,在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以应答。在ACK槽和帧结束之间由ACK界定符间隔开。
(这一点和CAN保持一致)
1.16、帧结束
占7bit,由发送节点发送的7个隐性位(逻辑1)表示结束。
(这一点和CAN保持一致)
1.17、参数组编号(PGN)
是 J1939 标准中的唯一帧标识符,用于引用将保留位®、数据页(DP)、PDU格式(PF)和 PDU特定字段(PS)的值组合成单个 18 位值。
参数组还包含了每个报文的 8 字节 CAN 数据字段中的参数分配、重复率和优先级。PGN是J1939标准中唯一的帧标识符(J1939-71文档中列出了PGN以及SPN)。
参数组编号 可分为两种类型:
a)全局参数组编号
此类PGN识别广播(发送给所有人)的参数组。这里,PDU格式(PF) >= 240,并且PDU特定字段(PS)是组扩展。
b)特定参数组编号
这些用于对等发送(到特定设备)的参数组。如果PDU格式(PF) <= 239,并且PDU特定字段(PS)设置为0,则无论两个 PGN 的类型如何, PDU 格式、PDU 特定字段、数据页和扩展数据页都用于识别相应的参数组。
Tips: 如有不明白,看最后的例子即可。
1.18、怀疑参数编号(SPN)
J1939中的SPN作为数据库中包含的CAN信号(参数)的标识符,SPN按照PGN来分组,可以根据其位起始位置、位长度、精度(比例)、偏移量和单位(将SPN数据提取和缩放为物理值所需的信息或者量)来描述。
2、Protocol Data Unit (PDU) Formats 协议数据单元格式
定义了两种PDU格式:
PDU1格式(PS =目标地址)和PDU2格式(PS =组扩展),PDU1格式允许将CAN数据帧定向到一个特定的目标地址(设备);
PDU2格式只能通信不特定于目标的can数据帧。
建立了两种单独的PDU格式,是为了提供更多可能的参数组号组合,同时仍然提供特定于目的地的通信。已分配了专有参数组定义,以便这两种PDU格式都可用于专有通信。为专有通信建立了一种标准化的方法,以防止在标识符使用中可能出现的冲突。
2.1、PDU1
此格式允许将适用的参数组发送到特定的或全局目标。PDU特定字段包含一个目标地址。PDU1格式消息可以被请求或发送。
PDU1格式消息由PF字段确定。当PF字段值为0到239时,消息为PDU1格式。PDU1消息的格式如上图所示。另请参见下图,PDU1格式。
2.2、PDU2
此格式只能用于将参数组作为全局消息进行通信。PDU2格式消息可以被请求或发送。
在分配PGN时选择PDU2格式,防止PGN无法被定向到特定的目的地。PDU特定项包含一个组扩展。
2.3、PDU总结
(1) PDU1和PDU2格式下PGN的总数为:( 240+(16*256))*2 = 8672
(2) PDU1格式主要分配给必须指明目标地址的PGNs,数量有限;PDU2格式下的PGNs不能用于必须指明目标地址的情况。大部分PGNs都定义在PDU2段。
(3) 为了保证实时性,报文更新速率小于100ms时不允许多包发送。
(4) PDU1和PDU2格式下均支持单包报文和多包报文。无论是PDU1还是PDU2格式,其前半段PGNs标识的报文更新速率小于100ms,不允许多包发送;后前半段PGNs标识的报文更新速率大于100ms,允许多包发送。
(5) 目前支持五种类型消息,分别为:命令、请求、广播/响应、确认和群扩展。特定消息类型由其分配的参数群编号识别。
RTR位(在CAN协议远程帧中定义)不可用于隐性状 态 ( 逻 辑 1 ) 。
因 此 , 远 程 传 输 请 求( RTR=1)在SAE J1939中不适用。
三、举栗子
3.1、选择DBC文件的报文
3.2、按位解析
对ID:0xCF00400进行按位解析。
优先级P: 3
扩展数据页EDR(R):0
数据页DP: 0
PDU格式PF: 0xF0,表示PDU格式为PDU2,即PS表示组扩展
PDU特定域PS: 0x04(应该无指定意义,只为了构成PGN的编号),PS表示组扩展
源地址SA: 此处是0x00,实际发送节点EMS的设备地址是0xFE(有点小疑惑,先不管它)
参数组编号PGN: 0xF004
3.3、查询文档
步骤一, 在SAE-J1939-21中查询PGN,如下图,发现竟然里面的描述和我们上面按位解析的一致**(说明以后我们第一步先找PGN)**
步骤二, 继续查询并分析SPN190,所谓SPN我认为就是对数据域做了解析。(下图DBC告诉我们该信号处于4-5byte,SPN为190)
步骤三, 解析SPN190,如下图。
(和DBC的信号属性对比之后,发现分辨率略有区别。无需纠结,可能是整车厂定义了这个参数。但是具体信号的其他属性均和文档一致)
总结
关于PGN查询,我在博客下载过一个表格,里面对PGN和SPN等做了链接关系及属性
链接地址
如果哪里表达的有问题,还请大佬们指点指点哈。只算是个人笔记,有些内容和图片非原创。