4、诊断会话控制(0x10):默认会话、编程会话、扩展会话的切换与特性

各位同学,咱们今天聊聊诊断会话控制。这个服务,服务ID是0x10,说白了就是ECU的“工作模式切换器”。

你想想看,ECU就像一台多功能机器。平时正常跑着,是一种状态;需要刷写软件,得换一种状态;做标定或者解锁一些高级功能,又得换一种状态。0x10服务就是干这个的。

4.1 三种核心会话模式

UDS协议里定义了三种最基础的会话模式。我这些年做项目,几乎天天跟它们打交道。

会话模式 子功能ID 典型用途
默认会话 (Default Session) 0x01 ECU上电后的默认状态,日常诊断
编程会话 (Programming Session) 0x02 刷写软件、Bootloader相关操作
扩展会话 (Extended Session) 0x03 解锁高级功能,比如标定、特殊测试

4.2 默认会话:ECU的“待机状态”

ECU一上电,默认就处在默认会话。这是最基础、最安全的模式。

特性:

  • 只允许执行最基本的诊断服务,比如读取故障码(0x19)、读取数据(0x22)。
  • 像刷写、解锁这类“危险操作”,默认会话下是禁止的。
  • ECU会持续监控总线,但响应速度相对保守。

我个人习惯,在项目调试初期,先用默认会话把基础通信打通。确认ECU能正常响应0x10服务,再考虑切换。

小技巧: 如果你发送0x10 01(切换到默认会话),ECU会回复一个肯定响应。但注意,如果它已经在默认会话了,再发一次,它也会回复成功。这不算错误。

4.3 编程会话:刷写软件的“安全模式”

这个模式,说白了就是给ECU“动手术”用的。刷写Bootloader或者应用程序,必须先进编程会话。

特性:

  • 会关闭ECU的大部分正常功能,比如控制电机、发送CAN报文。
  • 通信速率通常会提高,比如从500kbps切换到1Mbps,或者使用更快的波特率。
  • 只有编程会话下,才能执行0x34(请求下载)、0x36(传输数据)这些刷写服务。
警告: 我曾经遇到过一个问题:在编程会话下,ECU的看门狗(Watchdog)如果不被正确“喂狗”,ECU会复位。所以,刷写流程里一定要有周期性的0x3E(Tester Present)服务,保持会话活跃。

嗯,这里要注意。从默认会话切换到编程会话,通常需要先通过安全访问(0x27服务)的验证。否则,ECU会直接拒绝你的切换请求,回复一个否定响应(NRC 0x33,安全访问拒绝)。

4.4 扩展会话:工程师的“调试工具箱”

扩展会话,我个人觉得是开发阶段最常用的模式。它不像编程会话那么“激进”,但比默认会话开放得多。

特性:

  • 允许执行标定、读写特定内存、执行例程控制(0x31)等高级服务。
  • ECU的正常功能通常不会完全关闭,但可能会进入一种“可配置”状态。
  • 很多OEM会在这个会话下,开放一些特殊的诊断功能,比如读取内部变量、强制输出等。

我记得有一次,客户反映车辆在高速行驶时偶发抖动。我们就是在扩展会话下,通过0x22服务读取了发动机的实时点火角数据,才定位到问题。默认会话下,这些数据是读不到的。

4.5 会话切换的“潜规则”

切换会话,不是你想切就能切的。有几个关键点,我踩过坑,你们得记住。

  1. 非默认会话有超时机制: 进入编程或扩展会话后,ECU会启动一个内部定时器(通常是5秒)。如果在这个时间内,没有收到任何诊断请求(包括0x3E),ECU会自动切回默认会话。这是为了防止ECU“卡”在非安全模式。
  2. 切换会重置安全状态: 如果你在扩展会话下通过了安全访问(0x27),然后切到编程会话,安全访问状态会被清除。你需要重新做安全访问。这个设计是为了安全,防止恶意操作。
  3. 否定响应码(NRC): 如果切换失败,ECU会回复一个否定响应。常见的NRC有:
    • 0x12:子功能不支持(比如你发了个0x04,协议里没定义)。
    • 0x22:条件不满足(比如没做安全访问就想切编程会话)。
    • 0x78:请求正确,但ECU正在忙,稍后再试。

4.6 实战:一个完整的会话切换流程

咱们来看一个典型的刷写流程,你就明白会话切换怎么用了。

// 步骤1:诊断仪发送 0x10 02,请求切换到编程会话
// 请求:02 10 02 00 00 00 00 00
// 响应:02 50 02 00 00 00 00 00 (肯定响应,表示成功)

// 步骤2:诊断仪发送 0x27 01,请求种子
// 请求:02 27 01 00 00 00 00 00
// 响应:03 67 01 AA BB 00 00 00 (种子是 AA BB)

// 步骤3:诊断仪计算密钥,发送 0x27 02
// 请求:04 27 02 CC DD 00 00 00 (密钥是 CC DD)
// 响应:02 67 02 00 00 00 00 00 (安全访问通过)

// 步骤4:现在可以执行刷写操作了,比如 0x34 请求下载
// ... 刷写完成后

// 步骤5:诊断仪发送 0x10 01,切回默认会话
// 请求:02 10 01 00 00 00 00 00
// 响应:02 50 01 00 00 00 00 00
核心要点: 会话切换是UDS诊断的“门禁系统”。你只有进入正确的会话,才能执行对应的服务。否则,ECU会毫不留情地拒绝你。

好了,关于诊断会话控制,今天就聊这么多。记住这三种会话的特性,以及切换时的注意事项。下一节,我们会聊聊安全访问(0x27),那个更刺激。