【知识点】UDS刷写的一般流程介绍
图片来源:ISO-14229-1封面
目录
- 1. 预刷写
- 2. 刷写
- 3. 刷写后
1. 预刷写
当诊断仪接入CAN总线,因为是要刷写发动机控制单元(ECU),而其他的节点,也会发送报文,为了让总线通信“质量”高一点,总线负载不大那么大,所以要先通知总线上的所有节点,暂时不要发送和接收报文了,而且不要进行错误计数了,如何通知呢?
功能寻址,先切换会话:
可以看到,总线上除了ECU(0x7E8),还有一个节点(0x7E9),此时这两个节点都将会话切换到了extendedSession。
关闭DTC:
其中,DTCSettingType,0x01是开启,0x02是关闭。
$28是通讯控制服务:
sub-function=0x03是disableRxAndTx,communicationType=0x01是normalCommunicationMessages。
DTC关闭了,其他节点也静默了,现在开始诊断仪和ECU两个的对话了:
诊断仪请求ECU,切换会话至编程会话,同时告诉其他节点,它还“在线”,继续保持静默。
进入编程会话后,ECU要对诊断仪进行“身份认证”,验证诊断的钥匙能否打开它的锁。
首先,诊断仪向ECU请求seed,诊断仪用ECU回复给它的seed:0x21、0x74,计算出key:0x47、0x11再发送给ECU确认,ECU通过内部算法,同样也用seed:0x21、0x74计算出了一个key,和诊断发送的key比较,如果一样,则通过验证,否则,认证失败。
2. 刷写
通过认证后,ECU就可以放心地让诊断仪对它进行“操作”了。
刷写ECU,首先要先擦除要重新写入的地址区域,通过$31服务,启动擦除,0xFF00是协议规定的eraseMemoryDID;因为擦除Flash时间比较长,ECU要告诉诊断仪,此时“擦除正忙”的信息。
擦除和校验都是通过$31服务完成的,要擦除的块和要校验的块是对应的。
擦除完成后,正式开始进行刷写,也就是发要刷写的数据发送给ECU,ECU收到后,再写入对应的Flash地址区域。诊断仪一共要发送多少数据,每次发多少,要写入的地址是多少等,这都要提前告诉ECU,才能保证刷写正确。
第一块数据的Flash地址是:0x00001968,长度是:0x01FF;
第一块的数据总长度0x01FF=(0xFD 0xFD 0x05),即block1 block2 block3的长度。
模块1的block1长度=0xFD,多包的总长度是0xFF(0xFD 2),数据:0x02、0x03、…0xFD、0xFE,总共0xFD
模块1的block2长度=0xFD,多包的总长度是0xFF(0xFD 2),数据:0x02、0x03、…0xFD、0xFE,总共0xFD
模块1的block3长度=0x04,数据:0x02、0x03、0x04、0x05、0x06。
模块1的刷写流程结束。
第二块数据的Flash地址是:0x00001B67,长度是:0x01FF。
第二块的数据总长度0x01FF=(0xFD 0xFD 0x05),即block1 block2 block3的长度。
模块2的block1长度=0xFD,多包的总长度是0xFF(0xFD 2),数据:0x02、0x03、…0xFD、0xFE,总共0xFD
模块2的block2 长度=0xFD,多包的总长度是0xFF(0xFD 2),数据:0x02、0x03、…0xFD、0xFE,总共0xFD。
模块2的block3, 数据长度=0x05,数据:0x02、0x03、0x04、0x05、0x06。
模块2的刷写流程结束。
校验刷写区域。
3. 刷写后
写入VIN。
硬件复位。
至此,满足UDS协议的一般刷写流程就结束了。
参考资料:
【1】Road vehicles — Unified diagnostic services (UDS) Part 1: Specification and requirements
【2】UDS,ISO14229,ISO15765,ISO15031,J1939车辆诊断协议入门系列