J1939协议

目录
  • 一、前言
  • 二、J1939的报文格式
    • 2.1 帧结构
    • 2.2 帧标识符(重新划分29位ID值)
    • 2.3 帧数据部分
  • 三、参数群编号PGN 和 可疑参数编号SPN
  • 四、J1939报文类型
    • 4.1 命令报文
    • 4.2 请求报文
    • 4.3 广播/响应报文
    • 4.4 确认报文
    • 4.5 群功能报文
  • 五、请求报文的处理流程
    • 5.1 指定目标地址的请求
    • 5.2 全局目标地址的请求

一、前言

浅聊一下从事汽车电子为什么要学习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 命令报文

命令报文是指从某个源地址向特定目标地址或全局目标地址发送命令的参数组。目标地址接收到命令报文后,应根据接收到的报文采取具体的动作。
分析如下图片,可见该报文是变速箱电控单元发给发动机电控单元的扭矩/速度控制,命令发动机输出一定数值的转速和扭矩,则发动机接收到该命令就去执行命令。
fae07940ecc7dbc2cbd7bd3cf4108330

4.2 请求报文

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

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协议的详细介绍 SAE J1939是一种基于CAN(Controller Area Network)通信标准的协议,广泛应用于重型车辆、农业设备以及建筑机械中[^1]。它旨在解决复杂的数据传输需求,并通过标准化的方式实现不同电子控制单元(ECUs)之间的高效通信。 #### 1. 协议概述 J1939协议是专为商用车辆设计的通信协议,其核心目标是提供一种可靠且高效的网络通信机制,用于在车辆内部的不同ECUs之间交换信息[^3]。该协议支持多种数据类型和消息格式,能够满足现代车辆系统对实时性和可靠性的严格要求。 #### 2. 关键组件 J1939协议的核心组件包括以下几个方面: - **PGN(Parameter Group Number)**:用于标识消息类型的唯一编号。 - **SPN(Suspect Parameter Number)**:表示具体参数的编号。 - **Address Claiming**:动态分配ECU地址以避免冲突。 - **Transport Protocol**:用于传输超过8字节的大数据块[^1]。 #### 3. 协议流程 J1939协议的工作流程主要包括以下步骤: - 初始化阶段:各节点进行初始化并获取唯一的网络地址。 - 数据传输:通过定义好的PGN和SPN发送和接收数据。 - 错误检测与处理:确保数据完整性并处理潜在的通信错误。 #### 4. C语言源码实现 为了帮助开发者深入理解J1939协议,许多项目提供了基于C语言的源码实现[^2]。这些源码通常包括以下模块: - **协议栈实现**:涵盖了J1939协议的所有功能模块。 - **示例应用**:展示了如何使用协议栈实现实际的通信任务。 - **调试工具**:辅助开发者分析和解决通信问题。 以下是一个简单的C语言代码示例,展示如何初始化J1939协议栈并发送一条消息: ```c #include "j1939.h" void j1939_init(void) { // 初始化CAN控制器和J1939协议栈 can_init(); j1939_stack_init(); } void send_message(uint32_t pgn, uint8_t *data, uint8_t length) { // 构建消息并发送 j1939_message_t message; message.pgn = pgn; memcpy(message.data, data, length); message.length = length; j1939_send(&message); } ``` #### 5. 开源资源 Microchip公司提供了一个开源的J1939协议栈实现,开发者可以从以下地址下载并研究其实现细节[^4]: - **项目地址**: https://gitcode.com/open-source-toolkit/03e94 此资源不仅包含完整的协议栈源码,还提供了详细的文档和技术支持,适合各种开发场景。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值