如何看懂UDS诊断报文

UDS介绍

UDS(Unified Diagnostic Services,统一的诊断服务)诊断协议是ISO 15765 和ISO 14229 定义的一种汽车通用诊断协议,位于OSI模型中的应用层,它可在不同的汽车总线(例如CAN, LIN, Flexray, Ethernet 和 K-line)上实现。UDS协议的应用层定义是ISO 14229-1,目前大部分汽车厂商均采用UDS on CAN的诊断协议。

UDS本质上是一系列的服务,共包含6大类26种。每种服务都有自己独立的ID,即SID。

  • SID:Service Identifier,诊断服务ID。UDS本质上是一种定向的通信,是一种交互协议(Request/Response),即诊断方给ECU发送指定的请求数据(Request),这条数据中需要包含SID。
  • 如果是肯定的响应(Positive Response),回复[SID+0x40],如请求10,响应50;请求22,响应62。
  • 如果是否定的响应(Negative Response),回复7F+SID+NRC,回复的是一个声明。

肯定响应和否定响应的形式一定要熟记。

常用服务介绍

UDS的26种服务中,有7种很重要。它们分别是:

  • $10 Diagnostic Session Control(诊断会话),
  • $14 Clear Diagnostic Information(清除诊断信息),
  • $19 Read DTC Information,
  • $22 Read Data By Identifier(通过ID读数据),
  • $27 Security Access(安全访问),
  • $2E Write Data By Identifier(通过ID写数据),
  • $3E Tester Present(待机握手)。

 

下面对这7个服务进行解读。

$10诊断会话

$10包含3个子功能,

  • 01 Default,
  • 02 Programming,
  • 03 Extended,

ECU上电时,进入的是默认会话(Default)。如果您进入了一个非默认会话的状态,一个定时器会运转,如果一段时间内没有请求,那么到时间后,诊断退回到默认会话01。当然,我们有一个$3E的服务,可以使诊断保持在非默认的状态。

报文包含4种类型,即

  • SID,
  • SID+SF(Sub-function),
  • SID+DID(Data Identifier)(读写用),
  • SID+SF+DID。

NRC:Negative Response Code(否定响应码)。如果ECU拒绝了一个请求,它会回应一个NRC。不同的NRC有不同的含义。

 

NRC.jpg

 

例子:以CAN总线网络举例。

八个数据字节,第一字节被网络层占用

  • 请求(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同上,10+40表示对SID的肯定回复,02是子功能。

  • 否定响应:

03 7F 10 22 xx xx xx xx;

03同上,7F表示否定响应,10是SID,22是NRC。

$3E待机握手

$3E服务用于向服务器指示诊断仪仍然连接在网络上,之前已经激活的诊断服务功能可以仍然保持激活状态。

例子:

02 3E 80 00 00 00 00 00,发送一个3E服务的报文,保持非默认会话状态。80表示无需回复。

$27安全访问

27服务,加上一个子服务,再加上一个钥匙,这样的服务请求可以进行解锁。

比如下面的例子,2n-1是某个子服务,通过首轮种子的请求,首轮ECU会返回67+01+AA+BB+CC+DD,AA~DD就是种子了。之后第二轮,诊断端会利用种子进行运算(利用整车厂的算法),生成k1(不一定是1个字节),那么发送请求,27+02+[k1]。ECU同样也会通过种子算出k2。当k1和k2匹配时,解锁(Unlocked)成功。

  • 例子:

Rx: 02 27 05 00 00 00 00 00 安全访问,05子功能
Tx: 07 67 05 08 27 11 F0 77 肯定响应,回复了对应安全级别的种子
Rx: 06 27 06 FF FF FF FF 00 发送密钥,4个FF。注意06是与05成对使用的。
Tx: 03 7F 27 78 00 00 00 00 否定响应,7F+27+NRC
Tx: 02 67 06 00 00 00 00 00 肯定响应,通过安全校验

$22读数据

$22读数据,
Request(请求):

22+DID(Data Identifier,通常是两个字节)

Response(响应):

62+DID+Data

DID有一部分已经被ISO 14229-1规定了。比如0xF186就是当前诊断会话数据标识符,0xF187就是车厂备件号数据标识符,0xF188就是车厂ECU软件号码数据ID,0xF189就是车厂ECU软件版本号数据标识符。

$2E写数据

$22写数据,
Request(请求):

2E+DID+Data

Response(响应):

6E+DID

注意,比如0xF186这个DID不支持直接写入数据,需要用$10来进行会话转换。也就是说,对于写数据的请求,一般来说需要在一个非默认会话,或解锁的状态下才能进行

$19 读DTC

DTC(diagnostic trouble code):如果系统检测到了一个错误,它将其存储为DTC。DTC可表现为:一个显而易见的故障:通讯信号的丢失(不会使故障灯亮起);排放相关的故障;安全相关的错误等。DTC可以揭示错误的位置和错误类型。通常DTC占用3个字节,OBD II占用两个字节。

故障码包括四个大类,分别是PCBU,P是powertrain动力系统,C是Chassis底盘,B是Body车身,U是network通信系统。一个DTC信息占用4个字节。最后一个字节是DTC的状态。前两个字节是我们熟知的类似P0047的故障码。

DTCHighByteDTCMiddleByteDTCLowByteDTCStatus
Byte 1Byte 2Byte 3Byte 4

$19 拥有28个子服务(Sub-Function)。常用的子服务有02(通过DTC状态掩码读取DTC),04(读取快照信息),06(读取扩展信息),0A(读ECU支持的所有DTC数据)。

$14清除DTC

清除(复位)DTC格式,它可以改变DTC的状态。3个FF代表清除所有DTC。

Request:14+FF+FF+FF;
Response:54 。

诊断报文解析

UDS 的诊断数据的发送与接收都是基于CAN,所以每个数据流都包含基本的CAN Message 的架构

CAN Message =CAN ID + CAN DATA

根据上篇UDS文章的叙述,每一个PDU 包含控制信息PCI,数据信息Data.

 

N_PDU format.png

网络层 PDU(协议数据单元)PCI(协议控制信息)格式:具体如下图所示:

帧类型bit7-4bit3-0Byte 2Byte 3
单帧PCItype=0SF_DLN/AN/A
首帧PCItype=1FF_DLFF_DLN/A
连续帧PCItype=2SNN/AN/A
流控帧PCItype=3FSBSST_min

 

PCI_format.png

综上所述,N_PDU =N_PCI+N_DATA, N_PCI的值主要集中的前三个字节N_DATA值主要集中在后面7位字节。其中,

  • SF_DL 代表单帧中数据字节数(取值0-7),
  • FF_DL代表 连续帧中的数据字节数(12bit可表四8~4095),
  • SN代表此帧为连续帧中的第几帧,(0、1、2...E、F、0、1...)
  • FS流控制帧,有三种状态:继续发送0、保持等待1、数据溢出2
  • BS规定发送端允许持续传输连续帧数目的最大值(0~255),
  • STmin限定连续帧相互之间所允许的最小时间间隔。

先面用连个例子进行说明,请参考!

例子 1--- 单帧的数据传输与接收

[图片上传失败...(image-b66bab-1538824826939)]

数据发送: 02 27 09
数据反馈: 03 7F 27 7E ---==否定的响应==(Negative Response),回复==7F+SID+NRC==,回复的是一个声明

数据发送: 02 10 40
数据反馈: 06 50 40 00 32 01 F4 ---==肯定的响应==(Positive Response),回复[==SID+0x40==],就是请求10,响应40;回复的是一组数据

由于这个数据发送与接收都是单帧传输,所以第一个数据的高四位均为0,四个数据流中的第一个字节的低四位,02,03,02,06代表的为此帧数据含有几个字节,多余的数据位都用 00或者AA行填充。

例子2 --- 多帧的数据接收与传输

[图片上传失败...(image-b5e84b-1538824826939)]

数据发送:

  • 06 19 04 00 01 00 00 00

数据反馈:

  • 10 1E 59 04 00 01 00 27
  • 30 00 00 00 00 00 00 00
  • 21 00 0B FF FF FF FF FF
  • 22 FF FF FF FF FF FF FF
  • 23 FF FF FF FF FF FF FF
  • 24 FF FF FF AA AA AA AA

数据发送为单帧,所以06代表发送的数据中含有6个字节,

回复为Positive Response,为连续帧。

  • 10中的1代表连续帧的首帧,==01E代表此连续帧含有30个字节==,
  • 30代表此连续帧的流控制帧,
  • 21,22,23,24代表连续帧中的第几帧,21代表第一帧,22代表第二帧,依此类推,其中AA为填充位。

参考资料:



作者:智车科技
链接:https://www.jianshu.com/p/b5805e734ed6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

RH850 R7F701690是一款高性能的汽车电子控制器芯片,它的引脚配置如下: 1. VSSA - 地 2. VDDA - 模拟电源 3. AVREF - 模拟参考电压 4. ADC0_0 - 模拟输入 5. ADC0_1 - 模拟输入 6. ADC0_2 - 模拟输入 7. ADC0_3 - 模拟输入 8. ADC0_4 - 模拟输入 9. ADC0_5 - 模拟输入 10. ADC0_6 - 模拟输入 11. ADC0_7 - 模拟输入 12. ADC0_8 - 模拟输入 13. ADC0_9 - 模拟输入 14. ADC0_10 - 模拟输入 15. ADC0_11 - 模拟输入 16. ADC0_12 - 模拟输入 17. ADC0_13 - 模拟输入 18. ADC0_14 - 模拟输入 19. ADC0_15 - 模拟输入 20. ANI0 - 模拟输入 21. ANI1 - 模拟输入 22. ANI2 - 模拟输入 23. ANI3 - 模拟输入 24. ANI4 - 模拟输入 25. ANI5 - 模拟输入 26. ANI6 - 模拟输入 27. ANI7 - 模拟输入 28. ANI8 - 模拟输入 29. ANI9 - 模拟输入 30. ANI10 - 模拟输入 31. ANI11 - 模拟输入 32. ANI12 - 模拟输入 33. ANI13 - 模拟输入 34. ANI14 - 模拟输入 35. ANI15 - 模拟输入 36. VSSD - 数字电源地 37. VDDD - 数字电源 38. CAN0_RX - CAN0接收引脚 39. CAN0_TX - CAN0发送引脚 40. CAN1_RX - CAN1接收引脚 41. CAN1_TX - CAN1发送引脚 42. SDA0 - I2C总线数据线 43. SCL0 - I2C总线时钟线 44. SDA1 - I2C总线数据线 45. SCL1 - I2C总线时钟线 46. IIC0_SCL - I2C总线时钟线 47. IIC0_SDA - I2C总线数据线 48. IIC1_SCL - I2C总线时钟线 49. IIC1_SDA - I2C总线数据线 50. SPI0_MISO - SPI0主设备输入引脚 51. SPI0_MOSI - SPI0主设备输出引脚 52. SPI0_CLK - SPI0时钟引脚 53. SPI0_CS0 - SPI0从设备0片选引脚 54. SPI0_CS1 - SPI0从设备1片选引脚 55. SPI0_CS2 - SPI0从设备2片选引脚 56. SPI0_CS3 - SPI0从设备3片选引脚 57. SPI1_MISO - SPI1主设备输入引脚 58. SPI1_MOSI - SPI1主设备输出引脚 59. SPI1_CLK - SPI1时钟引脚 60. SPI1_CS0 - SPI1从设备0片选引脚 61. SPI1_CS1 - SPI1从设备1片选引脚 62. SPI1_CS2 - SPI1从设备2片选引脚 63. SPI1_CS3 - SPI1从设备3片选引脚 64. UART0_RXD - UART0接收引脚 65. UART0_TXD - UART0发送引脚 66. UART0_CTS - UART0清除发送引脚 67. UART0_RTS - UART0请求发送引脚 68. UART1_RXD - UART1接收引脚 69. UART1_TXD - UART1发送引脚 70. UART1_CTS - UART1清除发送引脚 71. UART1_RTS - UART1请求发送引脚 72. TIOCA0_IN - 外部计数器输入引脚 73. TIOCB0_IN - 外部计数器输入引脚 74. TIOCA1_IN - 外部计数器输入引脚 75. TIOCB1_IN - 外部计数器输入引脚 76. TIOCA2_IN - 外部计数器输入引脚 77. TIOCB2_IN - 外部计数器输入引脚 78. TIOCA3_IN - 外部计数器输入引脚 79. TIOCB3_IN - 外部计数器输入引脚 80. TIOCA4_IN - 外部计数器输入引脚 81. TIOCB4_IN - 外部计数器输入引脚 82. TIOCA5_IN - 外部计数器输入引脚 83. TIOCB5_IN - 外部计数器输入引脚 84. TIOCA6_IN - 外部计数器输入引脚 85. TIOCB6_IN - 外部计数器输入引脚 86. TIOCA7_IN - 外部计数器输入引脚 87. TIOCB7_IN - 外部计数器输入引脚 88. TIOCA8_IN - 外部计数器输入引脚 89. TIOCB8_IN - 外部计数器输入引脚 90. TIOCA9_IN - 外部计数器输入引脚 91. TIOCB9_IN - 外部计数器输入引脚 92. TIOCA10_IN - 外部计数器输入引脚 93. TIOCB10_IN - 外部计数器输入引脚 94. TIOCA11_IN - 外部计数器输入引脚 95. TIOCB11_IN - 外部计数器输入引脚 96. TIOCA12_IN - 外部计数器输入引脚 97. TIOCB12_IN - 外部计数器输入引脚 98. TIOCA13_IN - 外部计数器输入引脚 99. TIOCB13_IN - 外部计数器输入引脚 100. TIOCA14_IN - 外部计数器输入引脚 101. TIOCB14_IN - 外部计数器输入引脚 102. TIOCA15_IN - 外部计数器输入引脚 103. TIOCB15_IN - 外部计数器输入引脚 104. TIOCA16_IN - 外部计数器输入引脚 105. TIOCB16_IN - 外部计数器输入引脚 106. TIOCA17_IN - 外部计数器输入引脚 107. TIOCB17_IN - 外部计数器输入引脚 108. TIOCA18_IN - 外部计数器输入引脚 109. TIOCB18_IN - 外部计数器输入引脚 110. TIOCA19_IN - 外部计数器输入引脚 111. TIOCB19_IN - 外部计数器输入引脚 112. TIOCA20_IN - 外部计数器输入引脚 113. TIOCB20_IN - 外部计数器输入引脚 114. TIOCA21_IN - 外部计数器输入引脚 115. TIOCB21_IN - 外部计数器输入引脚 116. TIOCA22_IN - 外部计数器输入引脚 117. TIOCB22_IN - 外部计数器输入引脚 118. TIOCA23_IN - 外部计数器输入引脚 119. TIOCB23_IN - 外部计数器输入引脚 120. TIOCA24_IN - 外部计数器输入引脚 121. TIOCB24_IN - 外部计数器输入引脚 122. TIOCA25_IN - 外部计数器输入引脚 123. TIOCB25_IN - 外部计数器输入引脚 124. TIOCA26_IN - 外部计数器输入引脚 125. TIOCB26_IN - 外部计数器输入引脚 126. TIOCA27_IN - 外部计数器输入引脚 127. TIOCB27_IN - 外部计数器输入引脚 128. TIOCA28_IN - 外部计数器输入引脚 129. TIOCB28_IN - 外部计数器输入引脚 130. TIOCA29_IN - 外部计数器输入引脚 131. TIOCB29_IN - 外部计数器输入引脚 132. TIOCA30_IN - 外部计数器输入引脚 133. TIOCB30_IN - 外部计数器输入引脚 134. TIOCA31_IN - 外部计数器输入引脚 135. TIOCB31_IN - 外部计数器输入引脚 以上是RH850 R7F701690的引脚配置,具体使用时需根据具体应用场景进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值