我总结了一张表格:详细解释了NRC的分布情况和NRC的触发条件
1:基本概念
NRC 全称Negative Response Code(否定响应代码),是指示uds诊断中的,指示否定响应的原因
例如:0x22 服务
request 报文 0x618 03 22 F1 34 00 00 00 00
Negative Response 响应报文 0x658 03 7F 22 31
2:NRC相关详细解释
我已经上传到资源中(excel表格总结),大家可以自行下载
3:对NRC简单的分类
一级分类 | 二级分类 | 英文简写 | 解释 |
通用型NRC | 0x00-0x0F | ISOSAEReserved | 系统保留 |
0x10 | GeneralReject | 一般错误 | |
0x11 | ServiceNotSupported | 服务不支持 | |
0x12 | subfunctionNotSupoot | 子功能不支持 | |
0x13 | INcorrectMessageLengthOrInvalidFormat | 长度或格式不支持 | |
0x14 | 长度过大,这里是指"软件配置中设定的最大接受长度"<N-PCI<=4095byte(专门针对can,canfd则不适用这个最大长度) | ||
0x15-0x20 | |||
0x21 | BusyRepeatRequest
| ||
0x22 | 条件不适合 | ||
0x23 | |||
0x24 | |||
0x25 | |||
0x26 | |||
0x27-0x30 | |||
0x31 | DID | ||
0x32 | |||
关于0x27服务的NRC | 0x33 | ||
0x34 | |||
0x35 | |||
0x36 | |||
0x37 | |||
0x38-0x4F | |||
0x50-0x6F | |||
关于刷新的NRC | 0x70 | ||
0x71 | |||
0x72 | |||
0x73 | |||
0x74-0x77 | |||
0x78 | |||
0x79-0x7D | |||
0x7E | |||
0x7F | |||
0x80 | |||
关于发动机系统的特定NRC | 0x81 | ||
0x82 | |||
0x83 | |||
0x84 | |||
0x85 | |||
0x86 | |||
0x87 | |||
0x88 | |||
0x89 | |||
0x8A | |||
0x8B | |||
0x8C | |||
0x8D | |||
0x8E | |||
0x8F | |||
0x90 | |||
0x91 | |||
0x92 | |||
0x93 | |||
0x94-0xFF |
4:NRC的优先级
我们以通用型NRC为例:
请求报文:0x618 05 10 99 XX XX XX XX XX;
可以看到 05 长度是错误的,对于0x10服务来说,0x99的子功能也是不存在的。
那么该该返回 NRC 0x13还是返回NRC 0x11?带着这个问题,我们进入NRC优先级的讲解。
NRC是优先级,
1:有一个非常重要的前提条件:必须是针对特定的服务来讨论优先级关系,因为每个服务对应的NRC是不一致的。
2:ISO14229-1 中规定了相应的NRC优先级,其中存在三个概念
名称 | 解释 |
mandatory | 强制性的,也就是强制性的规定NRC的优先级 |
optional | 可选择的 |
manufacture supplier specific | 主机厂要求,具体按照主机厂规范来做就好 |
通常情况下:按照如下优先级顺序实现,即可
NRC11>0x7F>0x13>0x12>0x7E>0x33(0x34&&0x35&0x36是0x33出现以后才能出现的)>0x24>0x31>0x22>0x78
4.1 接下来,我们以0x22服务为模板,
可以看到关于0x22请求服务,
1:服务器先是检查报文长度,长度不符合返回否定响应码0x13,。
2:然后进入循环,(这里循环,是因为0x22是可以同时支持多个DID读取的)故需要有个计数。
同时客户端还能选择,比如0x21检查,看能不能支持多DID读取。
3:然后检查DID是否需要安全解锁等级的要求。
4:下一步,主机厂如果对DID读取有(如整车电源模式要求,车速<3km/h的要求,检查不通过则返回0x22)
5:检查是否至少有一个DID支持,在本会话模式中,不通过则返回0x31
6:最后服务器检查客户端,发出的最长长度(CAN最长长度4095Byte),如果超出此长度则放回0x14
补充:如果0x22服务,不被ECU支持,难道不检查了吗?则返回0x11,虽然不常见,但是必须要了解。
4.2 0x2E服务的NRC优先级
和ox22差不多,只是可以最后阶段,需要检查下,是否写入(EER)成功成功!
4.3 0x14服务的NRC优先级顺序
14服务注意,他没有子功能,也没有DID,但是如果项目要求,其必须,在某种会话模式下才能使用,如果不满足此条件。那么将会返回0x31。
5:最后附上个NRC的英文全称和简写
一级分类 | 二级分类 | 英文全称 | 简写 |
通用型NRC | 0x00-0x0F | ||
0x10 | GeneralReject | GR | |
0x11 | ServiceNotSuported | SNS | |
0x12 | SubFunctionNotSupported | SFNS | |
0x13 | IncorrectMessagelengthOrInvalidFormat | IMLOIF | |
0x14-0x20 | |||
0x21 | busRepeatRequest | BRR | |
0x22 | ConditionsNotCorrect | CNC | |
0x23 | |||
0x24 | RequestSequenceError | RSE | |
0x25 | |||
0x26 | |||
0x27-0x30 | |||
0x31 | RequestOutOfRange | ROOR | |
0x32 | |||
关于0x27服务的NRC | 0x33 | SecurityAccessDenied | SAD |
0x34 | |||
0x35 | invalidKey | IK | |
0x36 | ExceedNumberOfAttemp | ENOA | |
0x37 | RequiredTimeDelayNotExpired | RTDNE | |
0x38-0x4F | |||
0x50-0x6F | |||
关于刷新的NRC | 0x70 | UploadDownNotAccept | UDNA |
0x71 | TransferDataSuspended | TDS | |
0x72 | GeneralProgrammingFailure | GPF | |
0x73 | WrongBlockSequenceCounter | WBSC | |
0x74-0x77 | |||
0x78 | RequestCorrectlyReceived -ResponsePending | RCRRP | |
0x79-0x7D | |||
0x7E | subFunctionNotSupported inActiveSession | SFNSIAS | |
0x7F | |||
0x80 | |||
关于发动机系统的特定NRC | 0x81 | ||
0x82 | |||
0x83 | |||
0x84 | |||
0x85 | |||
0x86 | |||
0x87 | |||
0x88 | |||
0x89 | |||
0x8A | |||
0x8B | |||
0x8C | |||
0x8D | |||
0x8E | |||
0x8F | |||
0x90 | |||
0x91 | |||
0x92 | |||
0x93 | |||
0x94-0xFF |