SAE J1587/SAE J1708 协议笔记

SAE J1587/SAE J1708 协议笔记

1. 协议架构概述

SAE J1708 定义了物理层和数据链路层,相当于 OSI 模型的底两层。

SAE J1587 定义了应用层,规定了数据的含义和格式。

简单理解:J1708 是"公路和交通规则"(怎么跑),J1587 是"货物清单"(运什么)。

2. SAE J1708:物理层与链路层

2.1 物理层特性

  • 硬件基础:基于 RS-485 差分总线。
  • 拓扑限制:最大总线长度 40 米。
  • 电气特性
    • 默认状态:通过上拉电阻保持隐性电平(逻辑 1)。
    • 显性电平:逻辑 0,由驱动器主动拉低。

2.2 链路层特性

  • 通信速率:9600 bps(固定)。
  • 字节序小端模式,低位优先。
  • 报文结构
    • 最大长度:21 字节。
    • 组成MID (1字节) + 数据域 (N字节) + 校验和 (1字节)
  • 核心机制非破坏性位仲裁(软件协助硬件实现)。

3. J1708 核心难点:仲裁机制

由于 RS-485 本身无仲裁功能,J1708 通过时间片 + 线与逻辑实现多主竞争。

3.1 硬件实现原理(模拟"线与")

为了实现类似 CAN 总线的"0 覆盖 1"仲裁:

  1. 电路接法 :将 MCU 的串口 TX 引脚反向接到 RS-485 收发器的发送使能端 (DE)。
  2. 逻辑分析
    • 发送数据位 '1' → TX 为高 → DE 为低 → 关闭发送器 → 总线被上拉为隐性 (1)
    • 发送数据位 '0' → TX 为低 → DE 为高 → 开启发送器 → 总线被拉低为显性 (0)
  3. 冲突检测
    • 节点发送 '1' 时,发送器关闭,此时读取总线状态。
    • 若读回为 '0'(显性),说明有其他节点正在发 '0'(优先级更高),判定为冲突。

3.2 总线访问控制

节点必须在总线空闲后,等待特定的时间才能发送。

标准访问时间公式

总线访问时间Ta的计算公式:Ta = Ti + 2 × Tb × P

  • 其中:Ti = 空闲线最小时间(10比特时间),Tb = 比特时间,P = 消息优先级(1-8)
优先级映射表
优先级 紧急程度 应用场景 访问时间示例
1-2 最高紧急 需立即访问总线的消息 12-14 bit
3-4 高度紧急 防止严重机械损坏的消息 16-18 bit
5-6 中等紧急 影响车辆运行经济性的消息 20-22 bit
7-8 普通紧急 其他所有消息 24-26 bit

3.3 冲突处理流程

  1. 检测:所有发射器监视 MID 字节的发送过程。
  2. 判定:若检测到冲突(发 '1' 读到 '0'),立即放弃总线控制。
  3. 退避算法
    • 若连续两次碰撞,采用修改后的公式计算延迟:
    • Ta = Ti + 2 × Tb × (P + 1) + 2 × Tb × P2,其中P2为3bit的伪随机数。

4. SAE J1587:应用层协议

J1587 定义了消息的具体内容,不再是单纯的比特流。

4.1 消息格式

MID + 参数块 + 校验和

  • MID (Message Identifier) :1 字节,标识发送源模块
    • 范围:128 - 255。
    • 位于SAE J1587协议 页码 2
  • 参数块:包含一个或多个 PID 及其数据。
  • 校验和:用于错误检测。

4.2 PID (Parameter Identifier) 详解

PID 标识了数据的含义(如转速、油温)。J1587 支持 PID 扩展机制。

位于SAE J1587协议 页码6 ,若搜索 PID 383 后面有哪些数据,则搜索A.383

PID 扩展机制
  • 标准 PID:直接发送 PID 码。
  • 扩展 PID :若第一个字节为 PID 255 ,则表示 PID 为双字节。
    • 计算公式:扩展PID值 = 255 + 第二个字节值 + 1
PID 数据长度映射规则 (关键)

J1587 通过 PID 的值范围来定义后面跟随的数据长度:

PID 范围 (十进制) 数据长度 备注
0 - 127(256-383) 1 字节 常用参数
128 - 191(384-447) 2 字节 模拟量数据
192 - 253(448-509) 变长 (≥2字节) 需额外指定长度
255 扩展标识 用于双字节 PID 扩展

注:扩展后的 PID 同样遵循上述长度映射规则。

4.3 特殊功能 PID

  • 诊断相关:PID 194-196。
  • 仪表文本显示:PID 225-227。
  • 特定节点命令:PID 254。

5. 报文剖析

  • 数据校验:报文有效,包括检验和在内的报文中的所有字节总和对256求模,结果是0。
  • 单帧传输的最大字节数为21个字节,多帧传输的最大字节数为16*21 = 336个字节
  • 单帧消息
c 复制代码
单帧消息如下:
MID=0xAC,表示非车载诊断请求
PID = 0x80,表示特定参数请求,128 a b
    a --- 请求的参数编号
    b --- 请求参数数据的组件MID
ED 80 ED代表车辆VIN,MID 80代表发动机
含义即读取发动机的VIN识别码
Req:AC 80 ED 80 66
    
MID 80代表发动机
PID ED ED代表车辆VIN
11 代表数据长度,后面的是17byte数据,最后的是校验码
有效数据为56 50 20 20 20 30 38 37 36 33 39 20 20 20 20 20 20
车辆VIN为VP   087639      ,0x20为空格
Ans:80 ED 11 56 50 20 20 20 30 38 37 36 33 39 20 20 20 20 20 20 7B
  • 多帧消息
c 复制代码
多帧传输:根据协议规定,SAE J1587协议多帧传输的最大字节数为16 * 21 = 336个字节;
    
非车载诊断请求,读取车辆管理系统的软件识别码
Req:AC 80 EA BB 69
    
MID BB代表车辆管理系统
PID C0代表多包数据
11 代表本包数据长度
EA 为PID值,软件识别码
20 为最后段编号(总段数减 1)和当前段编号。其中高四位(upper nibble)包含最后段编号(1 至 15)。低四位(lower nibble)包含当前段编号,范围为 0 至 15。段编号按升序分配。
第一帧的24为有效数据长度,为36byte
所以有效数据为32 30 39 35 32 32 33 35 50 30 31 2A 32 30 39 30 32 36 36 32 50 30 31 2A 32 30 39 30 32 35 39 31 50 30 31 2A
软件识别码ASCII为20952235P01*20902662P01*20902591P01*
请注意:后几帧没有有效长度,只有第一帧存在;不要将段编号当成有效数据
Ans:BB C0 11 EA 20 24 32 30 39 35 32 32 33 35 50 30 31 2A 32 30 A8
Ans:BB C0 11 EA 21 39 30 32 36 36 32 50 30 31 2A 32 30 39 30 32 58
Ans:BB C0 09 EA 22 35 39 31 50 30 31 2A 31
相关推荐
码上上岸20 小时前
基于单片机的老人跌倒监测报警器设计与实现
stm32·嵌入式硬件·物联网·智能硬件·硬件
恒锐丰科技林技术员20 小时前
SS6209 半桥驱动器:小型半桥电源方案的优选器件
经验分享·嵌入式硬件
别催小唐敲代码1 天前
Pixhawk 6C — Mission Planner 烧录 & 全套校准教程
stm32·单片机·嵌入式硬件
LuminousCPP1 天前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
Freak嵌入式1 天前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
一条破秋裤1 天前
STM32 学习笔记:PWM 驱动 LED 呼吸灯与舵机代码
笔记·stm32·学习
Freak嵌入式1 天前
Pico PIO 汇编语法深度详解:标识符、指令、伪指令全解析
汇编·stm32·单片机·嵌入式硬件·fpga开发·硬件架构
kyrie_sakura1 天前
python学习笔记11 -- 进程和线程
笔记·python·学习
自小吃多1 天前
PCB Editor软件差分对添加与设置笔记
笔记·嵌入式硬件
逐步前行1 天前
ESP32-S3-工程管理
单片机