本篇文章主要介绍在ISO 14229-1标准中定义的UDS服务——$2E WriteDataByIdentifier,其为Tester提供了向目标ECU请求写入指定数据记录到指定DID的能力。
目录
1 服务介绍
$2E WriteDataByIdentifier服务允许Tester向ECU写入指定数据记录到指定DID所存储的位置,该DID可以是非保密或保密的。出于安全原因,ECU可能会限制或禁止对某些DID的写入,这些DID由系统供应商和车辆制造商定义为只读DID。
$2E服务不支持动态DID,执行该服务时需要满足的条件由车辆制造商规定。以下情况可能会用到该服务:
- 将配置信息刷写到ECU(例如VIN码)
- 清除NVM数据
- 重置自学习值
- 设置选项内容
2 服务数据格式
2.1 请求数据格式
以下是$2E服务的请求数据格式:
字节序 | 参数 | 字节值 | 说明 |
---|---|---|---|
#Byte1 | WriteDataByIdentifier SID | 0x2E | 必选 |
#Byte2 – #Byte3 | dataIdentifier[] = [byte#1 : byte#2](MSB) | 0x00 – 0xFF 0x00 – 0xFF | 必选 |
#Byte4 – #ByteM+3 | dataRecord[] = [data#1 : data#M] | 0x00 – 0xFF – 0x00 – 0xFF | 必选 |
2.1.1 dataIdentifier
dataIdentifier参数表示Tester向ECU请求写入数据记录的标识符
2.1.2 dataRecord
dataRecord参数表示Tester向ECU请求写入的数据记录
2.2 肯定响应数据格式
以下是$2E服务的肯定响应数据格式:
字节序 | 参数 | 字节值 | 说明 |
---|---|---|---|
#Byte1 | WriteDataByIdentifier SID + 0x40 | 0x6E | 必选 |
#Byte2 – #Byte3 | dataIdentifier[] = [byte#1 : byte#2](MSB) | 0x00 – 0xFF 0x00 – 0xFF | 必选 |
2.2.1 dataIdentifier
dataIdentifier是对应$2E服务请求报文中的dataIdentifier参数回显。
2.3 否定响应数据格式
以下是$2E服务的否定响应数据格式:
字节序 | 参数 | 字节值 | 说明 |
---|---|---|---|
#Byte1 | Negative Response SID | 0x7F | 必选 |
#Byte2 | WriteDataByIdentifier SID | 0x2E | 必选 |
#Byte3 | NRC | supportedNRC | 必选 |
supportedNRC的可选值如下表所示:
supportedNRC | NRC define | 描述 |
---|---|---|
0x13 | incorrectMessageLengthOrInvalidFormat | 诊断请求指令的长度或格式不对 |
0x22 | conditionsNotCorrect | 执行诊断的条件不满足 |
0x31 | requestOutOfRange | 诊断请求参数超出范围或DID/RID不支持 |
0x33 | securityAccessDenied | 不满足安全策略 |
0x72 | generalProgrammingFailure | 擦除或刷写内存时错误 |
3 服务通信示例
3.1 写入DID 0xF190(VIN)
本例展示了Tester如何通过$2E服务向ECU写入DID 0xF190的值,其包含了VIN码信息,其中,存在以下条件:
- sub-function bit7: SPR = 0
3.1.1 请求报文
字节序 | 参数 | 字节值 |
---|---|---|
#Byte1 | WriteDataByIdentifier SID | 0x2E |
#Byte2 | dataIdentifier[byte#1] | 0xF1 |
#Byte3 | dataIdentifier[byte#2] | 0x90 |
#Byte4 | dataRecord[data#1] = VIN 1 = “W” | 0x57 |
#Byte5 | dataRecord[data#2] = VIN 2 = “0” | 0x30 |
#Byte6 | dataRecord[data#3] = VIN 3 = “L” | 0x4C |
#Byte7 | dataRecord[data#4] = VIN 4 = “0” | 0x30 |
#Byte8 | dataRecord[data#5] = VIN 5 = “0” | 0x30 |
#Byte9 | dataRecord[data#6] = VIN 6 = “0” | 0x30 |
#Byte10 | dataRecord[data#7] = VIN 7 = “0” | 0x30 |
#Byte11 | dataRecord[data#8] = VIN 8 = “4” | 0x34 |
#Byte12 | dataRecord[data#9] = VIN 9 = “3” | 0x33 |
#Byte13 | dataRecord[data#10] = VIN 10 = “M” | 0x4D |
#Byte14 | dataRecord[data#11] = VIN 11 = “B” | 0x42 |
#Byte15 | dataRecord[data#12] = VIN 12 = “5” | 0x35 |
#Byte16 | dataRecord[data#13] = VIN 13 = “4” | 0x34 |
#Byte17 | dataRecord[data#14] = VIN 14 = “1” | 0x31 |
#Byte18 | dataRecord[data#15] = VIN 15 = “3” | 0x33 |
#Byte19 | dataRecord[data#16] = VIN 16 = “2” | 0x32 |
#Byte20 | dataRecord[data#17] = VIN 17 = “6” | 0x36 |
3.1.2 肯定响应报文
字节序 | 参数 | 字节值 |
---|---|---|
#Byte1 | WriteDataByIdentifier SID + 0x40 | 0x6E |
#Byte2 | dataIdentifier[byte#1] | 0xF1 |
#Byte3 | dataIdentifier[byte#2] | 0x90 |