一、目标
在上篇文章实现基于UDS LIN诊断协议的本地OTA升级-CSDN博客博客中已经基于LIN UDS诊断协议实现了通过PC端上位机对MCU进行本地的OTA升级。本篇将在上篇文章的基础上实现基于UDS 诊断协议的CAN本地OTA升级。本篇文章对实现的目的、需要用到的第三方工具请查看之前的博客相应章节,本文不再赘述。本文对CAN诊断帧和LIN诊断帧区别、升级协议、MCU端升级过程以及PC端升级过程做详细说明。
二、LIN和CAN诊断的区别
LIN诊断是通过节点地址(NAD)进行寻址,而CAN诊断是通过物理地址进行寻址。LIN诊断响应地址即为节点地址。而CAN响应的物理地址需要约定好。比如定义CAN诊断物理地址为0x700,MCU响应地址为0x701。
从发送格式上,LIN诊断帧(单帧)的PDU 单元包括:NAD+PCI+SID+D1~D5
而CAN诊断帧(单帧)的PDU单元包括:PCI+SID+D1~D6
可以比较直观的看出CAN诊断帧比LIN诊断帧在PDU单元数据上少了NAD的定义,因为物理地址可作为ID发送,不需要单独的节点地址定义。
三、升级协议
3.1 升级时序如下图所示
3.2 升级协议诊断帧数据定义
四、MCU端升级流程
MCU端flash分区如上图所示,boot为启动分区,app1为A分区,也是app启动运行的分区,app2为B分区,用于升级过程接收保存升级包数据的备份分区,data flash分区为用户数据保存区域和升级标志等信息保存区域。
MCU端接收升级数据包并写入B分区并累加CRC校验码,当升级包接收完成后计算的CRC校验码和PC端发送过来的校验码一致的话说明接收的数据包是完整的,写入升级标志置位、包总数和CRC等信息,并重启MCU。Boot启动时读取升级标志,包总数和CRC校验值,判断升级标志是否置位,如果置位则读取B分区内容并计算CRC校验值,如果计算的CRC校验值和保存的CRC校验值一致说明B分区数据完整无误。擦除A分区数据内容,将B分区数据拷贝到A分区。跳转到A分区运行。
五、PC端升级过程
上位机提供了本地OTA升级功能。用户可以在没有烧写工具的情况下通过CAN升级APP软件,升级界面如下图1所示。
其中“升级节点探测”功能是为了探测可升级的节点地址,为后续升级使用。如果探测到可升级的MCU节点,将在“探测节点地址列表”中显示。
在“节点地址”所在的编辑框直接填写节点地址。然后点击“加载升级文件”按钮选则需要升级的bin文件,Bin文件信息将在旁边的矩形框中显示。点击“开始升级”按钮开始进行升级。如果升级过程中出现错误,比如CRC校验错误等,可以再次点击“开始升级”按钮进行升级,升级过程比较慢,大概需要两三分钟。当所有的升级包都发送成功后会弹出对话框提示用户是否需要写入升级标志并重启MCU,如果用户点击取“取消”按钮,升级包数据仅仅保存在B分区,并不会更新到A分区,升级过程实际并没有完成。用户点击“确定”按钮才真正重启MCU将B分区数据拷贝到A分区,并从A分区启动运行程序。
注:有需要整套代码,包括MCU UDS LIN协议栈及上位机程序欢迎私信咨询。