SAE-J1939协议入门解析

2023-11-30 17:28
文章标签 入门 协议 解析 sae j1939

本文主要是介绍SAE-J1939协议入门解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、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等做了链接关系及属性
链接地址
如果哪里表达的有问题,还请大佬们指点指点哈。只算是个人笔记,有些内容和图片非原创。

这篇关于SAE-J1939协议入门解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437885

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹