一、概述
UDS(Unified Diagnostic Services),统一的诊断服务。协议的应用层定义是ISO 14229-1,目前大部分汽车厂商均采用UDS on CAN的诊断协议。
UDS本质上是一种定向的通信,是一种交互协议(Request/Response),可以理解为C/S模式,Tester为client端,ECU为Server端,即诊断方(Tester)给ECU发送指定的请求数据(Request),ECU服务端回复肯定或否定响应。
1、SID:Service Identifier,诊断服务ID
范围:00~FF,1字节无符号整数,最小的是0x10,(因为小于0x10的服务是OBD协议中规定的)。
2、SF:sub-function,子功能
SF严格来说是7个bit,而不是1个byte,因为它的最高位bit被用于抑制正响应(suppresspositive response,SPR),如果这个bit被置1,则ECU不会给出正响应(positive response);如果这个bit被置0,则ECU会给出正响应。
这个位是用来抑制肯定响应的,即本应回复肯定响应帧,但是发出方要求对方静默,不需要对方回复肯定响应。这个位的位置和子服务在同一个字节(应用层数据第二字节),为bit7,高位。比如SID是0x10,子服务是0x01,如果是抑制肯定响应的话,子服务这个字节要改成0x81。这样发下去ECU就不会回复肯定响应了
3、请求和响应
每一个ECU都有2个CAN的诊断帧ID,分别对应物理寻址的收与发。通常由主机厂来确定不同ECU的这两个特定的诊断ID。比如0x701对应接收Tester的消息,0x709对应ECU发给Tester的消息。
客户端请求(Request)服务几种格式:
1)req 只有SID,比如待机握手服务($3E),请求格式为3E;
2) SID+SF,比如诊断会话控制服务($10)的编程会话,请求格式为10 02;
3)SID+SF+Parameter,比如安全访问服务($27)的发送密钥,请求格式为27 02 XX XX;
4) SID+Parameter,比如读取数据服务($22), 请求格式为 22 XX XX。
服务端两类响应:
1)肯定的响应(Positive Response):回复[SID+0x40],如请求10,响应50;请求22,响应62。
2)否定的响应(Negative Response):回复7F+SID+NRC,回复的是一个声明,格式固定为3个字节,第一个字节为0x7F,第二个字节是被拒绝掉的SID(仍为请求的SID),第三个字节NRC是这个诊断服务无法被执行的原因。
3)举例:
请求(Request): 02 10 02 xx xx xx xx xx
02中的0代表网络层单帧SF,2代表 数据域有2个字节;10是SID,02是子功能
肯定响应:02 50 02 xx xx xx xx xx
02同上,50(10+40)表示对SID的肯定回复,02是子功能
否定响应:03 7F 10 22 xx xx xx xx
03同上,7F表示否定响应,10是SID,22是NRC
4)NRC
二、26种服务
ISO14229-1协议定义了6类功能,26种服务,分别是:
1)诊断和通信管理功能单元,包括10,11,27,28,3E,83,84,85,86,87共10种服务;
2)数据传输功能单元,包括22,23,24,2A,2C,2E,3D共7种服务;
3)存储数据传输功能单元,包括14,19共2种服务;
4)输入输出控制功能单元,包括2F服务;
5)例行程序功能单元,包括31服务;
6)上传下载控制功能单元,包括34,35,36,37,38共5种服务。
1、$10 Diagnostic Session Control(诊断会话)
包含3个子功能:
1)01 Default:ECU上电时,进入的是默认会话。如果您进入了一个非默认会话的状态,一个定时器会运转,如果一段时间内没有请求,那么到时间后,诊断退回到默认会话01(最低权限)。
2)02 Programming:编程模式用于解锁bootloader相关的诊断服务,即程序烧录升级。
3)03 Extended:扩展模式通常用于解锁高权限诊断服务,例如写入数据/参数、读写诊断码;
S3定时器:
1)S3server:服务器的定时参数,通常取5000ms,仅用于非默认会话模式。在S3Server 时间内,如果服务端没有收到任何诊断请求服务,则退出非默认会话,返回默认会话。
2)S3client:客户端的定时参数,通常取4000ms,客户端为保持非默认会话自动化连接,两个连续的待机握手服务请求的间隔时间(3E 发送间隔时间)。
2、$11 ECUReset
1)11 01:hardReset: 相当于断开电源,再上电。re-initialization of both volatile memory and non-volatile memory
2)11 02:keyOffOnReset:类似于司机关闭和重新启动点火钥匙。 non-volatile memory locations are preserved; volatile memory will be initialized
3)11 03:softReset
3、$19 Read DTC Information
DTC(diagnostic trouble code):如果系统检测到了一个错误,它将其存储为DTC。19服务拥有28个子服务(Sub-Function)。
常用的子服务:
1)01:读取符合掩码条件的DTC数量
19 01 01 读当前故障
19 01 08 读历史故障
19 01 09 读当前和历史故障
2)02:读取符合掩码条件的DTC列表及其状态
3)0A:读ECU支持的所有DTC数据
4、$14 Clear Diagnostic Information(清除诊断信息)
清除(复位)DTC格式,它可以改变DTC的状态,3个FF代表清除所有DTC。
Request:14+FF+FF+FF;
Response:54
5、$22 Read Data By Identifier(通过ID读数据)
1)读取单个DID:
req:22+DID(Data Identifier,通常是两个字节)
正向响应:
(SID+40)+DID+Data:response: 62+DID+Data
2)读取多个DID:如读取DID:0x010A和0x0110:
req: 22 01 0A 01 10
response:
62 01 0A A6 66 07 50 20 1A 00 63 4A 82 7E 01 10 8C
3)部分常用DID:
6、$23 ReadMemoryByAddress
23 AA memoryAddress memorySize:
第二部分AA是格式信息,长度为1个byte,高4 bits用于指示memorySize的长度(即size值的字节长度),低4bits用于指示memoryAddress的长度,即变量地址所占字节数。如编译生成的map文件中某变量A所在的地址为0x1fff’fc98,长度为0x70 ,那AA应该为14,长度为1个字节,地址为4个字节
7、$27 Security Access(安全访问)
在读取特定数据时,需要先进行一个安全解锁,ECU上电后,为locked状态,通过27 服务,加上一个子服务,再加上一个钥匙,这样服务请求解锁。
过程:
1)Tester 向Ecu发送请求:
如Rx: 02 27 05 00 00 00 00 00 安全访问,05子功能
2)ECU回复Tester,发送seed。
ECU回复 67+01+AA+BB+CC+DD,AA~DD就是种子了
Tx: 07 67 05 08 27 11 F0 77 肯定响应,回复了对应安全级别的种子
3)诊断端会利用种子进行运算(利用整车厂的算法),生成k1,发送回ECU。
发送请求27+06+[k1]
Rx: 06 27 06 FF FF FF FF 00 发送密钥,4个FF(注意06是与05成对使用的)
4)ECU同样也会通过种子算出k2,和收到的k1比较。当k1和k2匹配时,解锁(Unlocked)成功。
Tx: 02 67 06 00 00 00 00 00 肯定响应,通过安全校验
先客户端(也叫测试端)请求种子,再服务端(ECU)发送种子,然后客户端根据种子计算密钥,发送密钥,最后服务端确认密钥,有效则解锁。
request message definition - sub-function = requestSeed:
请求种子的子功能均为奇数
request message definition - sub-function = sendKey:
发送种子的子功能均为偶数
8、$28 CommunicationControl
该服务用于打开/关闭某些类别的报文的发送/接收,它通常在刷写软件或大量数据的时候使用。
0x00 enableRxAndTx (激活接收和发送)
0x01 enableRxAndDisableTx(激活接收和关闭发送)
0x02 disableRxAndEnableTx(激活发送和关闭接收)
0x03 disableRxAndTx(关闭接收和发送)
0x04 enableRxAndDisableTxWithEnhancedAddressInformation(激活接收和关闭发送,针对特定的地址)
0x05 enableRxAndTxWithEnhancedAddressInformation(激活接收和发送,针对特定的地址)
9、$2E Write Data By Identifier(通过ID写数据)
请求:2E+DID+Data
对于写数据的请求,一般来说需要在一个非默认会话,或解锁的状态下才能进行。
响应:6E+DID
正确的顺序是10开头的帧请求、30开头的帧回复、21开头再请求、22开头继续请求、03开头回复确认。
1)10 14根据ISO15765-2代表这是一组多帧中的首帧(属于传输层的信息),一会要发0x14=20个字节的有效数据。
2)30 00 0A是TP层(传输层)的信息,表示这是一个流控帧,ECU发出的,表示可以一直连续发,但连续帧最短的间隔时间要求是10ms。
3)21是TP层的信息,表示这是一个连续帧,序号为1,后面是VIN码的第4字节到第10字节。
4)22是TP层的信息,表示这是一个连续帧,序号为2,后面是VIN码的第11字节到第17字节。
5)03的0表示这是一个单帧,3表示后面有3个有效字节。6E表示我们确认执行了2E服务的请求,这个请求写入的ID是F190,即VIN码。
10、$2F InputOutput Control
该服务可以通过DID(数据标识符)来进行输入信号的替换和控制零部件负载输出。该报文的请求至少由4个字节组成,第一个字节是2F,第二第三字节是DID,其中第二字节是高位。第四字节是子功能,IO控制类型。
00是控制权还给ECU,Return Control To ECU
01是复位为默认值,Reset to Default
02是冻结当前的状态,Freeze Current State
03是短暂接管控制权,Short Term Adjustment,请求报文的第五字节是控制代码,可以是数字量,比如01是开,00是关
11、$3E Tester Present(待机握手)
改服务用于向服务器指示诊断仪仍然连接在网络上,之前已经激活的诊断服务功能可以仍然保持激活状态。
02 3E 00 00 00 00 00 00,发送一个3E服务的报文,保持非默认会话状态
12、$3D WriteMemoryByAddress
13、$85 ControlDTCSetting
打开还是关闭ECU的DTC存储
14、$31 RoutineControl
31服务是调用ECU内置的一些操作序列的接口,这个服务应用灵活,OEM可以根据自己的需要为ECU定义各种各样的内部操作,而要执行这些操作只需要调用31服务就可以实现。典型的用途包括检查边界条件、清除闪存、对数据进行较验、对软硬件依赖性进行校验,甚至有需要的话可以进行恢复出厂设置的操作,还有与ECU自身逻辑功能相关的操作也可以定义。
请求格式为:SID+SF+RID+非必须选项
SF:01开启,02停止,03请求结果
RID:用于标识要执行的routine
15、$34 RequestDownload
请求格式:
dataFormatIdentifier:存在压缩方式compressionMethod = 0x1X,加密方式encryptingMethod = 0xX1和通用方式,值为00标识通用方式。
addressAndLengthFormatIdentifier:高位bit 7 - 4:表示长度值memorySize所占的字节长度,低位bit3-0: 表示内存地址memoryAddress所占的字节长度。
正向回应:
lengthFormatIdentifier:高位bit 7 - 4: 表示maxNumberOfBlockLength 所占字节长度;bit 3 - 0: 预留,set 0
maxNumberOfBlockLength:为数据传输时,每次所允许最大的数据字节长度。
16、$35 RequestUpload
17、$36 TransferData
blockSequenceCounter:从0x01开始,每次+1,达到0xFF之后再从0开始
18、$37 RequestTransferExit
19、$38 RequestFileTransfer
三、数据传输
ISO15765-2协议:
1)FirstFrame(FF,首帧)
N_PCI类型:第一个字节高位为1
2)ConsecutiveFrame(CF,续帧)
N_PCI类型:第一个字节高位为2
第一个字节低位表示续帧的顺序,按规定的要求顺序发送数据给客户端。当连续帧编号SN大于15时,在下一个连续帧中重置为0
3)FlowControl(FC,流控帧)
N_PCI类型:第一个字节高位为3
FS(flow status),即流控状态:第一个字节低位
BS(block size),即一帧流控帧所允许发送的续帧数量: 第二个字节0x00 表示只发一帧流控帧,服务端将一直发续帧直到全部数据发送完毕
STmin(separation time)表示要求续帧之间的最小时间间隔:第三个字节0x0A表示续帧发送的最小时间间隔多长(0x0A,10ms)
4)事例
客户端请求: 22 F1 90 (单帧传输)
服务端响应: 62 F1 90 57 30 4C 30 30 30 30 34 33 4D 42 35 34 31 33 32 36(多帧传输),其多帧传输的具体过程为:
服务端响应首帧(FF): 10 14 62 F1 90 57 30 30
—14表示数据长度信息,数据长度为20个字节
客户端收到首帧,发送流控帧(FC): 30 00 0A
服务端收到流控帧,发送第一条续帧(CF):21 30 30 34 33 4D 42 35,
服务端间隔10ms(即0x0A)后,发送第2条续帧(CF): 22 34 31 33 32 36
服务端响应发送完毕。