目录
1、0x3D服务(WriteMemoryByAddress,按地址写内存服务)
Service description:
0x3D服务(WriteMemoryByAddress,按地址写内存服务)允许客户端在一个或者多个连续的内存位置将信息写入服务端。
WritemMemorybyAddress服务请求消息将由参数dataRecord[]指定的信息写入到由参数memoryAddress和memorySize指定的内存位置的服务端中。memoryAddress和memorySize参数使用的字节数由addressAndLengthFormatIdentifier (高位和低位)定义。也可以使用固定的addressAndLengthFormatIdentifier,并且memoryAddress或memorySize参数中未使用的字节在高位会填充0x00。
数据记录的格式和定义由车辆制造厂商指定,可以是保密的也可以不是。车辆制造厂商应该保证当执行此服务时服务端的条件被满足,该服务的可能用法如下:
— 清楚非易性存储内存;
— 改变标定值;
2、请求报文格式
2.1 请求报文定义
下表定义了请求报文的格式:
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | WriteMemoryByAddress Request SID | M | 0x3D |
#2 | addressAndLengthFormatIdentifier | M | 0x00 - 0xFF |
#3 . . #m+2 | memoryAddress[] = [ byte#1 (MSB) . . byte#m ] | M . . C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
#n-r-2-(k-1) . . #n-r-2 | memorySize[] = [ byte#1 (MSB) . . byte#k] | M . . C2 | 0x00 – 0xFF . . 0x00 – 0xFF |
#n-(r-1) . . #n | dataRecord[] = [ data#1 . . data#2] | M . . U | 0x00 – 0xFF . . 0x00 – 0xFF |
C1:该参数的存在取决于addressAndLengthFormatIdentifier的地址长度信息参数
C2:该参数的存在取决于addressAndLengthFormatIdentifier的内存大小长度信息。
2.2 请求报文中子函数参数定义
该服务未使用子函数参数。
2.3 请求报文中数据参数定义
该服务在请求报文中的数据参数定义如下表所示:
定义 |
---|
addressAndLengthFormatIdentifier 该参数是一个字节值,每个位都单独编码 bit 7 - 4:memorySize参数的长度(字节数); bit 3 - 0:memoryAddress参数的长度(字节数); |
memoryAddress 参数memoryAddress是要写入数据的服务端内存的起始地址。用于此地址的字节数由addressAndLengthFormatIdentifier的低位(位3 - 0)定义。memoryAddress参数中的字节#m始终是服务端中引用的地址中的低位字节。地址的高位字节可用作内存标识符。 使用内存标识符的一个示例是具有16位寻址和内存地址重叠的双处理器服务端(当给定的地址对任一处理器都有效,但产生不同的物理内存设备或使用内部和外部闪存时)。在这种情况下,可以将memoryAddress参数中未使用的字节指定为用于选择所需内存设备的内存标识符。此功能的使用应由车辆制造商/系统供应商定义。 |
memorySize WriteMemoryByAddress请求报文中的参数memorySize指定从服务器内存中memoryAddress指定的地址开始写入的字节数。用于此大小的字节数由addressAndLengthFormatIdentifier的高位(位7 - 4)定义。 |
dataRecord 该参数提供客户端在间隔{0xMA, (0xMA + 0xMS - 0x01)}内实际尝试写入服务器内存地址的数据。 |
3、肯定应答报文
3.1 肯定应答报文格式定义
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | WriteMemoryByAddress Response SID | M | 0x7D |
#2 | addressAndLengthFormatIdentifier | M | 0x00 – 0xFF |
#3 . . #(m-1)+3 | memoryAddress[] = [ byte#1 (MSB) . . byte#m ] | M . . C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
#n-(k-1) . . #n | memorySize[] = [ byte#1 (MSB) . . byte#k ] | M . . C2 | 0x00 – 0xFF . . 0x00 – 0xFF |
C1:该参数的存在取决于addressAndLengthFormatIdentifier的地址长度信息参数
C2:该参数的存在取决于addressAndLengthFormatIdentifier的内存大小长度信息。
3.2 肯定应答报文数据参数定义
Definition |
---|
addressAndLengthFormatIdentifier 请求报文中的addressAndLengthFormatIdentifier。 |
memoryAddress 请求报文中的memoryAddress。 |
memorySize 请求报文中的memorySize。 |
4、支持的否定应答码(NRC_)
本服务实施了如下否定响应代码,下表记录了每个否定应答码发生的情况,如果服务端在错误场景使用了该服务,则应使用如下列出的否定响应码。
NRC | 描述 |
---|---|
0x13 | incorrectMessageLengthOrInvalidFormat 请求报文长度不正确时,会发送该NRC |
0x22 | conditionsNotCorrect 服务端的运行条件不满足去执行请求动作时,会发送该NRC |
0x31 | requestOutOfRange 如下情况会发送该NRC: — 任何内存地址在[0xMA, (0xMA + 0xMS -0x1)]间无效时; — 任何内存地址在[0xMA, (0xMA + 0xMS -0x1)]间被限制时; — 在请求报文中的memorySize参数值不被支持时; — 指定的addressAndLengthFormatIdentifier无效时; — 请求报文中的memorySize参数值为0时; |
0x33 | securityAccessDenied 任何内存地址在[0xMA, (0xMA + 0xMS -0x1)]间是保密的并且服务端处于未解锁状态,会发送该NRC |
0x72 | generalProgrammingFailure 当服务端写入的内存地址报错时,会发送该NRC |
0x3D服务(WriteMemoryByAddress,按地址写内存服务)的否定应答码(NRC)具体处理过程。
5、0x3D服务(WriteMemoryByAddress,按地址写内存服务)案例说明
Assumptions:
如下案例中,运行0x3D服务(WriteMemoryByAddress,按地址写内存服务)的条件都满足。以下案例展示了分别写入2字节,3字节和4字节大小地址格式的数据到服务端内存中。
Example #1: WriteMemoryByAddress, 2-byte (16-bit) addressing
案例1 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | WriteMemoryByAddress Request SID | 0x3D |
#2 | addressAndLengthFormatIdentifier | 0x12 |
#3 #4 | memoryAddress [ byte#1 ] (MSB) memoryAddress [ byte#2 ] (LSB) | 0x20 0x48 |
#5 | memorySize [ byte#1 ] | 0x02 |
#6 #7 | dataRecord [ data#1 ] dataRecord [ data#2 ] | 0x00 0x8C |
案例1 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | WriteMemoryByAddress Response SID | 0x7D |
#2 | addressAndLengthFormatIdentifier | 0x12 |
#3 #4 | memoryAddress [ byte#1 ] (MSB) memoryAddress [ byte#2 ] (LSB) | 0x20 0x48 |
#5 | memorySize [ byte#1 ] | 0x02 |
Example #2: WriteMemoryByAddress, 3-byte (24-bit) addressing
案例2 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | WriteMemoryByAddress Request SID | 0x3D |
#2 | addressAndLengthFormatIdentifier | 0x13 |
#3 #4 #5 | memoryAddress [ byte#1 ] memoryAddress [ byte#2 ] memoryAddress [ byte#3 ] | 0x20 0x48 0x13 |
#6 | memorySize [ byte#1 ] | 0x03 |
#7 #8 #9 | dataRecord [ data#1 ] dataRecord [ data#2 ] dataRecord [ data#3 ] | 0x00 0x01 0x8C |
案例2 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | WriteMemoryByAddress Response SID | 0x7D |
#2 | addressAndLengthFormatIdentifier | 0x13 |
#3 #4 #5 | memoryAddress [ byte#1 ] memoryAddress [ byte#2 ] memoryAddress [ byte#3 ] | 0x20 0x48 0x13 |
#5 | memorySize [ byte#1 ] | 0x03 |
Example #3: WriteMemoryByAddress, 4-byte (32-bit) addressing
案例3 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | WriteMemoryByAddress Request SID | 0x3D |
#2 | addressAndLengthFormatIdentifier | 0x14 |
#3 #4 #5 #6 | memoryAddress [ byte#1 ] (MSB) memoryAddress [ byte#2 ] memoryAddress [ byte#3 ] memoryAddress [ byte#3 ] (LSB) | 0x20 0x48 0x13 0x09 |
#7 | memorySize [ byte#1 ] | 0x05 |
#8 #9 #10 #11 #12 | dataRecord [ data#1 ] dataRecord [ data#2 ] dataRecord [ data#3 ] dataRecord [ data#4 ] dataRecord [ data#5 ] | 0x00 0x01 0x8C 0x09 0xAF |
案例3 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | WriteMemoryByAddress Response SID | 0x7D |
#2 | addressAndLengthFormatIdentifier | 0x14 |
#3 #4 #5 #6 | memoryAddress [ byte#1 ] (MSB) memoryAddress [ byte#2 ] memoryAddress [ byte#3 ] memoryAddress [ byte#3 ] (LSB) | 0x20 0x48 0x13 0x09 |
#7 | memorySize [ byte#1 ] | 0x05 |