J1939协议
一、前言
浅聊一下从事汽车电子为什么要学习J1939协议。上篇文章我们提到CAN总线定义了物理层和数据链路层,而我们实际开发过程中可能更在意的是通过上层去满足项目需求。而J1939便是基于CAN的应用层协议之一(J1939不仅规范了应用层,本文只讨论应用层)。J1939是SAE的推荐标准,广泛应用于商用车(重卡、大客车等道路车辆和工程机械、农业机械、轨道机车、船舶等非道路车辆及设备)上各电子部件间的数字通信。
二、J1939的报文格式
J1939重新划分了CAN报文结构,且是建立在CAN的29位ID值上进行重新划分。主要分为三部分:帧结构、帧标识符和帧数据部分。
2.1 帧结构
- IDE(1bit,一定是1,代表29位ID值)
- RTR(1bit,0为数据帧,1为远程帧)
- 保留位(2bit)
- DLC(4bit,决定数据部分的长度)
2.2 帧标识符(重新划分29位ID值)
- 优先级-P(3bit,最高000,最低111,默认011)
- 保留位-R(1bit)
- 数据页-DP(1bit)
- PDU格式-PF(8bit)
- 特定PDU-PS(8bit,如果PF的值在0-239,PS则为目标地址;如果PF的值在240-255,PS为组扩展)
- 源地址-SA(8bit)
2.3 帧数据部分
- 第一个字节:数据包的序列号
- 其余七个字节:真正的应用层数据
比如现在需要传输:0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
则需要分成两帧数据传输,分别为:
第一帧:0x01 0x00 0x01 0x02 0x03 0x04 0x05 0x06
第二帧:0x02 0x07 0x08 0x09 0xFF 0xFF 0xFF 0xFF
所有没有用的字节应置为不可用,全部设置为0xFF。
三、参数群编号PGN 和 可疑参数编号SPN
PGN(8bit)=R(1bit)+DA(1bit)+PF(8bit)+PS(8bit)。虽然PGN表示时是24位,实际上只有18位。它是组相关参数的唯一标识(如发动机数据、刹车状态)。PGN总数为8672个,也就是J1939最多有8672个不同姓名标识的报文。其中PGN(65280-65535)是预留给企业的PGN。
由于J1939协议中涉及车辆的各部分组件太多了,比如电子减速器控制器、电子刹车控制器等等。现需要对这些部组件的参数特征统一编号管理,这个编号就是SPN。简单说SPN就是用于标识PGN中一个具体的信号。
四、J1939报文类型
J1939协议目前支持5种类型的报文通信,分别为命令、请求、广播/响应、确认和群功能,报文的类型由其配置的参数组编号确定。
4.1 命令报文
命令报文是指从某个源地址向特定目标地址或全局目标地址发送命令的参数组。目标地址接收到命令报文后,应根据接收到的报文采取具体的动作。
分析如下图片,可见该报文是变速箱电控单元发给发动机电控单元的扭矩/速度控制,命令发动机输出一定数值的转速和扭矩,则发动机接收到该命令就去执行命令。

4.2 请求报文
请求报文提供了从全局范围或从特定目标地址请求报文的能力。对特定目标地址的请求称为指向特定目标地址的请求,目标地址必须做出响应;如果目标地址不支持请求的PGN,那也必须发出一个NACK的响应以表明它不支持该PGN。
分析如下图片,可见该报文是故障诊断仪请求发动机的电控单元,让它告诉PGN65262所描述的信息。

4.3 广播/响应报文
此报文类型可能是某设备主动提供的报文广播,向总线上的所有节点广播报文信息。此报文类型也可能是命令报文或请求报文的响应。
4.4 确认报文
确认报文是对特定命令或者请求做出的正常广播/ACK/NACK响应,提供了发送方和接收方之间的一种握手机制。
确认报文的数据单元与命令报文比较相似,主要在于帧数据部分不同,具体如下:
byte1:控制位(0为肯定确定;1为否定确认;2为拒绝访问;3为无法响应)
byte2:群功能值
byte3~byte5:0XFF
byte6~byte8:被请求消息的参数群编号
4.5 群功能报文
群功能报文用于特殊功能组(如专用功能、网络管理功能、多包传输功能等),每个组功能由其PGN识别。
专用功能通信并不是标准的通信模式,专用功能报文包括专用A报文和专用B报文。专用A报文为使用PDU1格式(PF<240),其允许制造商将他们的专用报文发送到特定目标节点,各制造商决定如何使用报文的数据域以及报文数据长度。专用B报文为使用PDU2格式(240<PF<255),允许制造商按需定义PS域、数据域的内容以及报文数据长度。综述,专用A报文用于有目标地址的报文,专用B报文用于没有特定目标地址的广播报文。
五、请求报文的处理流程
5.1 指定目标地址的请求
举例,变速器的电控单元(0x03)向发动机电控单元(0x00)发送请求报文,请求发动机序列号为PGN65259(0x00FEEB)。
0x83 0x18 0xEA 0x00 0x03 0xEB 0xFE 0x00
首先发动机电控单元先判断是不是来了请求PGN(0x00EA00),然后在判断报文的PS是不是目标地址。如果满足的话,就核对报文的目标地址0x00是否和自己的地址(0x00)一致,如果地址信息也一致,则把4字节的ID(0x18 0xEA 0x00 0x03)和3字节的数据包(0xEB 0xFE 0x00)存在请求队列中,等待单片机空闲时处理这些信息。
5.2 全局目标地址的请求
举例,变速器的电控单元(0x03)向全局地址(0xFF)发送请求报文,请求发动机序列号为PGN65259(0x00FEEB)。
0x83 0x18 0xEA 0xFF 0x03 0xEB 0xFE 0x00
首先发动机电控单元先判断是不是来了请求PGN(0x00EA00),然后在判断报文的PS是不是全局地址(0xFF)。如果满足的话,则把4字节的ID(0x18 0xEA 0x00 0x03)和3字节的数据包(0xEB 0xFE 0x00)存在请求队列中,等待单片机空闲时处理这些信息。发动机电控单元需要核对请求报文中的PGN65259是不是自己的PGN,是就回复一个数据帧给变速器的电控单元(0x03)。
J1939协议的更多相关文章
- CAN编写完分帧发送, 分帧接收,J1939位域型结构体心得
关于由多个不同的C文件构成的工程,我采用以下方法 以为400Hz数字电源程序为例 假设工程由以下文件组成 DC_Comm.c 主要完成串口通讯部分 DC_Config.c 主要完成时钟,外设 中断初始 ...
- 超高性价比USB转CAN适配器,2500V工业级隔离,兼容ZLG软件
淘宝链接: http://item.taobao.com/item.htm?spm=a230r.1.14.16.QGsAZg&id=20134109594&initiative_new ...
- 第40章 CAN—通讯实验—零死角玩转STM32-F429系列
第40章 CAN—通讯实验—零死角玩转STM32-F429系列 第40章 CAN—通讯实验 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视 ...
- 迅为7寸工业平板电脑|人机界面|工业触摸屏|工控机|HMI|工业显示器
型号:iTOP-HMI070-C 7寸工业平板电脑特点: 1.iTOP-HMI070-C(CAN) 7寸工业触摸屏,CAN总线型触摸屏,配有2组独立的串口和一路CAN总线口: 2.串口都支持各种PLC ...
- CAN在汽车电子中的应用
http://xuxiaozhao163.blog.163.com/blog/static/3793592200802784146452/ CAN是控制器局域网络(Controller Area Ne ...
- CAN学习方法(知乎)
作者:心机之花链接:https://www.zhihu.com/question/26776219/answer/244433861来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- stm32CubeMx CAN 发送数据
平台 STM32F429 软件 STM32CubeMx 5.0.0 固件库 STM32Cube_FW_F4_V1.23.0 目的: 实现 CAN 的发送 一 简介 CAN是控制器局域网络(Co ...
- 嵌入:CAN
说下我的学习过程.刚到公司的时候我根本不知道什么是CAN,甚至连以太网和串口通讯都不懂.领导把USBCAN分析仪拿给我,把铜线短接上,用软件在CAN1窗口点下发送,CAN2窗口马上接收到了发送出来的数 ...
- Wireshark工控协议
Wireshark是一个强大开源流量与协议分析工具,除了传统网络协议解码外,还支持众多主流和标准工控协议的分析与解码. 序号 协议类型 源码下载 简介 1 Siemens S7 https://git ...
- CAN协议教程
介绍:CAN总线 CAN总线是广播类型的总线.这意味着所有节点都可以侦听到所有传输的报文.无法将报文单独发送给指定节点:所有节点都将始终捕获所有报文.但是,CAN硬件能够提供本地过滤功能,让每个节点对 ...
随机推荐
- K-th Symbol in Grammar——LeetCode进阶路
原题链接https://leetcode.com/problems/k-th-symbol-in-grammar/ 题目描述 On the first row, we write a 0. Now i ...
- AD 权限维持-金票银票攻击
本文通过 Google 翻译 Domain Persistence – Golden Ticket and Silver Ticket Attacks 这篇文章所产生,本人仅是对机器翻译中部分表达别扭 ...
- 【2020.11.24提高组模拟】变换 (transform) 题解
[2020.11.24提高组模拟]变换 (transform) 题解 题意描述 给一个大小为\(n\)的\(01\)环\(A\),点编号为\(0,1,\dots,n-1\).每一个点\(i\)都与\( ...
- ES6中好用的方法
1.关于扁平化数组 const deps = { 'A组':[1,2,3], 'B组':[5,8,12], 'C组':[5,14,79], 'D组':[3,64,105], } let member ...
- C++ list容器学习总结
----------------------------list 链表是由一系列的结点组成,结点包含两个域,一个数据域,一个指针域 链表内存是非连续的 添加和删除元素 其时间复杂度都为常数项,不需要移 ...
- 提升开发体验:基于 JSDoc 的 React 项目自动代码提示方案详解
需求背景 主管和其他同事基于公司的业务特点,开发了一套自研前端框架.技术选型是 React + JavaScript 的组合,上线后表现还不错.现在他们想把这个组件库推广到其他团队使用,所以让我琢磨一 ...
- java--http协议
web应用目录结构 |- WebRoot 根目录 |-静态资源(html+css+javascript+images+xml) 可以直接被浏览器访问到的 |-WEB-INF 不可以直接被浏览器访问到 ...
- docusaurus默认访问地址前缀 以及多实例
前言 默认情况下 所有的md文档 都应该以docs为根目录. you-project |--docs |--test.md 而访问路由 也是默认的http://localhost:3000/docs/ ...
- windows使用chrome调试ios webView
包含safari和App如果安装失败,直接删除C:\Users\Administrator\scoop 重新安装即可 安装scoop windows下的安装源搜索工具,有点类似centos下的yum. ...
- 前端开发系列010-基础篇之JavaScript的Date对象
本文介绍JavaScript中的内置对象Date,时间相关的基本常识,以及Date的常用方法,此外还简单介绍了定时器的相关知识点. 一.日期类型Date简单介绍 Date对象是JavaScript语言 ...