Bootloader
- 一段有下载和引导功能的程序
- 下载应用程序
- 引导使
MCU运行在应用程序中,只在有更新请求或者APP无效的时候才会激活
APP和Bootloader都存在Flash中Flash Driver用来擦除APP,下载临时存放在RAM中,下载完成后复位释放。一般随用随下,不允许固化在Bootloader中,防止误调用擦除APP- 启动时序

-
注意:
APP中,执行10 02相当于一个复位动作 -
刷写过程
-
Pre-Programming step预编程阶段-
跳转到扩展会话模式
02 10 03 06 50 03 xx xx xx xx # 这中间为了保持当前会话,会周期发送 3E 服务 02 3E 8002 10 03,后面的填充根据要求
-
关闭
DTC02 85 02 02 C5 02 -
禁止非诊断报文的接收和发送
03 28 03 01 02 68 03
-
-
Programming step主编程阶段-
跳转到编程会话模式
02 10 02 06 50 02 xx xx xx xx # 这中间为了保持当前会话,会周期发送 3E 服务 02 3E 80 -
安全访问
02 27 01 04 67 01 xx xx(Seed 2-Byte) 04 27 02 xx xx(KEY: 2-Byte) 02 67 02 -
下载
Flash Driver# Request Download 34 xx xx xx... 74 xx(lengthFormatIdentifier) xx...(maxNumberOfBlockLength) # Transfer Data # 序号首次1-F,后续0-F 36 01 xx...# 每条报文占的字节数根据34服务中响应的maxNumberOfBlockLength返回值 76 01 # Request Transfer Exit 01 37 01 77 -
完整性校验(
check routine),检查是否成功下载erase routine31 01 xx xx(Routine ID) 71 01 xx xx(Routine ID) xx(routineInfo) -
擦除
APP,擦除前会将APP有效位置0;- 如果没有置
0,当擦除一半失败,APP程序不完整了,Programming Request没有置1,APP有效位依然有效,那就不断进入崩溃的APP了 Stay In Boot,为了让Boot Manager能够收到上位机的诊断请求,在Boot程序停留一段时间,在这个时间内,Boot尝试捕获上位机的10 02请求。超过这个时间,Boot Manager必须决定进入哪个
31 01 xx xx(Routine ID) 71 01 xx xx(Routine ID) xx(routineInfo) - 如果没有置
-
刷写新的
APP到ECU(如果多个Module,循环多次)# Request Download 34 xx xx xx... 74 xx(lengthFormatIdentifier) xx...(maxNumberOfBlockLength) # Transfer Data # 序号首次1-F,后续0-F 36 01 xx...# 每条报文占的字节数根据34服务中响应的maxNumberOfBlockLength返回值 76 01 # Request Transfer Exit 01 37 01 77 -
完整性校验(
check Memory)31 01 xx xx(Routine ID) 71 01 xx xx(Routine ID) xx(routineInfo) -
验证应用程序
validate application,通过则将APP有效位置131 01 xx xx(Routine ID) 71 01 xx xx(Routine ID) xx(routineInfo) -
WriteDataByIdentifier——dataIdentifier = VIN1x xx 2E xx xx(DID) xx...(Data) 30 00 00 21 xx... 22 xx... 03 6E xx xx(DID)
-
-
Post-Programming step后编程阶段,这之后将Program Request置0-
开启通信
03 28 00 01 02 68 00 -
开启
DTC02 85 01 02 C5 01 -
复位
Reset02 11 01 02 51 01
-
-
服务
-
10诊断会话控制01默认会话:权限最小,可操作的服务少02编程会话:用于解锁bootloader相关的诊断服务03扩展会话:用于解锁高权限诊断服务,如:读写DTC、写入数据- 注:编程会话不能由默认会话转入(在默认会话情况下,不能执行
10 02),只能由扩展会话转入 - 默认进入默认会话,当
ECU处于非默认会话时,一段时间内没有请求会退回到默认会话。可以通过让Tester周期发送3E服务,使ECU保持在非默认会话
-
11重置ECUReset- 报文格式
- 请求:
11+Sub-function - 响应:
51+Sub-function+powerDownTime
- 请求:
- 常用子服务
01硬重启03软重启04enableRapidPowerShutDown当使用此子服务时,powerDownTime才会存在
11 01 51 01 - 报文格式
-
27安全访问ECU上电后是一个锁定的状态,可以通过27服务来解锁- 过程:
Tester端给ECU发送请求报文来请求种子ECU收到报文后,回复肯定响应(包含种子数)Tester端根据这个种子数,利用自身的安全算法算出一个密钥K1,并发送给ECUECU同样根据种子数和自身的安全算法计算出一个密钥K2,并将接收到的K1与K2相比较。如果一致ECU发送肯定响应给Tester端,已经解锁。
- 当执行复位、重新上下电或者会话切换后,会由解锁状态跳转到锁定状态
-
31例程控制RoutineControl- 客户端通过例程
ID(2-Byte)请求启动、停止服务端的例程或者请求例程结果 - 主要用于:
Erasing memory、Resetting - 报文格式
- 请求:
31+Sub-function+routineIdentifier(2-Byte) - 响应:
71+routineControlType+routineIdentifier(2-Byte)+routineInfo
- 请求:
- 常用子服务
01启动例程(startRoutine)02停止例程(stopRoutine)03请求例程结果(requestRoutineResults)
- 客户端通过例程
-
34请求下载Request Download- 报文格式
- 请求:
34+dataFormatIdentifier+addressAndLengthFormatIdentifier+memoryAddress+memorySize dataFormatIdentifier0000以外的值由汽车制造商定义
addressAndLengthFormatIdentifier的含义bit 7-4:Length (number of bytes) of the memorySize parameter,指定memorySize有几个字节bit 3-0:Length (number of bytes) of the memoryAddress parameter,指定memoryAddress有几个字节
memoryAddress要写入数据在内存的起始地址memorySize使用此参数与实际要传输的数据大小进行比较- 响应:
74+lengthFormatIdentifier+maxNumberOfBlockLength lengthFormatIdentifier的含义bit 7-4: Length (number of bytes) of the maxNumberOfBlockLength parameterbit 3-0: reserved by document, to be set to 0
maxNumberOfBlockLength告知客户端后面的每个TransferData报文总共占多少字节
- 请求:
34 11 33 60 20 00 00 FF FF 74 20 00 81 - 报文格式
-
36传输数据Transfer Data- 将数据从客户端传输到服务器,单次
36最多传输3580 = 4 + 510*7 + 6,4095 = 8 + 510*8 + 7 - 报文格式
- 请求:
36+blockSequenceCounter+Data(3-n)blockSequenceCounter序号0x01-0xFF,下一个循环0x00-0xFF
- 响应:
76+blockSequenceCounter+transferResponseParameterRecord
- 请求:
36 01 xx xx # 每条报文占的字节数根据34服务中响应的maxNumberOfBlockLength返回值 76 01 - 将数据从客户端传输到服务器,单次
-
37请求传输退出Request Transfer Exit- 用于终止客户端和服务端之间的数据传输
- 报文格式
- 请求:
37 - 响应:
77
- 请求:
37 77 -
28通信控制(CommunicationControl)- 用于开启或关闭服务端某些消息的接收/发送报文
- 报文格式
- 请求:
28+sub-function=[controlType]+communicationType communicationType01: normalCommunicationMessages02: networkManagementCommunicationMessages03: networkManagementCommunicationMessages and normalCommunicationMessages
- 响应:
68+sub-function=[controlType]
- 请求:
28 03 02 68 03- 常用子服务
00:enableRxAndTx启用非诊断报文的接收和发送03:disableRxAndTx禁止非诊断报文的接收和发送
-
85控制DTC(ControlDTCSetting)- 用于停止和恢复
DTC状态位的更新 - 报文格式
- 请求:
85+sub-function=[DTCSettingType]+DTCSettingControlOptionRecord - 响应:
C5+DTCSettingType
- 请求:
85 01 C5 01- 常用子服务
01on恢复更新
AndTx` 禁止非诊断报文的接收和发送
- 用于停止和恢复
-
85控制DTC(ControlDTCSetting)- 用于停止和恢复
DTC状态位的更新 - 报文格式
- 请求:
85+sub-function=[DTCSettingType]+DTCSettingControlOptionRecord - 响应:
C5+DTCSettingType
- 请求:
85 01 C5 01- 常用子服务
01on恢复更新02off停止更新
- 用于停止和恢复