潘文卿,王飞飞,宋炳雨
(潍柴动力股份有限公司,山东 潍坊 261061)
在发动机下线的时候,会根据发动机的型号、适配领域等对于一些特殊变量进行现场标定,数据标定完成后,如果统一按照传统的UDS(UDS-Unified Diagnostic Services,统一诊断服务)刷写流程进行数据的整区刷写会耗费较多的时间,操作步骤也相对专业化,不利于不同层级的客户进行操作,所以我们需要研究一种简单、快捷的操作方法,只需知道要更新变量的地址、变量的长度,输入后就可以完成单个变量的数据固化,方便操作,同时节约时间。
传统UDS刷写流程如图1所示,在刷写流程中擦除时,是根据整个单片机的Block分区决定的,Block分区有256k、128k、64k等整块大小,每当擦除的时候都会整块擦除,写数据的时候也是整区写入新的数据。请求下载过程中,上位机会传输要下载的起始地址、地址范围等信息与下位机进行校验,校验通过后再进一步传输数据,如果跨区了或者范围不对,就会报错,不再进行会话流程。在新的数据刷写完毕后,会对刷写的新数据进行校验,上位机计算一个传输数据的校验和,下位机根据刷写的范围和长度计算一个校验和,两个对比,如果一致则认为此次刷写是成功的,可以退出刷写流程。在此过程中的计算、校验、传输的最小单位是对应单片机Flash分区的Block块。
图1 传统UDS刷写流程图
单变量刷写的流程设计是在标准UDS刷写流程中加入特殊的流程。如图2所示,增加数据的上载查看功能,当要更新数据时可以先将该权限范围的数据上载上来查看是否需要更新,如果需要变更,根据下载流程,请求擦除,在擦除之前将对应Flash中的数据先备份对应大小的Flash备份区和一个对应大小的RAM区中,然后再擦除,以保证在后续的操作过程中出现异常后数据的完整。在请求下载的过程中会将数据的起始地址和长度传递给下位机,下位机会根据安全校验的权限进行判断收到的地址范围是否在权限范围内,如果在权限范围内会继续传输数据,如果不在范围内存在跨权限的情况,会给出否定响应并声明权限不对。如果权限范围正确,会校验传输地址是否存在跨区的问题,如果存在跨区的问题时同样会做出否定响应提示上位机,单次传输数据必须传输同一个区的数据,不能跨区、跨权限。在传输数据时,将收到的新数据在对应的RAM中找到相对位置更新数据,传输完毕后,如果本区域内还有新的数据要传输,则继续接收,继续放到RAM中对应的位置上,如果没有数据传输了,就计算RAM中的校验和与上位机计算的传输数据的校验和作对比,如果一致,则将RAM中的数据写到对应的Flash中,结束会话流程。如果不一致则反馈否定响应告知上位机传输过程有问题,需要进一步校验传输。
图2 单变量刷写的流程图
下线数据权限分为发动机厂权限、整车厂权限、服务站权限、用户权限,权限大小依次降低,并采用向下级联的方式。发动机厂权限可以刷写所有区的数据,整车厂权限除了发动机厂权限区域的数据不能刷写,其他权限范围的数据都可以刷写,服务站权限只能刷写服务站和用户权限范围的数据,用户权限只能刷写用户权限范围内的数据。在安全校验和请求下载步骤中都会按照权限的设置进行校验,如果是采用整车厂进行安全校验,在请求下载时传输的是发动机厂数据域的起始地址和长度则会报出权限错误,不能往下进行刷写,如果重新传输一个整车厂权限范围内的起始地址和长度,会继续会话刷写流程。权限级联图如图3所示。
图3 下线数据刷写权限级联结构图
为了避免刷写异常还需要开发一个Flash备份区,当数据请求在例程控制访问时需要将对应区域的原数据备份到Flash备份区,以免在刷写的过程中出现异常,导致新的数据没有更新成功,原Flash区的数据又被擦掉了,导致控制器被刷死。在每个下线数据的Flash区的开头都预留4字节,分别存放单变量刷写的标志位和校验和结果。如果对应的下线数据区域进行过单变量刷写,则在开头2字节设定一个标志位,在数据传输完毕后,例程控制-校验和计算环节计算出校验和后将检验和以及单变量刷写的标志位一起存放在RAM区的开头最开始4个字节,最后将RAM中的数据一起写到对应的Flash中。
在控制器重新上电的时候会对下线数据存放的Flash区域进行校验,如果校验异常,则进行回滚操作。单变量刷写的异常断电存在两种情况:第1种是将原数据备份到备份区后,原来的数据已经擦除掉了,新数据还没有在Flash中写的时候,此时Flash中是空的,检测到这种结果的时候将备份区的数据回滚到Flash中保证控制器是可以运行起来的;第2种情况是原数据备份到备份区,擦除了Flash区,新的数据开始往Flash区写的过程中异常断电了,这样Flash区的开头4个字节是有数据标识的,校验一下校验和与Flash区的数据是否一致,如果不一致同样将备份区的数据回滚到Flash区中以保证控制器能够正常运行。
如图4所示,通过上位机传递一个12字节的数据,完成刷写流程后我们用调试器查看对应的Flash区数据就是传输的数据。
图4 单变量刷写的应用
在实际的刷写过程中通过实际测试,单个变量刷写的流程大约在3s左右时间即可完成,可以大大提升发动机下线的速率。
本文设计了一种单个变量刷写的方案,单个变量是从上位机只传输要更新数值的单个或者几个变量的地址和数据长度,按照刷写权限进行区分,最高权限的可以对所有的下级变量进行刷写,采用向下级联的方式,最低权限的只能刷写权限分区范围内的数据。在下位机中开发一块对应大小的RAM分区,将要刷写的变量所在的分区提前备份,新的数据传输过来后更新对应位置的数据,传输完成后将RAM中的数据统一写到Flash中,同时需要一个Flash备份区,将原有数据备份到Flash备份区,以免刷写过程中出现异常导致控制器无法使用。这种方法既可以大大减少刷写数据的时间,提升发动机下线的速率,又能保证下线操作的安全性。