最近工作中涉及ECU刷写部分,作为一个没有接触过汽车诊断的小白,开始了边学边做的历程,对UDS做一个学习总结和复盘,希望可以帮助到各位小伙伴们。
应用层协议
UDS (Unified Diagnostic Services) 统一诊断服务,是车辆诊断的一种应用层协议,面向整车所有ECU ,UDS协议ISO 14229定义了应用层和会话层,不关心底层数据链路层和物理层如何实现,可以在各种汽车总线上应用(CAN、Ethernet 、FlexRay、LIN等)。
通信机制
基于C/S的诊断通信机制,诊断仪作为Client发出诊断请求request,车辆相关ECU作为Server处理该请求并发送诊断响应response(PosResponse/NegResponse),诊断报文是典型的事件触发型报文,有请求才会有响应。
如果ECU收到了诊断仪Tester发来的诊断请求并且确认了该请求,并作出对应的处理和响应,此时ECU向诊断仪发送肯定响应PosResponse。
如果ECU无法发送对应的响应或者需要经过更长时间才能发送对应的响应则向诊断仪发送否定响应NegResponse。
在某些情况下, Client发出诊断请求,ECU不需要进行某种响应(肯定响应/否定响应),例如0x3E 0x80请求,抑制肯定响应报文。
诊断服务分类
SID服务分类 | SID | 服务名称 | 服务描述 |
诊断和通信管理功能单元 Diagnostic and Communications Management | 0x10 | DiagnosticSessionControl | 诊断会话控制 |
0x11 | EcuRestart | ECU复位 | |
0x27 | SecurityAccess | 安全访问 | |
0x28 | CommunicationControl | 通讯控制 | |
0x29 | Authentication | 身份认证 | |
0x3E | TesterPresent | 待机握手 | |
0x83 | AccessTimingParameter | 访问时间参数 | |
0x84 | SecureDataTransmission | 安全数据传输 | |
0x85 | ControlDTCSetting | 控制DTC设置 | |
0x86 | ResponseOnEvent | 事件响应 | |
0x87 | LinkControl | 链路控制 | |
数据传输功能单元 Data Transmission | 0x22 | ReadDataByIdentifier | 通过ID读取数据 |
0x23 | ReadMemoryByAddress | 通过地址读取内存 | |
0x24 | ReadScalingDataByIdentifier | 通过ID读取比例数据 | |
0x2A | ReadDataByPeriodicIdentifier | 通过周期ID读取数据 | |
0x2C | DynamicallyDefineDataIdentifier | 动态定义数据ID | |
0x2E | WriteDataByIdentifier | 通过ID写数据 | |
0x3D | WriteMemoryByAddress | 通过地址写内存 | |
存储数据传输功能单元 Stored Data Transmission | 0x14 | ClearDiagnosticInformation | 清除诊断信息 |
0x19 | ReadDTCInformation | 读取DTC信息 | |
输入/输出控制功能单元 Input Output Control | 0x2F | InputOutputControlByIdentifier | 通过ID控制输入输出 |
例行程序功能单元 Routine Control | 0x31 | RoutineControl | 例程控制 |
上传下载功能单元 Upload Download | 0x34 | RequestDownload | 请求下载 |
0x35 | RequestUpload | 请求上传 | |
0x36 | TransferData | 数据传输 | |
0x37 | RequestTransferExit | 请求退出传输 | |
0x38 | RequestFileTransfer | 请求文件传输 | |
*蓝色背景代表常用服务 |
响应规则
Tester诊断请求第一个字节为Service Identifier (SID),代表诊断服务的标识符,如果ECU发送肯定响应,第一位为SID+40,例如0x22服务的响应SID为0x62;如果ECU发送否定响应,响应格式固定为第一字节0x7F,第二字节为SID,第三字节为Negative Response Code (NRC),根据NRC可以判断错误原因和位置。
请求格式:
SID+[DID/RID/SubFunction[SID]+[DID/RID/SubFunction/etc]+[OptionalParameter]
肯定响应格式:
SID+0x40+[DID/RID/SubFunction[SID+0x40]+[DID/RID/SubFunction/etc]+[OptionalParameter]
否定响应格式:
7F+[SID[7F]+[SID]+[NRC]
DID相关服务
DID(DataIdentifier)的作用是ECU在对应位置存储了大量数据,有很多个字节,可以使用DID 对该数据进行检索或管理,DID有2个字节,DID parameter definitions见ISO 14229-1:2020 Annex C.1 。
举个例子吧:
tester发送:
0x22 0xF1 0x90 (ReadDataByIdentifier request for DataIdentifier 0xF190,VIN number)
ECU positive response:
0x62 0xF1 0x90 0x12 0x34 0x56 0x78 0x9a 0xbc (Positive response starting with 0x22 + 0x40 = 0x62)
tester发送:
0x22 0xF1 0x90 (ReadDataByIdentifier request for DataIdentifier 0xF190,VIN number)
ECU negative response:
0x7F 0x22 0x22 (Negative response starting with 0x7F,NRC 0x22,ConditionsNotCorrect)
Subfunction相关服务
SF通常代表该诊断服务的具体操作,例如是启动、停止还是查询这个诊断服务(0x31)或者进入哪个会话状态(0x10),不是所有服务均有子功能.
举个例子吧:
tester发送:
0x10 0x03 (session control request for Subfunction 03,extended session)
ECU positive response:
0x50 0x03 (Positive response starting with 0x10 + 0x40 = 0x50)
tester发送:
0x10 0xFF (session control request for Subfunction FF,invalid session)
ECU negative response:
0x7F 0x10 0x12 (Negative response starting with 0x7F,NRC 0x12,Subfunction not supported)
RID相关服务
Client使用 RoutineControl 服务开始例程(routine) 、终止例程、请求例程执行结果。1个例程可以通过2个字节的RID( RoutineIdentifier )来检索,RID parameter definitions 见ISO 14229-1:2020 Table F.1。
举个例子吧:
tester发送:
0x31 0x01 0xF1 0xA0 0x78 (RoutineControl (0x31) Start request(0x01) for RoutineIdentifier 0xF1A0,checkProgrammingIntegrity, CRC32 result is 0x78)
ECU positive response:
0x71 0x01 0xF1 0xA0 0x00 (Positive response starting with 0x31 + 0x40 = 0x71, passed IntegrityCheck 0x00)
tester发送:
0x31 0x50 0x12 0x34 (RoutineControl (0x31) subfunction(0x50) for RoutineIdentifier 0x1234)
ECU negative response:
0x7F 0x31 0x12 (Negative response (1st 0x7F) for RoutineControl request (0x31) indicating that this subfunction is not supported (0x12)
今天内容就到这里啦,下期会对常用的一些服务进行解析,欲知后事如何,且听下回分解,就酱~