目录
一、UDS刷写的两种方式:
1.1普通刷写原理:
1.2强制刷写:
二、刷写流程图
2.1 刷写前(设置刷写网络)
2.1.1 切换到扩展模式(10 03)
2.1.2 检查刷写前提条件(31 01 XX XX)
2.1.3 停用故障码存储功能(85 02)
2.1.4 停止发送一般通讯报文(28 01 01 XX XX)
2.2 刷写中(认证&下载数据)
2.2.1 切换到编程会话(10 02)
2.2.2安全访问-请求种子(27 01)
2.3 安全访问-发送与验证Key(27 02)
2.2.4 写入指纹(2E XX XX YY YY ...)
2.2.5 擦除内存(31 01 FF 00 XX XX YY YY)
2.2.6 请求下载(34 XX YY ZZ ZZ AA AA)
2.2.7 传输数据(36 XX YY YY ...)
2.2.8 请求传输退出 (37)
2.2.9 检查存储空间(31 01 02 02)
2.2.10 检查编程依赖(31 01 FF 01)
2.2.11 ECU复位(11 01)
2.3 刷写后(还原网络)
2.3.1 切换到扩展模式(10 03)
2.3.2 启用发送一般通讯报文(28 00 01 XX XX)
2.3.3 各 ECU 恢复故障码的检测(85 01)
3.4 ECU 回到默认模式(10 01)
汽车升级过程的就是针对ECU的升级,在ECU的刷写过程种定义了刷写前、刷写中、刷写后三个阶段, 负责将正确的刷写文件( S19 或者 HEX) 下载到 ECU 中。
一、UDS刷写的两种方式:
1.1普通刷写原理:
程序运行后首先在boot中运行,boot会对app程序进行校验,检查app程序是否正常,如果不正常会停留在boot区,正常则跳转到app区运行。程序在运行过程中会备份两份,如下图所示程序刷写会刷写右侧区域,刷写完成复位之前会未刷写区域和新程序进行互相拷贝。刷写过程中,当app收到刷写指令后会跳转到boot区对app进行刷写。
1.2强制刷写:
当app运行异常无法跳转到boot区,则执行强制刷写,ECU下电,上位机发送强制刷新指令,一般为31例程,然后下位机上电,ECU会停留在boot区,直接进行刷写。
二、刷写流程图
2.1 刷写前(设置刷写网络)
刷写前,刷写工具读取 ECU 的 Boot 软件版本号(F180)、软件版本(F188)、 VIN(F190)、 硬件版本(F191),根据从 ECU 获取到的相关信息到刷写数据库中查找对应的升级文件。维修店代码或诊断设备序列号(F198)、刷写日期(F199)在刷写启动时写入,用于追溯之前的刷写操作。
刷写准备阶段需要确认待刷写控制器的相关版本信息, 设置刷写网络等。这个阶段在整车各个控制器的应用程序中执行, 此阶段, 使用功能地址向网络上的各控制器发出诊断请求进行网络设置。
2.1.1 切换到扩展模式(10 03)
默认状态下 ECU 在 01 默认会话中,使用UDS 会话切换(10 03)进入拓展会话。
2.1.2 检查刷写前提条件(31 01 XX XX)
整车厂通常会定义一些控制器刷写的前提条件,比如车速要低于3km/h等,这一步就可以检查刷写前提条件是否满足。不同的OEM/Tier1可能有不同的检查条件。常见的前置条件如下:
- ECU 的电源电压不能太高或者太低(9V-16V)
- 车辆处于 IGN On 状态, 但不在 Ready 状态
- 车辆处于静止状态,车速为 0km/h
具体使用 31服务 执行检查编程条件的例程 routine,如条件不满足(比如车速过高等),则退出刷写。
2.1.3 停用故障码存储功能(85 02)
刷写过程中,控制器功能不正常,不能收发总线消息,这种情况下,需要避免在这个过程中触发故障码存储。使用85诊断故障码设置服务设置故障码设置类型为OFF(02)关闭DTC的存储。
2.1.4 停止发送一般通讯报文(28 01 01 XX XX)
刷写过程中,因为传输的数据较多,因此停用通讯报文的发送可以降低总线负载。
使用28服务关闭与诊断无关的报文,将节约出来的通信资源用于刷写软件,提升刷写速度。
2.2 刷写中(认证&下载数据)
刷写中首先进行身份认证,而后可以写入指纹,然后执行刷写擦除内存,向指定地址下载固件,并检查写入是否正确。
2.2.1 切换到编程会话(10 02)
刷写过程必须要在编程会话中才可以进行。使用会话控制服务 10 02 切换到 programming session。
2.2.2安全访问-请求种子(27 01)
27 安全访问服务 保证是有权限的人员或者设备才能够进行刷写,安全访问服务子功能请求种子向 ECU 请求安全认证种子。
2.3 安全访问-发送与验证Key(27 02)
诊断设备收到种子后,将种子作为输入,使用双方已知的算法,计算得到Key。然后使用子功能发送秘钥将计算得到的秘钥发送给ECU。ECU使用相同的算法计算出秘钥并与收到的值进行对比,相同则认证通过。
如果连续多次认证失败,安全访问会暂停服务一段时间。每认证失败一次,ECU安全访问失败计数器就会加1。当错误次数达到3次后,将收到0x36(尝试次数超限)的否定响应码,并延时10秒。10秒之内请求会收到0x37(延时时间未到)的否定响应码,10s之后才能再次发起认证请求。
2.2.4 写入指纹(2E XX XX YY YY ...)
记录刷写时间(F198)、写入指纹信息(F199),标记写软件人的身份(维修店编号、诊断设备序列号)。
2.2.5 擦除内存(31 01 FF 00 XX XX YY YY)
在向 ECU 的内存区域下载数据之前, 需要先擦除内存区域已有数据。
采用 31 例程控制服务 FF00 擦除内存,根据控制器地址空间分配和芯片擦除能力,单次擦除所有或多次分段擦除。
31 01 FF 00 擦除起始地址 擦除长度
2.2.6 请求下载(34 XX YY ZZ ZZ AA AA)
向ECU传输软件之前需要指定写入的地址和数据的大小。
刷写设备使用 34 请求下载服务向 ECU 指定刷写起始地址和刷写数据的大小, 请求下载 ($34)服务指定的内存从起始到结束应该是连续的。如果不是连续的,刷写设备应该为每个要刷写的数据块发送一个单独的请求。
34 数据格式标识符 地址和长度格式标识 内存地址 内存大小
2.2.7 传输数据(36 XX YY YY ...)
软件下载服务,将数据下载到上一步指定的内存中。
刷写设备使用 36 传输数据服务向 ECU 内存区域中传输刷写的数据,一个数据块通常需要多条传输数据服务传输。
36 数据块顺序计数器 数据
2.2.8 请求传输退出 (37)
37 服务退出当前连续内存区域的刷写,将在肯定响应中携带校验和,校验最近的一条请求下载请求服务指定的内存区域。
返回的校验和与刷写设备计算的校验和进行比较,如果不相同,将重新使用 36 数据传输服务下载数据,多次校验不通过,刷写将会中断。
2.2.9 检查存储空间(31 01 02 02)
检验刷写的数据的可靠性,在软件/数据刷写完毕时,刷写设备通过例行程序服务来验证刷写到内存区域的每块数据是否成功。
检查刷写的数据的完整性,确定来源合法,通过CRC、哈希、数字签名等方法,保证刷写过程中不会出错,且刷写的数据是来自合法的提供者。
2.2.10 检查编程依赖(31 01 FF 01)
使用 31 例程控制服务 FF01 确认刷入的软件和ECU的硬件,基础软件是匹配的。
2.2.11 ECU复位(11 01)
整个刷写完成后,刷写设备要求 ECU 硬件复位, ECU 进入应用程序。
11 复位服务重启ECU,使刷写的新软件生效。
2.3 刷写后(还原网络)
刷写后的步骤与刷写前的步骤是对应的,启用刷写前禁用的通信等。
此时网络恢复到正常的模式, ECU 以默认的波特率进行正常的通信,并能进行故障码的检测和存储。刷写结束后要求各 ECU 恢复非诊断消息的发送及接收 。
2.3.1 切换到扩展模式(10 03)
默认状态下 ECU 在 01 默认会话中,使用UDS 会话切换(10 03)进入拓展会话。在拓展会话中,启用非诊断通信、清除刷写阶段产生的故障码、各 ECU 恢复故障码的检测。
2.3.2 启用发送一般通讯报文(28 00 01 XX XX)
使用 28 通信控制服务启用在刷写前停止收发的一般通讯报文。
2.3.3 各 ECU 恢复故障码的检测(85 01)
恢复故障码检测,85诊断故障码设置服务设置故障码设置类型为ON(01)恢复DTC的存储。
3.4 ECU 回到默认模式(10 01)
从扩展会话切换回默认会话。