诊断服务实战:0x10、0x22、0x2E、0x19

好,咱们直接进入正题。今天聊的这四个服务,是LIN总线诊断里最常用的。说白了,你只要会调这几个,车上80%的诊断问题都能搞定。

我个人习惯,每次拿到一个新节点,第一件事就是发0x10切到扩展会话。为什么?因为很多高级功能,比如写数据、读故障码,都得在这个会话模式下才能用。你想想看,要是连会话都没切进去,后面全是白搭。

0x10 — 诊断会话控制

这个服务的作用,就是让ECU进入不同的“工作模式”。LIN里主要有三种:

  • 默认会话(Default Session):上电后的初始状态,只能做最基本的读取。
  • 扩展会话(Extended Session):允许读写数据、执行例程。
  • 编程会话(Programming Session):用于刷写固件。

我建议你记住这个规律:默认会话是“只读”的,扩展会话是“读写”的,编程会话是“刷机”的。

请求格式:

0x10 + 会话类型(0x01=默认,0x02=扩展,0x03=编程)

响应格式:

0x50 + 会话类型 + 附加信息(可选)

举个例子,我想让一个LIN从节点进入扩展会话:

发送:10 02
响应:50 02

嗯,这里要注意。如果ECU不支持你请求的会话,它会回复一个否定响应码(NRC),最常见的是0x12(不支持该子功能)。我在项目中遇到过,有个供应商的节点居然不支持扩展会话,搞得我排查了半天。

避坑指南:我曾经在量产车上发现,有些ECU在扩展会话下如果超过5秒没有收到任何诊断请求,会自动跳回默认会话。所以,如果你要连续读写数据,记得保持会话活跃。

0x22 — 读取数据

这个服务用来读取ECU内部的数据,比如电压、温度、版本号等。每个数据都有一个唯一的ID,叫做DID(Data Identifier)。

我个人习惯,把常用的DID记在小本本上。比如:

DID(十六进制) 含义 数据长度
0xF190 ECU硬件版本号 4字节
0xF191 ECU软件版本号 4字节
0x0100 系统供电电压 2字节

请求格式很简单:

22 + DID(2字节)

比如读取供电电压:

发送:22 01 00
响应:62 01 00 0C 1C  // 0C 1C 转换成十进制就是 3100mV,即3.1V

你可能会问,为什么是0C 1C?因为LIN总线里数据通常是大端模式,高位在前。0C 1C = 0x0C1C = 3100。

小技巧:如果你不确定DID的数据长度,可以先发一个0x22试试。如果ECU回复了NRC 0x13(报文长度错误),那说明你猜错了。我曾经用这个笨办法,反向推导出好几个没文档的DID。

0x2E — 写入数据

有读就有写。0x2E用来修改ECU内部的数据,比如配置参数、校准值等。

请求格式:

2E + DID(2字节) + 数据

比如我想把某个节点的“唤醒时间”改成100ms:

发送:2E 01 10 00 64
响应:6E 01 10

这里DID是0x0110,数据是0x0064(即100)。

注意:写操作通常只能在扩展会话下进行。而且,有些数据是“一次写入,永久生效”的,比如VIN码。我曾经手滑写错过一次,后来只能返厂重刷。所以,写之前一定要三思。

另外,0x2E的响应里,ECU会原样返回你写的DID,但不会返回数据。这是协议规定的,别觉得奇怪。

0x19 — 读取故障码

这个服务,说白了就是“查故障”。车上哪个节点报了错,用这个一查就知道。

0x19有很多子功能,最常用的是:

  • 0x01:读取当前故障码数量
  • 0x02:读取所有故障码
  • 0x0A:读取最近发生的故障码

我个人习惯,先发0x19 0x01看看有几个故障,再发0x19 0x02把详情拉出来。

举个例子:

发送:19 01
响应:59 01 03  // 表示有3个故障码

发送:19 02
响应:59 02 01 02 03  // 故障码列表:0x01, 0x02, 0x03

每个故障码通常对应一个具体的错误,比如:

故障码 含义
0x01 供电电压过低
0x02 LIN总线通信超时
0x03 传感器信号异常

实战经验:我记得有一次,客户反馈车窗升降偶尔失灵。我连上诊断仪,发0x19 0x02一看,故障码0x02出现了好几次。再查一下时间戳,发现都是在雨天发生的。最后定位到是LIN总线插头进水导致通信中断。你看,故障码不会骗人。

好了,这四个服务讲完了。总结一下:

  • 0x10:先切会话,才能干活。
  • 0x22:读数据,查状态。
  • 0x2E:写数据,改配置。
  • 0x19:读故障码,找问题。

下一章,我会讲怎么用这些服务组合起来,做一个完整的诊断流程。到时候咱们再聊。

公众号:蓝海资料掘金营,微信deep3321