3. UDS诊断协议简介:ISO 14229标准、诊断会话控制、服务标识符(SID)分类
统一诊断服务(Unified Diagnostic Services, UDS)是汽车电子领域最核心的应用层协议,定义于 ISO 14229 系列标准。在 S32K3 低功耗模式与 DMA 传输调试场景中,UDS 负责承载诊断请求与响应,控制 ECU 在低功耗与全功能模式间的切换。本节从标准框架、会话控制机制和服务标识符分类三个维度展开。
3.1 ISO 14229 标准体系与分层模型
ISO 14229 基于 OSI 七层模型,定义了诊断服务在应用层的统一格式。其核心分层如下:
| OSI 层 | 协议/规范 | 在 S32K3 中的实现 |
|---|---|---|
| 应用层 (L7) | ISO 14229-1 (UDS) | 诊断服务请求/响应处理,会话状态机 |
| 表示层 (L6) | ISO 14229-2 (会话层) | 定时参数、P2 超时、S3 保活 |
| 传输层 (L4) | ISO 15765-2 (DoIP) / ISO 13400 | CAN 帧分段重组、DMA 传输缓冲管理 |
| 数据链路层 (L2) | ISO 11898 (CAN) / 以太网 | FlexCAN 控制器、DMA 描述符链 |
关键点:UDS 应用层不关心底层物理介质。在 S32K3 低功耗调试场景中,DMA 负责将 CAN 报文从 FlexCAN 接收缓冲区直接搬运到 UDS 协议栈的 PDU 接收队列,避免 CPU 在低功耗唤醒初期频繁中断。
ISO 14229-1 规定了 26 种标准诊断服务,每个服务由唯一的服务标识符(SID)标识。诊断请求格式为:[SID] + [子功能] + [数据参数],响应格式为:[SID + 0x40] + [数据]。
提示:在初始化阶段,UDS 协议栈必须在上电后 50ms 内完成会话层初始化,否则 Tester 可能因 P2 超时而误判 ECU 无响应。DMA 传输配置必须在会话初始化之前完成,以确保诊断报文不丢失。
3.2 诊断会话控制 (DiagnosticSessionControl, 0x10)
诊断会话控制服务(SID = 0x10)是 UDS 协议中最基础的服务,用于切换 ECU 的诊断会话状态。不同会话模式决定了 ECU 可用的服务集合、定时参数和功耗行为。
标准定义的三种默认会话模式:
- 默认会话 (Default Session, 0x01):上电后的初始状态,仅允许有限的安全服务(如 0x27 安全访问、0x3E 保活)。功耗最低,适合 S32K3 的 STOP 或 VLPS 模式。
- 编程会话 (Programming Session, 0x02):允许 0x34/0x36 等内存写入服务,通常需要高时钟频率,禁止进入低功耗模式。
- 扩展诊断会话 (Extended Diagnostic Session, 0x03):允许 0x2F 输入输出控制、0x31 例程控制等调试服务。S32K3 在此会话下可保持 RUN 模式,但允许 DMA 后台传输。
会话切换流程如下:
- Tester 发送
0x10 + subFunction请求。 - ECU 验证当前会话是否允许切换(如从编程会话不能直接切到默认会话,需先复位)。
- ECU 返回
0x50 + subFunction + [P2_max] + [P2_star_max]。 - ECU 内部状态机迁移到目标会话,更新定时参数和可用服务表。
调试陷阱:在 S32K3 低功耗初始化阶段,如果 DMA 正在传输诊断请求报文,而此时 UDS 会话层因 P3 超时(S3 保活丢失)自动切回默认会话,会导致 DMA 传输的目标缓冲区被会话层重置,产生数据损坏。建议在 DMA 传输完成中断中检查当前会话状态。
会话超时参数(P2 和 P3)直接影响低功耗策略:
| 参数 | 默认值 | 说明 | 低功耗影响 |
|---|---|---|---|
| P2_Server_max | 50 ms | ECU 响应最大等待时间 | 唤醒后必须在 50ms 内完成 DMA 传输并生成响应 |
| P2*_Server_max | 2000 ms | 扩展响应等待时间(用于 NRC 0x78) | 允许 ECU 在低功耗模式下延迟响应,但需保持 DMA 通道活跃 |
| S3_Server_timeout | 5000 ms | 保活超时,超时后自动切回默认会话 | 低功耗唤醒后需在 5s 内收到 0x3E 或新请求,否则会话关闭 |
设计建议:在 S32K3 的 VLPS 模式下,建议将 S3 超时值通过 0x10 响应中的 P2* 字段扩展至 10s,以容忍更长的唤醒延迟。同时,DMA 传输完成中断应触发一个轻量级定时器,用于在会话超时前发送保活响应。
3.3 服务标识符 (SID) 分类与功能组
ISO 14229-1 将诊断服务按功能分为六大类。在低功耗调试场景中,不同类别的服务对 DMA 传输和功耗模式有不同约束。
下表列出核心 SID 分类及其与低功耗/DMA 的关联:
| 功能组 | SID 范围 | 典型服务 | 低功耗/DMA 约束 |
|---|---|---|---|
| 诊断与通信管理 | 0x10 - 0x3E | 0x10 会话控制、0x3E 保活 | 必须始终响应,DMA 优先级最高 |
| 数据传输 | 0x22 - 0x2E | 0x22 读取数据、0x2E 写入数据 | DMA 适合批量 DID 读取,低功耗下需缓存 |
| 存储数据传输 | 0x34 - 0x3D | 0x34 请求下载、0x36 传输数据 | 禁止低功耗模式,DMA 用于 Flash 编程 |
| 输入输出控制 | 0x2F | 0x2F 输入输出控制 | 调试阶段常用,DMA 可同步采样 |
| 例程 | 0x31 | 0x31 例程控制 | 低功耗唤醒后执行,DMA 传输结果 |
| 上传/下载 | 0x34 - 0x37 | 0x35 请求上传 | 需切换到编程会话,禁止低功耗 |
SID 请求与响应的基本格式:
// 请求格式 (Tester → ECU)
// [SID] [SubFunction/Data]
0x22 0xF1 0x90 // 读取 DID 0xF190
// 正响应格式 (ECU → Tester)
// [SID + 0x40] [Data]
0x62 0xF1 0x90 0x01 0x02 0x03 0x04
// 负响应格式 (ECU → Tester)
// 0x7F [SID] [NRC]
0x7F 0x22 0x11 // 服务不支持 (NRC 0x11)
调试技巧:在 S32K3 低功耗初始化阶段,建议使用 0x22 服务读取 DID 0xF1C0(ECU 唤醒原因寄存器),通过 DMA 批量传输获取唤醒源(如 CAN 唤醒、定时器唤醒、外部中断),避免 CPU 逐个轮询。
3.4 UDS 诊断协议与 S32K3 低功耗模式的交互流程
下图展示了 UDS 会话状态机与 S32K3 电源模式之间的映射关系,以及 DMA 在其中的角色:
核心结论:UDS 会话状态机与 S32K3 电源模式之间存在强耦合。默认会话对应最低功耗模式(VLPS),扩展会话允许 SLEEP 模式但禁止深度睡眠,编程会话必须保持 RUN 模式。DMA 传输在所有会话中均可工作,但传输完成后触发的回调函数必须检查当前会话状态,避免在会话切换过程中操作已释放的缓冲区。
3.5 本章小结
- ISO 14229 定义了 UDS 应用层协议,S32K3 通过 FlexCAN + DMA 实现低功耗下的诊断报文接收。
- 诊断会话控制(0x10)是功耗管理的核心入口,三种会话模式对应不同的电源策略和 DMA 传输模式。
- SID 分为六大功能组,其中诊断与通信管理类服务(0x10、0x3E)必须在所有功耗模式下保持响应。
- 在低功耗初始化阶段,DMA 传输必须在 UDS 会话层初始化之前配置完成,以避免唤醒后的 P2 超时。