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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript解构数组

还记得之前我们是如何读取到数组里面的元素的么&#xff1f; const arr [2, 3, 4]; const a arr[0]; const b arr[1]; const c arr[2];然后通过这个方式去读取数组中的数据&#xff1b; 现在我们可以使用解构赋值的方法去实现 const [x, y, z] arr; console.log(x, y, …

基于视觉传感器的自主扫雷机器人设计与实现

摘要&#xff1a; 在当今的世界安全形势下&#xff0c;扫雷小车的出现可以减少各国人员在扫雷过程中的人员伤亡&#xff0c;扫雷小车实用性能强更适合在军事化领域或者是民用领域上应用。让它具有光明的发展前景。针对这一情况&#xff0c;本毕业设计就对自主扫雷小车进行研究…

Windows系统如何远程控制Realme手机?

realme使用的是realme UI系统。realme UI是realme研发的操作系统&#xff1b;realme UI 1.0基于安卓10系统&#xff0c;realme UI 2.0基于安卓11系统&#xff0c;realme UI 3.0基于安卓12系统。 对于安卓4.0及以上系统的手机&#xff0c;都可以通过软件AirDroid实现远程控制。 …

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步?

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f; 文章目录 【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f;一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安…

抖音自动评论助手,开发流程与需要到的技术和代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着互联网的快速发展&#xff0c;短视频平台已成为人们日常生活的重要组成部分。其中&#xff0c;抖音作为一款深受用户喜爱的短视频平台&#xff0c;拥有庞大的用户群体…

HarmonyOS开发:ArkTs常见数据类型

前言 无论是Android还是iOS开发&#xff0c;都提供了多种数据类型用于常见的业务开发&#xff0c;但在ArkTs中&#xff0c;数据类型就大有不同&#xff0c;比如int&#xff0c;float&#xff0c;double&#xff0c;long统一就是number类型&#xff0c;当然了也不存在char类型&…

【超全】C++速查手册:面向对象与继承多态

C速查手册 C 类和对象 面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠…

MySQL递归查询:洞悉数据的层层关联

在处理关系型数据库时&#xff0c;我们经常会遇到这样的情况&#xff1a;某些数据之间存在层级关系&#xff0c;例如目录、组织结构、评论等。在这些场景下&#xff0c;我们需要一种灵活的查询技术来处理这种层级关系。今天我们就来探讨MySQL中的递归查询&#xff0c;体验其独特…

yolov3学习总结

目标检测算法 单阶段&#xff1a;不提取出候选框&#xff0c;直接将整个图像输入模型中&#xff0c;算法直接输出检测结果&#xff0c;端到端 yolo&#xff0c;ssd 端到端&#xff0c;输入图像到网络中&#xff0c;然后从网络中输出图像 二阶段&#xff1a;先从图像中提取出…

紫光展锐Wi-Fi 6成功通过Wi-Fi联盟认证

近日&#xff0c;紫光展锐Wi-Fi 6产品成功通过Wi-Fi联盟 (简称“WFA”) Qualified Solution 认证&#xff0c;并支持Wi-Fi 6 Release 2&#xff0c;标志着紫光展锐自研Wi-Fi 6 IP技术已经成熟&#xff0c;在互操作性、安全性和一系列应用专有协议方面达到了国际行业标准。 WFA是…

自定义 element DatePicker组件指令 使选择器呈现为只读状态,用户无法直接编辑,但可以查看和选择日期

1.问题 现实中遇到列表的搜索条件使用DatePicker 组件进行开始结束时间筛选&#xff0c;但是手动修改input中的值&#xff0c;导致请求参数异常。比如讲clearable设置为false之后还是能手动清空输入框中的值。虽然组件提供了readonly 属性&#xff0c;但是也会让日期选择也无法…

【Flink进阶】-- Flink kubernetes operator 快速入门与实战

1、课程目录 2、课程链接 https://edu.csdn.net/course/detail/38831

4天肝出一个数据应用,可能吗?| StartDT Hackathon

以「基于SimbaOS Kernel的应用创新」为主题&#xff0c;2023年秋季StartDT Hackathon近日圆满收官。 本季黑客马拉松不仅有多次蝉联冠军的算法团队参战&#xff0c;有过去惜败的队伍卷土重来&#xff0c;还吸引到了制造、政企、泛零售等行业线开发者“攻擂”&#xff0c;携丰富…

uniapp + electron 打包项目

参考文献 1、控制台安装electron和electron打包工具electron-packager npm install electron -g npm install electron-packager -g2、manifest.json修改 运行的基础路径修改为&#xff1a;./ 不然打包出来会出现白屏&#xff0c;读取不到&#xff0c;因为打包出来的h5默认加…

【JavaEE】线程安全与线程状态

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

配电房综合监控系统

配电房综合监控系统是一种集成了实时监控、数据采集、远程控制等多功能的系统&#xff0c;用于对配电房进行全方位的监测和管理。 力安科技配电室综合监控系统依托电易云-智慧电力物联网&#xff0c;实现配电室环境监测、有害气体监测、安防监控、采暖通风、门禁、灯光、风机、…

进阶C语言-字符函数和字符串函数

字符函数和字符串函数 &#x1f388;1.函数介绍&#x1f50e;1.1strlen函数&#x1f52d;1.1.1strlen函数的模拟实现&#x1f4d6;1.计数器法&#x1f4d6;2.递归法&#x1f4d6;3.指针-指针 &#x1f50e;1.2strcpy函数&#x1f52d;1.2.1strcpy函数的模拟实现 &#x1f50e;1…

Linux系统编程 day07 信号

Linux系统编程 day07 信号 1. 信号的介绍以及信号的机制2. 信号相关函数2.1 signal2.2 kill2.3 abort和raise2.4 alarm2.5 setitimer 3. 信号集4. 信号捕捉函数6. SIGCHLD信号7. SIGUSR1与SIGUSR2 1. 信号的介绍以及信号的机制 信号是信息的载体&#xff0c;在Linux/Unix环境下…

如何有效的进行 E2E

一、前言 本文作者介绍了什么是E2E测试以及E2E测试测什么&#xff0c;并从对于被测系统、测试用例、测试自动化工具、测试者四个方面的要求&#xff0c;介绍了如何保证E2E测试有效性&#xff0c;干货满满&#xff0c;值得学习。 二、什么是E2E测试 相信每一个对自动化测试感…

需求不明确的情况下,测试该如何处理?

当需求不明确的情况下&#xff0c;测试团队可以采取以下措施来处理&#xff1a; 1. 与项目团队进行沟通&#xff1a;测试团队应与项目团队密切合作&#xff0c;与业务分析师、产品经理等相关人员进行沟通&#xff0c;以获取更多的需求细节和背景信息。通过与相关方的交流&…