浅析UDS中的肯定响应抑制SPRMIB

电子说

1.3w人已加入

描述

子功能参数定义

UDS协议中,有些诊断服务是带有子功能的。子功能参数的取值范围为0x00 - 0x7F。细心的同学应该发现了,子功能参数占用了一个字节,可用的数值范围为0~0xFF。但子功能的最大取值只到0x7F,那么最高位去哪了呢。这个子功能参数的最高位就是我们今天要聊的诊断服务肯定响应抑制位SuppressPosRspMsgIndicationBit,简写为SPRMIB。

如下是诊断服务子功能参数的格式定义。其中的最高位Bit7就决定了ECU是否需要给出肯定响应。

子功能参数格式定义

复位器

肯定响应抑制位的作用

ECU收到SPRMIB为1的服务时,不需要给出肯定响应。相反,当ECU收到SPRMIB为0的服务时,需要给出肯定响应。

例如,ECU收到诊断仪发来的Tester Present服务为$02 3E 00时,需要给出$02 7E 00的肯定响应。同样是Test Present服务,如果ECU收到的是$02 3E 80,则无需给出肯定响应。

例外情况

ECU在响应某些诊断服务时,由于执行时间较长,无法立即给出肯定响应。此时ECU会先给出NRC为0x78的否定响应。然后等到所请求的服务执行完后,给出最终的肯定响应或否定响应。这种情况下,即使ECU收到的诊断服务请求中子功能参数肯定响应抑制位为1,最终的肯定响应也不会被抑制。

例如在如下的诊断通信中, 即使ECU收到了子功能为0x82的诊断会话控制(DiagnosticSessionControl)服务,最终仍然需要给出肯定响应。

Tester : $02 10 82

ECU : $03 7F 10 78

ECU : $06 50 02 00 32 01 F4

我们来分析一下这个过程。首先Tester请求ECU进入编程回话(Programming session),但不希望ECU给出肯定响应。但是进入编程回话通常需要ECU复位,重新启动后进入Bootloader。这个过程所需要的时间会超过P2CAN_Server (通常为50ms)。所以ECU会先给出NRC为0x78的否定响应,用以通知Tester诊断请求已经正确接收了,正在处理,稍后给出响应。

当ECU成功执行了切换到Programming Session的操作后,由于之前给出了NRC为0x78的否定响应,此时必须给出肯定响应,用以通知Tester诊断请求已经被成功执行了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分