工作中,对于功能寻址NRC到底哪些该回复,哪些不需要回复比较混肴。抽空翻了下ISO14229-1,结合资料,有了如下结论,若有问题,欢迎指正~
1.概念
UDS协议定义了两种不同寻址方式的诊断请求,分别为:物理寻址(physical addressing)和功能寻址(function addressing)。
-
物理寻址(1:1):采用端对端的通信方式,Tester发送诊断请求给某个ECU
-
功能寻址(1:N):采用广播的通信方式,Tester发送诊断请求给整车ECU。
维度 | 功能寻址 | 物理寻址 |
---|---|---|
通信模式 | 广播(一对多) | 点对点(一对一) |
响应规则 | 部分NRC不响应(如0x11, 0x12) | 所有错误均需响应 |
典型应用场景 | 批量操作、全局配置 | 精确调试、特定ECU编程 |
总线负载 | 低(单次请求+有限响应) | 高(需多次请求+响应) |
2. 为何有功能寻址
功能寻址主要有以下几个优势:
-
批量操作效率提升
-
通过单次广播请求(如CAN ID 0x7DF),同时触发多个ECU执行相同操作,避免逐一对各ECU发送物理寻址请求的冗余操作。
-
典型用例:
-
批量清除多个ECU的故障码(服务 0x14)
-
统一关闭所有ECU的周期通信(服务 0x28)
-
同时禁用多个ECU的故障检测(服务 0x85)
-
-
-
减少总线负载
-
抑制非必要响应:针对特定NRC(如服务不支持、子功能不支持等),ECU不回复否定响应(NRC),避免总线因多节点同时响应造成拥堵。
-
优化带宽占用:适用于需要快速完成全局操作且无需逐一确认结果的场景(如产线下线配置)。
-
-
全局状态管理
-
统一控制多个ECU的会话状态(如通过服务 0x3E 维持非默认会话),确保诊断流程同步。
-
同时获取多个ECU的通用信息(如通过服务 0x22 读取软件版本)
-
3. NRC响应规则
根据ISO14229-1 2020中描述,NRC响应针对带功能及不带子功能的表现有所不同。
3.1 对带子功能参数的请求消息的响应
对物理寻址的客户端请求消息
对功能寻址的客户端请求消息
3.2 对不带子功能参数的请求消息的响应
对物理寻址的客户端请求消息
对功能寻址的客户端请求消息
4. 总结一下
物理寻址下,若肯定响应抑制位=0,无论是肯定响应还是否定响应,服务器都需要应答;
若肯定响应抑制位=1,肯定响应不需要应答(但是若回了NRC78,肯定响应也会回复,抑制位失效),否定响应都需要应答。
功能寻址下,肯定响应抑制位=0,若是肯定响应,则服务器发送肯定响应;若是否定响应,服务不支持、子功能不支持、数据参数不支持这三个任一个条件成立,服务器均不需要响应;例如 NRC 12(子功能不支持),NRC 11(服务不支持),NRC7E(当前会话下子功能不支持),NRC 7F(当前会话下服务不支持),NRC 31(参数请求超出范围) ,不需要响应;NRC22, NRC33则需要回复
肯定响应抑制位=1,若是肯定响应,则服务器不响应;若是否定响应,除了上述不需要回复的NRC,其他都需要回复。
具体场景示例:
场景 | 抑制位设置 | ECU处理结果 | 依据 |
---|---|---|---|
请求不支持的服务(NRC 0x11) | 1(功能寻址) | 不回复任何响应 | 抑制规则覆盖此NRC |
安全访问未解锁(NRC 0x33) | 1(功能寻址) | 回复否定响应(0x7F + NRC 0x33) | 非抑制类NRC需反馈 |
当前会话不支持子功能(NRC 0x7E) | 1(功能寻址) | 不回复任何响应 | 抑制规则覆盖此NRC |
请求参数超限(NRC 0x31) | 1(功能寻址) | 不回复任何响应 | 抑制规则覆盖此NRC |
密钥验证失败(NRC 0x35) | 1(功能寻址) | 回复否定响应 | 非抑制类NRC需反馈 |