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

子功能参数定义
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诊断请求已经被成功执行了。

荣耀FlyPods无线蓝牙耳机参数详解
激光雷达是否刚需还有待考察
大众投资200亿建设电池工厂,预计将于2025年投产
全球稳定币与央行数字货币详细介绍
如何看懂plc程序
浅析UDS中的肯定响应抑制SPRMIB
第五届中国液化天然气大会成功举办,汉威科技两款核心产品成为热点
世界老龄化带来巨大需求缺口,养老机器人潜在需求量巨大
DDFS的原理及DDFS的FPGA实现
如何实现高精度微棱镜高效批量生产、高精度、高一致性呢?
无线网卡怎么收费
小米林斌:小米7月将有两款新品发布
CNN结构基本情况
PCBA加工流程及注意事项
基于CD4013构建的触摸开关电路图
打磨180天,魅族Pro 6s 11月3日姗姗来迟
司南物联与合作伙伴一同研发出控制板内置蓝牙模块
以太坊区块链硬分叉伊斯坦布尔将有助于提高以太坊区块链的可伸缩性
智慧教育的人工智能平台如何建设?
ARM在中国发布”全球大学计划合作联盟“项目