整理一份ISO 14229-1 NRC 码详细说明表,包含所有 NRC 码的含义、适用场景及排查建议,方便诊断故障时快速定位问题。
补充一份场景 - 故障排查映射表,包含每个场景下常见故障对应的 NRC 码及排查步骤,进一步提升诊断系统测试效率
一、ISO 14229-1 NRC 码详细说明表
| NRC 码 | 含义(Mnemonic) | 中文含义 | 适用场景 | 排查建议 |
|---|---|---|---|---|
| 0x11 | ServiceNotSupported (SNS) | 服务不支持 | 客户端请求的服务 ID(SID)未被 ECU 支持 | 1. 核对服务 ID 是否符合 ISO 14229-1 定义,确认未使用保留码; 2. 检查 ECU 诊断功能配置,确认该服务是否被禁用; 3. 核实诊断会话类型,部分服务仅在非默认会话下支持 |
| 0x12 | SubFunctionNotSupported (SFNS) | 子功能不支持 | 服务支持但请求的子功能参数无效或未被 ECU 支持 | 1. 核对子功能参数取值范围(如 0x01-0x7F); 2. 确认子功能与服务 ID 的匹配性(如 SecurityAccess 的请求种子 / 发送密钥子功能); 3. 检查 ECU 是否支持该子功能对应的功能(如编程会话下的特定子功能) |
| 0x13 | IncorrectMessageLength- OrInvalidFormat (IMLOIF) | 消息长度错误或格式无效 | 1. 请求 / 响应消息的字节长度与服务要求不匹配;2. 消息格式不符合 ISO 14229-1 定义(如参数缺失、字节顺序错误) | 1. 按服务规范校验消息总长度(含 SID、子功能、参数); 2. 检查参数字节数是否符合要求(如 DID 为 2 字节、内存地址为 4 字节); 3. 确认消息无多余 / 缺失字节,格式对齐(如高位在前、低位在后) |
| 0x14 | ResponseTooLong (RTL) | 响应过长 | 正响应消息长度超过传输层限制(如 CAN 总线单帧最大 8 字节) | 1. 拆分多 DID 请求,减少单次请求的数据量; 2. 启用分段传输机制(如 ISO 15765-2); 3. 检查 ECU 响应数据是否存在冗余,优化数据返回格式 |
| 0x21 | BusyRepeatRequest (BRR) | 总线忙,重复请求 | ECU 正处理其他诊断任务,暂时无法响应新请求 | 1. 等待 ECU 当前任务完成(如编程、复位),延迟后重试; 2. 检查是否存在并发诊断请求,确保单会话下串行执行; 3. 核实诊断会话超时参数(P2/P2*),避免超时前重复请求 |
| 0x22 | ConditionsNotCorrect (CNC) | 条件不正确 | 1. ECU 当前运行状态不满足服务执行条件(如发动机运行时执行编程服务);2. 前置条件未满足(如未解锁安全访问即执行写操作) | 1. 检查 ECU 状态(如点火开关状态、发动机转速)是否符合服务要求; 2. 核实前置操作是否完成(如安全访问解锁、诊断会话切换);3. 确认无其他诊断任务占用资源(如正在执行例行程序) |
| 0x24 | RequestSequenceError (RSE) | 请求序列错误 | 服务执行需遵循固定序列,客户端跳过前置步骤 | 1. 按规范执行序列操作(如 SecurityAccess 需先请求种子再发送密钥); 2. 检查 LinkControl 服务是否先执行验证步骤再请求模式切换;3. 确认前序服务是否成功完成(如 RequestDownload 后再执行 TransferData) |
| 0x31 | RequestOutOfRange (ROOR) | 请求超出范围 | 1. 参数值超出 ECU 支持的有效范围(如 DID、内存地址、数值参数);2. 请求的资源不存在(如未定义的 DID、非法内存地址) | 1. 核对参数取值范围(如 DID 的 0x0000-0xFFFF、内存地址的有效区间); 2. 确认动态定义的 DID 已完成定义(如 DynamicallyDefineDataIdentifier 执行成功); 3. 检查参数是否符合 ECU 硬件限制(如内存大小、数值精度) |
| 0x33 | SecurityAccessDenied (SAD) | 安全访问拒绝 | 1. 未解锁安全访问即请求受保护服务;2. 安全访问过程失败(如密钥错误) | 1. 确认已通过 SecurityAccess 服务完成解锁(请求种子→发送密钥→正响应); 2. 核对密钥计算逻辑是否与 ECU 一致(如种子加密算法); 3. 检查安全访问等级是否匹配(如编程服务需最高安全等级); 4. 若多次失败,确认 ECU 是否触发访问延时(如 ISO 21434 要求) |
| 0x35 | InvalidKey (IK) | 无效密钥 | SecurityAccess 服务中客户端发送的密钥与 ECU 计算的密钥不匹配 | 1. 重新执行安全访问序列(先请求种子再计算密钥); 2. 核对密钥算法(如 AES、自定义加密逻辑)是否正确; 3. 检查种子时效性,确保密钥在种子有效期内发送; 4. 确认密钥字节长度与 ECU 要求一致 |
| 0x36 | ExceededNumberOfAttempts (ENOA) | 超出尝试次数 | 安全访问等服务的失败尝试次数达到 ECU 限制 | 1. 等待 ECU 配置的延时时间(如 1 分钟)后重试; 2. 重启 ECU 清除失败计数(部分 ECU 支持); 3. 检查密钥计算逻辑,避免重复错误; 4. 确认 ECU 安全策略(如最大尝试次数、延时时间) |
| 0x37 | RequiredTimeDelayNotExpired (RTDNE) | 必要延时未到期 | 前一次操作后需等待的延时时间未结束(如安全访问失败后的冷却时间) | 1. 按 ECU 要求等待足够延时(如 10 秒)后重试; 2. 检查诊断工具的延时机制是否生效; 3. 避免在延时期间发送其他请求,防止计数重置 |
| 0x38-0x4F | ReservedByExtendedDataLink SecurityDocument (RBEDLSD) | 扩展数据链路安全保留 | 与数据链路安全相关的错误(如加密传输失败) | 1. 检查 SecuredDataTransmission 服务的安全参数配置; 2. 核实加密算法、密钥是否与 ECU 一致; 3. 确认数据链路安全状态是否正常(如 TLS 连接是否建立) |
| 0x72 | GeneralProgrammingFailure (GPF) | 通用编程失败 | 1. 写内存、写 DID 等编程操作失败;2. 非易失性存储(如 Flash)写入错误 | 1. 检查 ECU 供电电压是否稳定(编程需 13.5±0.5V); 2. 确认编程会话已激活,安全访问已解锁; 3. 核实写入地址是否为可写区域(如非引导区、保护区域); 4. 检查写入数据是否符合存储格式要求(如字节对齐、校验和正确); 5. 若多次失败,排查存储硬件故障(如 Flash 损坏) |
| 0x78 | RequestCorrectlyReceived ResponsePending (RCRRP) | 请求已正确接收,响应待发 | ECU 已接收请求但需延时处理(如长时例行程序、编程操作) | 1. 按 P2 * 超时参数等待 ECU 最终响应; 2. 期间可发送 TesterPresent 维持会话活性; 3. 若超时未响应,检查 ECU 是否处于异常状态(如编程中断) |
二、场景 - 故障排查映射表
| 应用场景 | 常见故障 | 对应 NRC 码 | 排查步骤 |
|---|---|---|---|
| ## 诊断通信管理 | |||
| 切换诊断会话 | 会话切换失败 | 0x12、0x22 | 1. 检查会话类型参数(0x01 默认、0x02 编程、0x03 扩展)是否有效(NRC 0x12); 2. 确认 ECU 当前状态允许切换(如发动机熄火才能进入编程会话)(NRC 0x22); 3. 核对会话切换后是否返回 P2/P2 * 超时参数,确认切换成功 |
| ECU 复位 | 复位请求被拒绝 | 0x22、0x33 | 1. 检查 ECU 是否处于关键运行状态(如发动机运行时拒绝硬复位)(NRC 0x22); 2. 确认安全访问已解锁(部分复位类型需安全访问)(NRC 0x33); 3. 核实复位类型参数(0x01 硬复位、0x03 软复位)是否支持 |
| 安全访问解锁 | 解锁失败 | 0x12、0x33、0x35、0x36 | 1. 检查子功能参数(0x01 请求种子、0x02 发送密钥)是否正确(NRC 0x12); 2. 确认未解锁时触发受保护服务(NRC 0x33); 3. 核对密钥计算是否正确(NRC 0x35); 4. 若多次失败,等待延时或重启 ECU(NRC 0x36) |
| ## 数据传输 | |||
| 读取 DID 数据 | 读取失败 | 0x13、0x22、0x31、0x33 | 1. 检查 DID 请求格式(2 字节)和总长度是否正确(NRC 0x13); 2. 确认 ECU 状态允许读取(如部分 DID 需扩展会话)(NRC 0x22); 3. 核实 DID 是否为 ECU 支持的有效 ID(NRC 0x31); 4. 若为加密 DID,确认安全访问已解锁(NRC 0x33) |
| 写入 DID 数据(如 VIN 码) | 写入失败 | 0x13、0x22、0x31、0x33、0x72 | 1. 校验写入消息长度(含 DID 和数据)是否符合要求(NRC 0x13);2. 检查 ECU 是否处于可写状态(如非默认会话、发动机熄火)(NRC 0x22); 3. 确认 DID 支持写入(非只读 DID)(NRC 0x31); 4. 核实安全访问已解锁(NRC 0x33); 5. 检查写入数据格式(如 VIN 为 17 字节 ASCII 码)和存储状态(NRC 0x72) |
| 读取内存地址数据 | 读取失败 | 0x13、0x31、0x33 | 1. 确认地址长度格式标识(如 0x14 表示 4 字节地址 + 1 字节长度)正确(NRC 0x13); 2. 检查内存地址是否在 ECU 有效地址范围内(NRC 0x31); 3. 若为加密内存区域,确认安全访问已解锁(NRC 0x33) |
| ## 存储数据传输 | |||
| 读取 DTC 信息 | 读取失败 | 0x12、0x13、0x31 | 1. 检查 DTC 读取子功能(如 0x02 读取 DTC 列表)是否有效(NRC 0x12); 2. 校验消息格式(如 DTC 状态掩码为 1 字节)(NRC 0x13); 3. 确认请求的 DTC 组标识或状态掩码是否有效(NRC 0x31) |
| 清除 DTC 信息 | 清除失败 | 0x22、0x31、0x72 | 1. 检查 ECU 状态(如发动机运行时无法清除排放相关 DTC)(NRC 0x22); 2. 核实 DTC 组标识(如 0xFFFFFF 表示所有组)是否有效(NRC 0x31); 3. 检查存储介质是否正常,能否执行擦除操作(NRC 0x72) |
| ## 编程操作 | |||
| ECU 固件下载 | 下载失败 | 0x22、0x33、0x72 | 1. 确认已激活编程会话,ECU 处于编程模式(NRC 0x22); 2. 核实安全访问已解锁,获得编程权限(NRC 0x33); 3. 检查下载地址、数据长度是否正确,存储介质是否可写(NRC 0x72); 4. 确认传输数据校验和正确,无传输错误 |