【ISO14229_UDS_0x3D服务详解】

1、0x3D服务(WriteMemoryByAddress,按地址写内存服务)

  Service description:
  0x3D服务(WriteMemoryByAddress,按地址写内存服务)允许客户端在一个或者多个连续的内存位置将信息写入服务端。
  WritemMemorybyAddress服务请求消息将由参数dataRecord[]指定的信息写入到由参数memoryAddress和memorySize指定的内存位置的服务端中。memoryAddress和memorySize参数使用的字节数由addressAndLengthFormatIdentifier (高位和低位)定义。也可以使用固定的addressAndLengthFormatIdentifier,并且memoryAddress或memorySize参数中未使用的字节在高位会填充0x00。
  数据记录的格式和定义由车辆制造厂商指定,可以是保密的也可以不是。车辆制造厂商应该保证当执行此服务时服务端的条件被满足,该服务的可能用法如下:
  — 清楚非易性存储内存;
  — 改变标定值;

2、请求报文格式

2.1 请求报文定义

  下表定义了请求报文的格式:

字节序号参数值约定字节值
#1WriteMemoryByAddress Request SIDM0x3D
#2addressAndLengthFormatIdentifierM0x00 - 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 肯定应答报文格式定义

字节序号参数值约定字节值
#1WriteMemoryByAddress Response SIDM0x7D
#2addressAndLengthFormatIdentifierM0x00 – 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描述
0x13incorrectMessageLengthOrInvalidFormat
请求报文长度不正确时,会发送该NRC
0x22conditionsNotCorrect
服务端的运行条件不满足去执行请求动作时,会发送该NRC
0x31requestOutOfRange
如下情况会发送该NRC:
— 任何内存地址在[0xMA, (0xMA + 0xMS -0x1)]间无效时;
— 任何内存地址在[0xMA, (0xMA + 0xMS -0x1)]间被限制时;
— 在请求报文中的memorySize参数值不被支持时;
— 指定的addressAndLengthFormatIdentifier无效时;
— 请求报文中的memorySize参数值为0时;
0x33securityAccessDenied
任何内存地址在[0xMA, (0xMA + 0xMS -0x1)]间是保密的并且服务端处于未解锁状态,会发送该NRC
0x72generalProgrammingFailure
当服务端写入的内存地址报错时,会发送该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字节值
#1WriteMemoryByAddress Request SID0x3D
#2addressAndLengthFormatIdentifier0x12
#3
#4
memoryAddress [ byte#1 ] (MSB)
memoryAddress [ byte#2 ] (LSB)
0x20
0x48
#5memorySize [ byte#1 ]0x02
#6
#7
dataRecord [ data#1 ]
dataRecord [ data#2 ]
0x00
0x8C

  案例1 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:

字节顺序Description字节值
#1WriteMemoryByAddress Response SID0x7D
#2addressAndLengthFormatIdentifier0x12
#3
#4
memoryAddress [ byte#1 ] (MSB)
memoryAddress [ byte#2 ] (LSB)
0x20
0x48
#5memorySize [ byte#1 ]0x02

  Example #2: WriteMemoryByAddress, 3-byte (24-bit) addressing
  案例2 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的请求报文使用如下,由客户端发向服务端(ECU):

字节顺序Description字节值
#1WriteMemoryByAddress Request SID0x3D
#2addressAndLengthFormatIdentifier0x13
#3
#4
#5
memoryAddress [ byte#1 ]
memoryAddress [ byte#2 ]
memoryAddress [ byte#3 ]
0x20
0x48
0x13
#6memorySize [ byte#1 ]0x03
#7
#8
#9
dataRecord [ data#1 ]
dataRecord [ data#2 ]
dataRecord [ data#3 ]
0x00
0x01
0x8C

  案例2 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:

字节顺序Description字节值
#1WriteMemoryByAddress Response SID0x7D
#2addressAndLengthFormatIdentifier0x13
#3
#4
#5
memoryAddress [ byte#1 ]
memoryAddress [ byte#2 ]
memoryAddress [ byte#3 ]
0x20
0x48
0x13
#5memorySize [ byte#1 ]0x03

  Example #3: WriteMemoryByAddress, 4-byte (32-bit) addressing
  案例3 0x3D服务(WriteMemoryByAddress,按地址写内存服务)的请求报文使用如下,由客户端发向服务端(ECU):

字节顺序Description字节值
#1WriteMemoryByAddress Request SID0x3D
#2addressAndLengthFormatIdentifier0x14
#3
#4
#5
#6
memoryAddress [ byte#1 ] (MSB)
memoryAddress [ byte#2 ]
memoryAddress [ byte#3 ]
memoryAddress [ byte#3 ] (LSB)
0x20
0x48
0x13
0x09
#7memorySize [ 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字节值
#1WriteMemoryByAddress Response SID0x7D
#2addressAndLengthFormatIdentifier0x14
#3
#4
#5
#6
memoryAddress [ byte#1 ] (MSB)
memoryAddress [ byte#2 ]
memoryAddress [ byte#3 ]
memoryAddress [ byte#3 ] (LSB)
0x20
0x48
0x13
0x09
#7memorySize [ byte#1 ]0x05

返回UDS诊断服务功能单元介绍目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值