【汽车嵌入式开发】-UDS协议解读

一、概述

UDS(Unified Diagnostic Services,统一诊断服务)诊断协议是在汽车电子ECU环境下的一种诊断通讯协议。 简单来说,可以理解为UDS诊断协议就是ISO 14229协议,在ISO 14229协议中定义了UDS服务用法、服务格式等信息。UDS诊断最主要目的是为了能够快速准确判断车辆或者某个控制器的故障以及故障原因,从而为维修提供可靠的依据。

UDS的分层设计如下:

二、相关概念

2.1、寻址方式

2.1.1、功能寻址

同时与多个ECU通信,执行广播式操作。使用一个公共的、预定义的地址 (如0x7DF),所有ECU都监听这个地址。收到请求的ECU不会立刻回复,以免造成总线冲突。通常用于不要求响应的请求,或通过物理寻址逐一获取响应。

2.1.2、物理寻址

单个、特定的ECU 通信,执行点对点操作 。使用**每个ECU独有的诊断地址。**被寻址的ECU必须直接向诊断仪回复响应。

2.2、请求与响应报文格式

2.2.1、请求

格式:服务号(SID)+[参数]。例如:默认会话请求10 01、扩展会话请求10 03。

2.2.2、响应

格式:(服务号(SID)+0x40)+响应码+数据。例如:默认会话响应50 01、扩展会话响应50 03。

2.3、肯定响应码与否定响应码

2.3.1、PRC(Positive Response Code,肯定响应码)

与响应的报文格式一致。

2.3.2、NRC(Negative Response Code,否定响应码)

ECU在无法正常执行诊断仪发来的请求时,所返回的标准化错误代码。

格式:**7F(否定响应固定标识符)+原服务ID+NRC代码。**NRC代码具体有以下这些:

0x10:通用拒绝。

0x11:服务不支持。

0x12:子功能不支持。请求的服务子功能参数无效。

0x13:报文长度或格式无效。请求报文的长度不对或格式不规范。

**0x22:**条件不正确,ECU当前状态无法执行该请求。

0x24:请求报文的顺序不正确。

0x31:请求超出范围。请求的参数无效、不支持、不存在。

0x33:安全访问被拒绝。密钥错误、尝试次数超限、顺序错误。

0x35:无效密钥。(27服务)

0x36:尝试次数超限。(27服务)

0x37:超时时间未到。(27服务)

0x70:不允许上传/下载。(34服务)

0x71:数据传输中止。

0x72:擦除或烧写内存时错误。

0x73:块序列计数错误。

0x78:请求已正确接收,响应挂起。

0x7E:当前会话下不支持此子功能。

0x7F:当前会话下,该服务不支持。

0x92:电压过高。

0x93:电压过低。

2.4、超时机制

2.4.1、传输层时间参数

BS(Block Size):接收方表示发送流控帧之后,发送方被允许连续发送的最大帧数目。特殊情况下,如果该值为0,则表示发送连续帧没有限制,如果该值为8,表示发送方最多能连续发送8帧连续帧就回继续收到接收方流控帧。

**STmin:**表示接收方发送流控帧之后,发送方发送连续帧之间的时间的最小间隔。如果该值为0,则表示对于发送方发送连续帧的最小时间没有要求。

2.4.2、网络层时间参数

N_As:发送方没有及时发送N_PDU。

N_Ar:接收方没有及时接收N_PDU。

N_Bs:发送方没有接收到流控帧或在首帧前收到,或连续帧没有被接收方接收到。

N_Cr:接收方没有收到连续帧或之前流控帧未被发送方接收到。

2.4.3、会话层时间参数

S3Client:表示Tester为保持一个ECU或者多个ECU节点同时保持在非默认会话下的时间间隔(3E服务发送时间间隔)。超时值5000ms。

S3Server(S3Timeout):表示ECU未接受到任意诊断报文,维持在非默认会话下的时间间隔。超时值0-4000ms,一般为2000ms。

2.4.4、应用层时间参数

P2CAN_Server:对于服务器接收到请求消息后发出响应消息时间的性能要求。超时值0-50ms。

P2CAN_Client:客户端在成功发送完请求消息后等待服务器发送的响应时的超时设置(FF或SF)。一般为150ms。

P2*CAN_Server:当服务器在发送否定响应码0x78的否定响应后,到服务器发出响应消息时间的性能要求。超时时间0-5000ms。

P2*CAN_Client:当客户端在接收到否定响应码0x78的否定响应后,等待服务器发送响应时的增强型超时设置(FF或SF)。一般为5100ms。

**P3CAN_Client_Phys:**客户端成功发送物理寻址请求消息,并且该请求消息不需要服务器进行响应后,客户端在此发送下一个物理寻址请求消息的最小时间间隔。至少50ms。

**P3CAN_Client_Func:**客户端成功发送完功能寻址请求消息,并再次发送下一个功能寻址请求消息时的最小时间间隔,分两种情况:一种为客户发送端发送的请求不需要服务器响应,一种为仅有部分支持该请求的服务器响应,即存在部分服务器不给予响应。至少50ms。

2.4.5、超时类型

P2超时(请求响应超时):诊断仪发送单帧请求后,等待ECU返回响应的最大时间。超时时间可由2000ms扩展至5000ms。触发场景有读DID、读故障码、安全访问请求等单帧交互。

P2*超时(扩展响应超时):ECU需要更长时间处理请求时,先返回0x78(请求正确接待,等待响应),诊断仪后续等待的最大时间。超时时间一般为5000ms。触发场景有编程、擦除、ECU闪存、大批量故障码读取等耗时操作。

**T3超时(会话超时):**ECU进入非默认会话(扩展会话/编程会话)后,无任何诊断交互的最大空闲时间。超时时间5-30s,由主机厂定义。触发场景时诊断仪切换会话后未执行任何操作。

**传输层超时:**多帧传输时,ECU回复流控帧后,诊断仪发送连续帧的间隔超时;或诊断仪发首帧后,ECU回复流控帧的超时。流控帧间隔(STmin)0-127ms,流控帧响应100ms。

2.5、帧传输类型

2.5.1、单帧传输

有效数据长度<=7个字节,不足的地方以填充位填充。发送数据的第一个字节的高四位为0表示发送的数据帧为单帧,低四位表示要发送的有效数据的字节长度。

2.5.2、多帧传输

有效数据长度>7个字节,最多允许4095个字节。第一帧(First Frame,FF),描述传输的起始+6个字节有效数据;流控帧(Flow Control,FC),传输过程中,报文流控制;连续帧(ConsecutiveFrame,CF),传输数据。

一、第一帧-启动传输:发送数据的第一个字节的高四位为1表示发送的数据帧为多帧的首帧,低四位和第二个字节的表示要发送数据的长度。

二、流控帧-握手:接收数据的第一个字节的高四位为3表示所接受的数据帧为流控帧,低四位表示接收此流控帧的发送端所需要进行的动作,第二个字节BS表示发送连续帧的数量,第三个字节Stmin表示每两帧之间的时间间隔。

三、连续帧-数据传输:发送数据的第一个字节的高四位为2表示发送的数据帧为多帧的连续帧。接收端在接收到连续帧并比对SN之后将数据放入接收缓存区。

2.6、诊断会话模式状态转移

a:服务器上电或者复位;

b:服务器接收到DS_=DS的DSC请求报文;

c:服务器接收到DS_=PRGS或EXTDS的DSC请求报文,依据DS_进入扩展模式或者编程模式;

d:服务器接收到DS_=DS的DSC请求报文,或者S3Server超时,服务器的安全状态变为锁定状态;

e:服务器接收到DS_=PRGS的DSC请求报文;

f:服务器接收到DS_=EXTDS的DSC请求报文。

三、诊断服务详述

3.1、诊断和通信管理功能单元

3.1.1、0x10-诊断会话控制(Diagnostic Session Control)

用于切换ECU的诊断模式。包括三个子功能:01默认会话,02编程会话,03扩展会话,三个会话之间切换关系如下:

当进入到一个非默认会话,一个定时器会开始运转,一段时间内没有收到任何请求,一旦时间到达,诊断会退回到默认会话01。也可以使用3E服务使诊断保持在非默认会话。

ECU肯定响应时,需要两个参数P2和P2*。0x10是最基础的服务,通常不会有否定响应。

3.1.2、0x11-ECU复位(ECU Reset)

复位ECU。包括4个子功能:

01:HardReset,硬复位,ECU断电完全重启。

02:KeyOffOnReset,下电复位,ECU处于点火下电状态。

03:SoftReset,软件复位,重启应用层,软件功能回到默认状态。

04:EnableRapidPowerShutDown,快速下电使能,ECU进入休眠模式。

3.1.3、0x27-安全访问(Security Access)

安全访问:解锁受保护功能的钥匙。完成安全访问的步骤如下:

1.诊断仪向ECU请求种子;

2.ECU向诊断仪发送种子;

3.诊断仪根据种子及与ECU内部相同的算法算出"Key1",并发送给ECU;

4.ECU校验诊断仪发来的"Key1"是否有效

3.1.4、0x28-通信控制(Communication Control)

控制某类通信关闭/开启接收或者发送。常用的子功能有两个:00开启通信,03禁止收发。只有扩展会话模式才支持0x28服务,其它会话模式下,ECU会回复否定响应7F 28 7E。

3.1.5、0x3E-待机握手(Tester Present)

用于ECU保持当前诊断会话。两个子功能:00需要ECU响应,80不需要ECU响应。子功能80不需要响应通常使用一致肯定响应来实现,ECU一般不实现子功能80。

ECU否定响应时,有可能是会话模式导致的,因为只有扩展会话模式才支持0x28服务,处于其他模式,ECU会恢复否定响应7F 28 7E。

3.1.6、0x83-访问时间参数(Access Timing Parameter)

允许诊断客户端(如诊断仪)读取和/或调整ECU内部的时间参数 ,主要用于同步时序性能优化。 包括这些子功能:01读取扩展的时序参数,02将所有时序参数更改为默认值,03读取当前使用的时序参数,04检查在当前条件下是否可以更改时序参数。

请求格式:0x83+子功能+时序参数请求

正响应:0xC3+时序变量访问类型+时序参数回应

否定响应:0x12/0x13/0x22/0x31

3.1.7、0x84-安全数据传输(Secured Data Transmision)

非安全 的诊断通信(如CAN总线,数据明文传输,易被窃听和篡改)之上,建立一个临时的、安全的加密通道,确保在会话期间传输的诊断数据不被窃取或篡改。主要用于刷写ECU软件、读写安全关键数据、传输敏感诊断信息。

请求格式:0x84+安全数据请求

正响应:0xC4+安全数据回复

否定响应:0x13

3.1.8、0x85-控制DTC设置(Control DTC Setting)

控制DTC设置服务用于控制ECU的DTC存储。两个子功能:01开启DTC记录,02关闭DTC记录。只有扩展会话模式才支持0x85服务,处于其它模式,ECU会回复否定响应7F 85 7E。

3.1.9、0x86-时间响应(Response On Event)

允许诊断客户端(如诊断仪)订阅ECU内部发生的特定事件,并在事件发生时立即获得主动通知,而不是通过传统的周期性轮询方式来查询。包括以下子功能:00停止服务器发送事件响应,01检测到与为此事件指定的DTCStatusMask匹配的新DTC,02计时器中断,03DID标识的新内部数据,04报告已在服务器中使用ResponseOnEvent服务激活的所有事件,05指示服务器激活已设置的事件逻辑并开始发送事件响应,06清除服务器中已设置的事件逻辑,07DID标识的特定记录中定义的数据值更改,20~2F由OEM定义,30~3E由供应商定义。

请求格式:0x86+子功能+事件窗口时间+时间类型+响应服务。事件窗口时间含义-02 有限时间的响应,03~7F OEM规定

正响应:0xC6+时间类型+标识时间数量+事件窗口时间+事件类型记录+服务响应记录

否定响应:0x12/0x13/0x22/0x31

允许诊断客户端(诊断仪)配置和控制与ECU之间诊断通信链路的底层参数,以优化通信性能、适应不同的物理网络环境或满足特殊的测试需求。包括以下子功能:01验证波特率、02切换到特定的波特率、03进入静默模式、04退出静默模式、05调整电气参数、06验证初始配置。

请求报文格式:0x87+子功能+链接控制模式识别符

肯定响应:0xC7+链接控制类型

否定响应:0x12-子函数参数不支持时,0x13-请求报文长度不正确时,0x22-不符合要求的链路控制标准,0x24-当客户端请求转换操作模式,而不需要预先的验证步骤,该步骤指定要转换到的模式,0x31-如果链接控制模式识别符无效时,指定的模式参数无效时。

3.2、数据传输功能单元

3.2.1、0x22-通过ID读数据(Read Data By Identifier)

按标识符读数据(DID)。常用的DID如下:

通过ID读数据通常不需要使用子功能,使用SID+DID可发请求。

3.2.2、0x23-通过地址读取内存(Read Mmeory By Address)

客户端请求读取提供的内存范围的当前值。该服务允许客户端通过提供的其实地址从服务器请求内存数据,并指定要读取的内存大小。该服务请求消息用用于从由参数memoryAddress和memorySize标识的服务器请求内存数据。

请求格式:0x23+地址和长度格式识别符+存储地址+存储大小

正响应:0x63+数据

否定响应:0x13/0x22/0x31/0x33

3.2.3、0x24-通过ID读比例数据(Read Scaling Data By Identifier)

该服务允许客户端请求读取DID记录的缩放信息。客户端请求消息包含一个DID值,该值标识服务器维护的数据记录。

请求格式:0x24+DID

正响应:0x64+DID+缩放字节+缩放字节扩展。缩放字节的说明如下:

否定响应:0x13/0x22/0x31/0x33

3.2.4、0x2A-通过周期ID读数据(Read Data By Peridic Identifier)

客户端请求调度服务器中的数据以进行定期传输。该服务允许客户端从服务器请求由一个或多个PeiodicDID标识的数据记录值的定期传输。

请求格式:0x2A+发送模式+PeiodicDID。发送模式的说明如下:

正响应:0x6A+PeiodicDID+数据

否定响应:0x13/0x22/0x31/0x33

3.2.5、0x2C-动态定义数据ID(Dynamically Define Data Identifier)

客户端请求动态定义数据标识符,这些数据标识符随后可以由0x22服务读取。该服务的目的是为客户端提供将一个或多个数据元素分组为数据超集的功能,可以通过0x22或0x2A服务进行整体请求。动态定义的DID会将包含数据参数定义的串联,分组的数据元素可以由以下任何一个组成:源数据标识符,位置和大小;存储地址和存储长度;以上两种方法的组合。

包含以下子功能:01defineByIdentifier,向服务器指定动态DID的定义应通过DID引用进行;02defineByMemoryAddess,向服务器指定动态DID的定义通过地址引用进行仅在开发阶段使用,03clearDynamicallyDefinedDataIdentifier,清除指定的动态DID

请求格式:

1.defineByIdentifier:0x2C+子功能+动态定义DID+源DID+源数据中的位置+内存大小+源DID+源数据位置+内存大小

2.defineByMemoryAddess:0x2C+子功能+动态定义DID+地址和长度格式标识符+存储地址+内存大小

3.clearDynamicallyDefinedDataIdentifier:0x2C+子功能+动态定义DID

一些参数的解释:

动态定义DID:指定在将来对0x22服务或0x2A服务的调用中如何引用由客户端定义DID。必须在0x22服务中作为DID处理。

源DID:仅在01子功能存在。在逻辑上指定要包含在动态DID中的信息源。

源数据的位置:仅在01子功能存在。用于指定要包含在动态数据记录中的源数据记录摘录的起始字节位置。

地址和长度标识符:每个半字节分别编码。

存储地址:仅在02子功能中存在。要包含在动态DID中的信息的内存源地址。

内存大小:指定源数据记录/存储地址中要包含在动态DID中的字节总数。

正响应:0x6C+定义类型+动态定义DID

负响应:0x12/0x13/0x22/0x31/0x33

3.2.6、0x2E-通过ID写数据(Write Data By Identifier)

与0x22类似,写入数据到ECU。ECU只有在安全状态为解锁状态下才支持0x2E服务,当ECU处于未解锁状态时,ECU会回复否定响应7F 2E 33。

3.2.7、0x3D-通过地址写内存(Write Mmeory By Address)

该服务时客户端请求覆盖指定的内存范围。该服务会将参数数据记录 指定的数据写入由参数存储地址存储大小 指定的存储位置的服务器。**存储地址和内存大小参数的字节数由地址和长度格式标识符定义。**该服务可能时用来清除NVM、更改校准值。

请求格式:0x3D+地址和长度格式标识符+存储地址+内存大小+数据记录

正响应:0x7D+地址和长度格式标识符+存储地址+内存大小

负响应:0x13/0x22/0x31/0x33/0x72

3.3、存储数据传输功能单元

3.3.1、0x14-清除诊断信息(Clear Diagnostic Information)

清除ECU中的存储的DTC信息。当ECU完全处理0x14服务或ECU没有存储DTC内容,也应回复肯定响应。使用SID+DTC编号进行诊断信息清除。

3.3.2、0x19-读取故障码信息(Read DTC Information)

读取DTC信息。常用的子服务包括:

01:读取符合掩码条件的DTC数量,后面的参数时DTC掩码状态。

02:读取符合掩码条件的DTC列表及其状态。

04:根据DTC编号读取快照信息,也叫冻结帧。

06:读取DTC扩展信息。

0A:读取所有DTC及其状态。

3.4、IO控制功能单元

3.4.1、0x2F-通过ID控制输入输出(Input Output Control By Identifier)

通过ID控制IO服务可以通过DID进行输入信号的替换和控制零部件负载输出。报文格式:2F DID IO控制类型。DID是第二第三字节,IO控制类型是第四字节。IO控制类型分为4类:

00是控制权还给ECU(常用);01是复位为默认值(不常用);02是冻结当前的状态(不常用);03是短暂接管控制权(常用)。前三种控制类型的请求报文时4个字节。最后一种控制类型,请求报文的第五个字节时控制代码,也可以是数字量。

只有在扩展会话模式才支持0x2F服务,如果处于其它会话模式,则会回复否定响应 7F 2F 7F,需要切换至扩展会话。

只有在安全状态为解锁状态下才支持0x2F服务,如果ECU未解锁,则会回复否定响应 7F 2F 33,需要先解锁ECU。

3.5、例行程序功能单元

3.5.1、0x31-例行程序控制(Routine Control)

例行程序控制服务可以通过RID(程序表示符)来进行例行程序的控制,通常用于例行程序的开启与关闭,长度2个字节。有三个子功能:01开启程序,02关闭程序,03请求例行程序控制结果。

ECU肯定响应时,参数通常为3个字节,前两个字节为RID,第三个字节为例行程序的最新状态,状态字节的值与状态之间的对应关系有用户自行定义

只有在扩展会话才支持该服务,如果处于其它会话,ECU会回复否定响应7F 31 7E。

只有在安全状态为解锁状态下才支持0x31服务,ECU未解锁时,会回复否定7F 31 33。

3.6、上传下载功能单元

3.6.1、0x34-请求下载(Request Download)

主要在启动下载传输前启用,作用是提醒ECU准备接收数据,ECU通过0x74告诉诊断仪自己是否允许传输,以及自己的接受能力是多大。这个服务主要是用来给ECU下载数据,最常用是在Bootloader中,程序下载工具会发起下载请求,完成ECU程序升级。

请求下载服务SID后通常使用10个字节的参数,第一个字节通常使用0x00,第二个字节使用0x44,后续4个字节代表下载的地址,最后4个字节代表下载的数据块大小。

ECU肯定响应时,参数一共3个字节,第一个字节通常使用0x20,后续两个字节代表数据块大小的最大值。

否定响应码可以使用0x31/0x70。在ECU未解锁状态下,控制器可能会回复7F 34 33。

3.6.2、0x35-请求上传(Request Upload)

客户端请求从服务端到客户端的数据传输。服务器收到requestUpload请求消息后,服务器应采取所有必要的措施在发送肯定响应消息之前发送数据。

请求格式:0x35+数据格式标识符+地址和长度格式标识符+存储地址+存储大小。数据格式标识符,高位表示"compressionMethod",低位表示"encyptingMethod";地址和长度格式标识符,bit7-4存储大小,bit3-0存储地址;存储地址,写入数据的服务器内存的起始地址;存储大小,将未压缩的内存大小与传输数据服务期间的传输的数据总量进行比较。

正响应:0x75+长度格式标识符+块长度的最大数量

负响应:0x13/0x22/0x31/0x33/0x70

3.6.3、0x36-数据传输(Transfer Data)

数据传输服务在0x34服务得到了正确响应后,诊断仪就要启动数据传输过程了。该服务没有子功能,服务的参数数量由数据块大小决定,第一个字节是数据的序列编号,编号从1开始,通常情况下,诊断仪需要是使用多帧报文才能将数据库发给ECU,这时候需要首帧与连续帧。

ECU肯定响应时,参数为1个字节代表数据块的序列编号;ECU否定响应时,否定响应码除了0x31之外还可以使用0x71/0x72/0x73。

3.6.4、0x37-请求退出传输(Request Transfer Exit)

请求退出服务用于退出上传下载,即诊断仪通过该诊断服务停止与ECU之间的数据传输。

请求格式:0x37+传输请求参数记录

正响应:0x77+传输请求参数记录

负响应:0x13/0x24/0x31/0x72

3.6.5、0x38-请求文件传输(Request File Transfer)

客户端用于初始化从客户端到服务端或者服务端到客户端的文件数据传输。

请求格式:0x38+操作模式+文件路径和名称长度+文件路径和名称+数据格式标识符+文件大小参数长度+未压缩文件大小+压缩文件大小

操作模式:定义了文件或目录的操作类型。如下表所示

文件路径和名称:定义了服务端中文件系统的位置,是增加,删除。替代或是读取,取决于操作模式。另外,该参数包含了文件名,名字可以作为文件路径中的部分可以被增加,删除,替代或是读取。

数据格式标识符:该数据参数是单字节值,其每一位都可以单独编码。高位指定了压缩方法,低位指定了加密方法。0x00表示既没有压缩也没有加密。除0x00外都有汽车制造厂商指定。

正响应:0x78+操作模式+长度格式标识符+块长度的最大数量+数据格式表示符+文件大小或路径信息参数长度+文件未压缩大小或路径信息长度

负响应:0x13/0x22/0x31/0x33/0x70

四、诊断服务配置方式

Y代表支持,-代表不支持,Y*代表仅在安全状态为解锁状态下才支持。

参考链接:

UDS快速参考手册https://www.canfd.net/udsreference.html#%E5%90%A6%E5%AE%9A%E5%93%8D%E5%BA%94%E7%A0%81NRCUDS(ISO14229)诊断服务功能及描述完结篇_uds14229-CSDN博客https://blog.csdn.net/qq_42957717/article/details/115954087车载诊断-UDS 诊断协议1 - 知乎https://zhuanlan.zhihu.com/p/1987573852121884177

跟我学UDS-墨客博客https://xcnm.net/categories/gen-wo-xue-uds/page/2

相关推荐
汽车通信软件大头兵18 小时前
Autosar--ETAS Isolar能够自由学习啦!
网络·学习·安全·汽车·etas·uds·isoalr
汽车通信软件大头兵19 小时前
Autosar 工具 :Vector Davince 可用于个人学习啦
学习·汽车·uds·isolar
无畏jh9 天前
【汽车嵌入式开发】-CAN通信解读
can通信·汽车嵌入式
汽车通信软件大头兵13 天前
Autosar KeyM模块
网络·安全·汽车·uds·isolar
无畏jh13 天前
Autosar架构学习-加密模块
汽车嵌入式·汽车autosar
明如正午17 天前
UDS中NRC否定响应码理解
uds
汽车通信软件大头兵20 天前
信息安全--安全XCP方案
网络·安全·汽车·uds
沪漂的码农20 天前
UDS诊断物理层时间参数详解技术文章
c语言·can·uds
无畏jh21 天前
AutoSar架构学习-诊断模块
汽车嵌入式·汽车autosar