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 80
02 10 03
,后面的填充根据要求
-
关闭
DTC
02 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 routine
31 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
有效位置1
31 01 xx xx(Routine ID) 71 01 xx xx(Routine ID) xx(routineInfo)
-
WriteDataByIdentifier
——dataIdentifier = VIN
1x 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
-
开启
DTC
02 85 01 02 C5 01
-
复位
Reset
02 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
软重启04
enableRapidPowerShutDown
当使用此子服务时,powerDownTime
才会存在
11 01 51 01
- 报文格式
-
27
安全访问ECU
上电后是一个锁定的状态,可以通过27
服务来解锁- 过程:
Tester
端给ECU
发送请求报文来请求种子ECU
收到报文后,回复肯定响应(包含种子数)Tester
端根据这个种子数,利用自身的安全算法算出一个密钥K1
,并发送给ECU
ECU
同样根据种子数和自身的安全算法计算出一个密钥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
dataFormatIdentifier
00
00
以外的值由汽车制造商定义
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 parameter
bit 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
communicationType
01: normalCommunicationMessages
02: networkManagementCommunicationMessages
03: 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
- 常用子服务
01
on
恢复更新
AndTx` 禁止非诊断报文的接收和发送
- 用于停止和恢复
-
85
控制DTC
(ControlDTCSetting
)- 用于停止和恢复
DTC
状态位的更新 - 报文格式
- 请求:
85
+sub-function=[DTCSettingType]
+DTCSettingControlOptionRecord
- 响应:
C5
+DTCSettingType
- 请求:
85 01 C5 01
- 常用子服务
01
on
恢复更新02
off
停止更新
- 用于停止和恢复