文章目录
1.UDS诊断协议
- 通用的汽车诊断协议, 定义了一组诊断服务, 用于对车辆的电子控制单元ECU进行诊断和调试. UDS协议已被ISO 14229标准化, 并广泛应用于现代汽车的诊断系统
- 提供许多诊断服务
- 诊断会话控制: 启动,结束诊断会话, 设置,读取诊断会话模式
- ECU识别: 识别, 验证ECU标识与版本信息
- 读取数据: 读取ECU内部存储器的数据, 包括故障码, 实时数据, 快照数据等
- 清除故障码: 清除ECU存储的故障码
- 控制ECU: 控制ECU的操作, 如重启, 编程, 读取, 写入编程数据等
- 安全访问机制: 对诊断服务的安全控制, 安全访问权限, 数据加密, 消息认证等
- 以CAN总线为物理层传输媒介, 以ISO 15765-2为传输协议, 以ISO 14229-3为应用层协议
2.会话
- 会话即一组诊断服务的集合, 用以与ECU交互
- 默认会话
- 基本会话类型, 提供基本诊断功能与安全机制
- 仅有非敏感的诊断服务: 读取故障码, 清除故障码, 读取实时数据等, 可在任何时间访问
- 编程会话
- 高级会话类型, 提供对ECU的编程和配置, 如读取和写入编程数据, 编程ECU等, 常用于车辆制造商的维修和故障排除
- 需要安全访问控制机制进行认证和授权, 仅授权用户可进入
- 扩展会话
- 最高级别会话类型, 最全面诊断与最强安全机制. 允许所有诊断服务, 提供最严格身份验证和安全机制
- 可通过特殊的诊断服务/诊断会话模式进入, 默认会话->扩展会话
3.寻址
- 物理寻址
- 使用实际的硬件地址来引用内存/其他资源
- 通过ECU的物理地址进行诊断服务的寻址, 可访问所有ECU存储器区域, 包括只读存储器
- 先与ECU建立物理连接, 如通过OBD-II接口连接汽车的诊断接口, 通过ECU的物理地址直接访问内部存储器, 执行读取数据, 清除故障码等
- 功能寻址
- 使用指令/操作码来访问内存/其他资源
- 通过ECU的功能标识符进行诊断服务的寻址, 不能访问只读存储器
- 无需物理连接, 通过发送包含ECU功能的请求帧来识别/访问ECU的诊断服务
- 功能标识符是一种标准化标识符, 用于唯一识别ECU的诊断服务和特性
4.网络层
- 把数据转换成能适应CAN总线规范的单一数据帧, 若报文长度超过CAN数据帧长度, 需要拆分, 每次最多传输4095个字节
4.1.协议数据单元
- 地址信息N_AL
- 隐含源地址, 目标地址, 寻址方式信息
- 协议控制信息N_PCL
-
单帧
Single Frame
: 传输小于/等于7字节的数据, 数据长度与数据本身均可在单个帧中传输字节0 字节1234567 标识符 0
+ 数据长数据 03 xx xx xx __ __ __ __ -
首帧
First Frame
: 传输≥7字节的数据的第一帧字节0 字节1 字节234567 标识符 1
+ 数据长高4数据长低8 数据 10 14 xx xx xx xx xx xx -
连续帧
Consecutive Frame
: 发送方发送首帧FF, 接到接收方的流控帧FC后, 数据报文字节0 字节1234567 标识符 2
+ 帧序号数据 23 xx xx xx xx xx xx xx -
流控帧
Flow Control Frame
: 接到首帧后, 接收方回复一帧流控帧- 状态: 0继续发, 1等待, 2溢出
字节0 字节1 字节2 字节34567 标识符 3
+ 状态允许一次连续发送CF数 间隔时间 30 02 14 __ __ __ __ __
-
4.2.定时参数
时间 | 方向 | 解释 | 超时 |
---|---|---|---|
N_As | 发送->接收 | T :首帧,连续帧在链路层传播 |
发送方未及时发出首帧/连续帧 |
N_Ar | 接收->发送 | T : 流控帧在链路层传播 |
接收方未及时回复流控帧 |
N_Bs | 发送->接收 | 接收方收到首帧时发的ACK <-T-> 自己(发送方)收到流控帧 |
发送方未收到流控帧 |
N_Br | 接收->发送 | 自己(接收方)收到首帧 <-T-> 与自己开始发出流控帧 |
接收方未发出流控帧 |
N_Cs | 发送->接收 | 自己(发送方)收到流控帧/连续帧送达产生的ACK响应 <-T-> 开始发出新流控帧 |
|
N_Cr | 接收->发送 | 自己(接收方)收到连续帧 <-T-> 下一次自己接到连续帧 |
接收方未收到连续帧 |
5.应用层
- 26种服务, 6个单元
- 诊断和通信管理功能单元
SID | 功能 | |||
---|---|---|---|---|
x10 | 诊断&通信管理 | x7 | 数据传输 | |
0x10 |
诊断会话控制 | 0x22 |
通过DID读取数据 | |
0x11 |
复位 | 0x23 |
通过地址读取数据 | |
0x27 |
安全访问 | 0x24 |
DID读取比例数据 | |
0x28 |
通讯控制 | 0x2A |
通过DID读取数据 | |
0x3E |
待机握手 | 0x2C |
动态定义标识符 | |
0x83 |
访问时间参数 | 0x2E |
通过DID写数据 | |
0x84 |
安全数据传输 | 0x3D |
通过地址写内存 | |
0x85 |
诊断故障码设置控制 | |||
0x86 |
事件响应 | x1 | 例程控制 | |
0x87 |
链路控制 | 0x31 |
例行程序控制 | |
x2 | 存储数据传输 | x5 | 上传下载 | |
0x14 |
清除诊断信息 | 0x34 |
请求下载 | |
0x19 |
读取故障码信息 | 0x35 |
请求上传 | |
0x36 |
数据传输 | |||
x1 | IO控制 | 0x37 |
请求退出传输 | |
0x2f |
通过标识符控制输入输出 | 0x38 |
请求传输文件 |
5.1.诊断&通信管理
5.1.1.0x10
诊断会话控制
-
控制ECU在不同会话session之间切换
-
请求消息: 请求SID+子功能
- 0x01 默认会话: ECU上电后默认状态
- 0x02 编程会话: 可进行软件刷写的系列诊断服务
- 0x03 外部扩展会话: 可执行诊断服务
单帧 SID 会话 字节34567 02 10 03 __ __ __ __ __ -
肯定消息: 会话诊断响应SID(请求SID+0x40)+子功能+会话参数记录
单帧 SID 会话 字节34567 06 50 03 __ __ __ __ __ -
否定消息: 否定响应SID(0x7f)+诊断会话SID+否定响应码
- 0x10 支持的否定响应码
- 0x12 不支持请求服务的子功能
- 0x13 请求报文的数据长度(或者格式)不符合标准
- 0x22 条件不满足
5.1.2.0x11
电控单元复位
- 以此诊断指令命令ECU执行自复位
- 请求消息: 请求SID+子功能
- 0x01 硬复位, ECU先完全掉电再上电过程
- 0x02 钥匙电复位, 下钥匙电再重新上电, RAM重置
- 0x03 软复位, 程序从头开始执行, RAM不重置
- 0x04 使能快速休眠, 开启休眠功能, 关闭钥匙电也不关闭而是休眠
- 0x05 关闭快速休眠, 返回常规模式
- 肯定消息: 肯定响应SID(0x11+0x40)+子功能
- 否定消息: 否定响应SID(0x7f)+请求SID(0x11)+否定响应码
5.1.3.0x27
安全访问服务
- 给其他服务加一个访问权限, 常用于上传下载诊断服务
- 请求消息:
- 请求SID+安全访问种子子功能
- 请求SID+安全访问密钥子功能
- 肯定消息:
- 肯定响应SID+安全访问种子功能+发送种子
- 肯定响应SID+安全访问密钥子
5.1.4.0x28
通讯控制服务
- 客户端向服务端请求打开/关闭某类/多类报文信息的发送接收功能
- 请求响应消息定义: 请求SID+请求子功能
- 请求消息子功能:
- 0x00 启用Rx, Tx
- 0x01 启用Rx 禁用Tx
- 0x02 禁用Rx 启用Tx
- 0x03 禁用Rx, Tx
- 0x04 启用Rx(增强的地址信息), 禁用Tx
- 0x05 启用Rx, Tx(增强的寻址信息)
- 肯定消息: 肯定响应SID+请求消息子功能
- 否定消息: 否定响应SID(0x7f)+请求SID+否定响应NRC
5.1.5.0x3E
待机握手
- 客户端确认无服务端是否在线的操作, 利用该服务可实现客户端与服务端一次握手
- 请求消息: 请求消息SID+请求消息子功能
- 0x00 零子功能, 此服务不支持抑制肯定响应
- 肯定响应: 肯定响应SID+请求消息子功能
- 否定响应: 否定响应SID(0x7f)+请求SID+否定响应NRC
5.1.6.0x83
请求读取、修改通信定时参数
5.1.7.0x84
传输加密方法保护的诊断数据
5.1.8.0x85
Control DTC
- 要求ECU停止/恢复DTC的设置, 该服务结合车载通信切换(28)可增加Flash编程速度
5.1.9.0x86
事件响应
- 请求ECU自动传输指定事件的响应
5.1.10.0x87
LinkControl
- 请求控制通信数据速率, 影响数据链路层, 从而影响用于板载通信及诊断通信的数据速率. 转换数据速率请求:
- 验证网络上的ECU是否允许特定的数据速率
- 验证结果为肯定情况下请求转换
- 执行转换
5.2.数据传输功能单元
5.2.1.0x22
通过DID读取数据服务
-
Client向Server通过DID的方式读取相关数据(版本,VIN码等)
-
请求消息: 请求消息SID0x22+要读取的DID
单帧 SID DID 字节4567 03 22 11 80 __ __ __ __ -
肯定响应: 肯定响应SID(0x22+0x40)+请求DID+响应数据
单帧 SID+0x40 DID 字节456 字节7 06 62 11 80 01 02 03 __ -
否定响应: 否定响应SID0x7f+请求服务SID+否定响应码
5.2.2.0x23
ReadMemory By Address
- 读取指定内存范围的当前值
- 参数: 内存地址和内存大小
5.2.3.0x24
Read Scaling Data By Identifier
- 请求ECU将缩放信息值传输到测试仪
5.2.4.0x2A
Read Data By Period Identifier
- 请求定期发送数据记录值, 请求的速率由传输模式参数设置
5.2.5.0x2C
Dynamically Define Data Identifier
- 允许测试人员在ECU中动态定义新的数据标识符, 包括对静态定义的标识符/内存地址的引用
5.2.6.0x2E
通过DID写入数据
- 客户端向服务端请求写入一个DID对应标识的数据记录值
- 请求消息:请求消息SID(0x2E) + DID +数据记录
- 肯定响应:肯定响应SID(0x2E+0x40) + DID
- 否定响应:否定响应SID(0x7F) + 请求服务SID + 否定响应NRC
5.2.7.0x3D
Write Memory By Address
- 允许将数据记录直接写入ECU内存
- 请求参数: 内存地址, 内存大小, 数据记录
5.3.存储数据传输功能单元
5.3.1.0x14
清除诊断信息服务
- 客户端可以利用此服务来清除一个或多个服务端内存中的诊断信息,该服务可设置支持功能寻址,可控制单个服务端或多个服务端诊断信息的清除
- 请求消息:请求消息SID + 请求消息数据参数
- 肯定响应:肯定响应码(0x14+0x40)
- 否定响应:否定响应码(0x7F)+请求SID+否定响应NRC
5.3.2.0x19
读取DTC服务
- 允许外部诊断仪(Client)通过该服务读取存储在ECU芯片内的故障码(DTC)状态信息
- DTC常为3字节
- 请求响应:请求响应SID + 请求消息子功能 + 请求消息相关参数
- 肯定响应:肯定响应SID + 请求消息子功能 + 响应数据
- 否定响应:否定响应SID(0x7F)+请求消息SID + 否定响应码NRC
5.4.输入输出控制单元
5.4.1.0x2F
输入输出控制服务
- 客户端使用输入输出控制服务请求消息作为输入信号,为内部服务器某些简单功能提供输入替代值,或强制控制外部执行器状态,该服务用于相对简单(例如,静态)的输入替代/输出控制。这里的输入输出都是对于服务器而言的,输入信号指输入到服务器的信号(譬如:CAN信号、 I2C信号等);而输出信号则是服务器向外部执行器发出的信号(CAN信号、I2C信号等)
- 请求响应:请求消息SID + 请求DID + 请求数据
- 肯定响应:肯定响应SID(0x2F+0x40) + 请求DID + 请求参数
- 否定响应:否定响应SID(0x7F)+ 请求消息SID + 否定响应码NRC
5.5.例行程序功能单元
5.5.1.0x31
例行程序控制服务
- 客户端利用诊断仪向ECU发送诊断命令来开始或停止一段程序的执行,还可以请求例程执行的结果。
- 请求响应:请求响应SID + 请求消息子功能 + 请求例程标识符
- 肯定响应:肯定响应SID + 请求消息子功能 + 例程标识符
- 否定响应:否定响应SID(0x7F)+ 请求消息SID + 否定响应码NRC
5.6.上传下载功能单元
5.6.1.0x34
上传下载功能单元
- 启动从测试仪到ECU的数据传输, 当ECU准备从测试仪接收数据, 将发送肯定响应, 包含用于后续数据传输的可用块的大小
5.6.2.0x35
请求上传
- 启动东ECU到测试仪的数据传输, 当ECU准备好将数据发送到测试仪, 其将发送肯定响应, 包含用于后续数据传输的块大小
5.6.3.0x36
Transfer Data
- 在下载(测试仪–>ECU) / 上传(ECU->测试仪)
5.6.4.0x37
Request Transfer Exit
- 用于终止transfer Data服务