4. S32G诊断协议栈

S32G作为面向域控制器的车规级多核SoC,其诊断能力并不是单一模块的功能,而是由AUTOSAR基础软件中的诊断事件管理、诊断通信管理、功能抑制管理,以及底层传输协议共同构成的一条完整链路。理解这条链路,是后续做UDS服务开发、故障码管理、OTA升级和产线诊断的基础。

一、诊断协议栈的整体分层

在S32G上,诊断栈通常分为三层:应用层、服务层和传输层。应用层由SWC或CDD实现具体的诊断服务逻辑,例如读取VIN、写入配置、触发例程;服务层由DCM、DEM、FIM组成,负责UDS服务解析、故障事件存储和功能抑制判断;传输层则由CAN TP或DoIP TP承担,负责把诊断报文可靠地搬运到目标ECU。

DCM(Diagnostic Communication Manager)是诊断通信的核心,它负责接收UDS请求、检查会话与安全等级、分发到对应的服务处理函数,并组织响应。DEM(Diagnostic Event Manager)负责故障事件的监控、去抖、存储和老化,是故障码DTC的管理中心。FIM(Function Inhibition Manager)则根据DEM中的故障状态,决定某些功能是否允许继续执行,实现“故障降级”或“功能抑制”。

S32G AUTOSAR 诊断协议栈数据流 应用层 / SWC / CDD 诊断服务处理函数 故障监控与上报 功能抑制请求 OTA 客户端 服务层:DCM / DEM / FIM DCM 会话/安全/服务分发 0x10 / 0x27 / 0x22 / 0x2E DEM 事件去抖/存储/老化 DTC 状态位管理 FIM 功能抑制条件判断 FID 与事件映射 传输层:CAN TP / DoIP TP CAN TP (ISO 15765-2) SF / FF / CF / FC 帧 CAN ID: 0x7DF / 0x7E0 / 0x7E8 DoIP TP (ISO 13400) TCP 13400 / UDP 13400 车辆识别 / 路由激活 / 诊断消息 事件状态 抑制条件 诊断请求自传输层上行至 DCM,故障状态在 DEM/FIM 间流转,响应再经传输层下发

二、DCM、DEM、FIM 的职责边界

DCM 的核心是“会话—安全—服务”三级门控。收到 0x10 会话切换请求后,DCM 会检查当前会话是否允许该跳转;收到 0x27 安全访问请求时,DCM 会校验种子与密钥;只有通过校验后,0x2E 写数据、0x31 例程控制等敏感服务才会被放行。DCM 本身不存储故障,它只负责把诊断请求翻译成对 DEM 或应用的调用。

DEM 负责故障事件的全生命周期。每个事件有去抖计数器、确认阈值、故障确认状态和老化周期。当事件状态变为 confirmed 后,DEM 会更新 DTC 状态字节,并可通过 0x19 服务读取。FIM 则订阅 DEM 中的事件状态,当某个事件满足抑制条件时,FIM 会禁止对应的功能标识 FID,例如禁止某路输出、禁止某个控制策略,从而实现故障安全。

关键理解:DCM 管“通信”,DEM 管“故障”,FIM 管“功能”。三者通过 RTE 和 BSW 内部接口协作,而不是互相替代。

三、CAN TP 与 DoIP TP 的差异与选择

CAN TP 基于 ISO 15765-2,把超过 8 字节的诊断报文拆成首帧、连续帧和流控帧。S32G 上通常由 CanTp 模块配合 CanIf、CanDrv 完成。DoIP TP 基于 ISO 13400,使用以太网承载诊断报文,支持车辆识别、路由激活和诊断消息三类报文,适合 OTA 大数据量传输和高速诊断。

对比项 CAN TP DoIP TP
标准 ISO 15765-2 ISO 13400
物理层 CAN / CAN FD 以太网
典型端口/ID 0x7DF、0x7E0、0x7E8 TCP/UDP 13400
适用场景 常规UDS诊断、故障读取 OTA、大数据量刷写、远程诊断
S32G模块 CanTp + CanIf + CanDrv DoIP + SoAd + TcpIp + EthIf

四、S32G上的诊断栈配置要点

在 S32G 的 AUTOSAR 配置工具中,诊断栈配置通常围绕以下几个关键参数展开:

  • DCM 配置:定义诊断会话、安全等级、服务表、P2/P2* 定时参数,以及协议优先级。
  • DEM 配置:定义事件、DTC、去抖算法、存储类型、老化周期和事件优先级。
  • FIM 配置:定义 FID、抑制条件、事件到 FID 的映射关系。
  • CanTp 配置:定义 N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr 等网络层定时参数,以及寻址方式。
  • DoIP 配置:定义逻辑地址、车辆识别请求响应、路由激活超时和诊断消息处理。
/* 典型 DCM 定时参数示例 */
DcmDspSessionP2ServerMax   = 50ms
DcmDspSessionP2StarServerMax = 5000ms
DcmDspSecurityNumSeedBytes = 4
DcmDspSecurityNumKeyBytes  = 4

/* CanTp 定时参数示例 */
CanTpNAs = 1000ms
CanTpNAr = 1000ms
CanTpNBs = 1000ms
CanTpNCr = 1000ms
配置建议:P2 定时参数要与诊断仪的超时设置匹配,否则会出现“请求已发出但响应超时”的假故障。CanTp 的 N_Bs 和 N_Cr 也要与总线负载匹配,避免流控帧丢失导致诊断中断。

五、诊断通信实现案例:读取 DTC 的完整链路

假设诊断仪通过 CAN 发送 0x19 0x02 请求读取已确认 DTC。报文首先到达 CanDrv,经 CanIf 进入 CanTp,CanTp 完成重组后交给 DCM。DCM 解析服务号为 0x19,检查当前会话和安全等级,然后调用 DEM 接口获取 DTC 列表。DEM 从 NVM 或 RAM 中读取 confirmed DTC,按格式组织响应数据,再经 DCM、CanTp、CanIf、CanDrv 返回给诊断仪。

如果同一请求通过 DoIP 发送,则报文先经 EthIf、TcpIp、SoAd 到达 DoIP 模块,DoIP 完成路由激活和诊断消息解析后,再交给 DCM。上层服务逻辑完全一致,差异只在传输层。

常见误区:很多工程师把 DCM 当成“诊断的全部”,忽略了 DEM 的去抖和 FIM 的抑制逻辑。实际排障时,0x19 读不到 DTC,可能是 DEM 事件未确认;功能不执行,可能是 FIM 已抑制。必须按“传输层→DCM→DEM→FIM”的顺序逐层排查。

六、复盘与排障思路

诊断通信失败时,建议按以下顺序定位:

  1. 确认物理层和链路层是否正常,CAN 或以太网能否收到报文。
  2. 检查 CanTp 或 DoIP 的定时参数和寻址配置是否正确。
  3. 确认 DCM 是否收到请求,会话和安全等级是否满足服务要求。
  4. 检查 DEM 事件状态和 DTC 存储是否已更新。
  5. 确认 FIM 是否因故障条件抑制了目标功能。

S32G 的诊断协议栈是一个分层协作系统,DCM 负责通信调度,DEM 负责故障管理,FIM 负责功能抑制,CAN TP 与 DoIP TP 负责可靠传输。只有把每一层的职责和接口关系理清,才能在 OTA、产线诊断和售后排障中快速定位问题。