实现基于UDS LIN诊断协议的本地OTA升级

news2024/11/26 20:41:41


一、目标
在上篇文章LIN诊断实现MCU本地OTA升级_lin ota-CSDN博客中已经基于LIN诊断协议实现了通过PC端上位机对MCU进行本地的OTA升级,但是没有完全按照UDS协议实现。本篇将在上篇文章的基础上进行改进,实现基于UDS LIN诊断协议的本地OTA升级。本篇文章对实现的目的、需要用到的第三方工具、LIN诊断帧请查看LIN诊断实现MCU本地OTA升级_lin ota-CSDN博客 博客相应章节,本文不再赘述。本文对升级协议、MCU端升级过程以及PC端升级过程做详细说明。

二、升级协议

2.1 升级时序如下图所示

2.2 升级协议诊断帧数据定义

(1)切换扩展会话:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x100x03\\\\
切换到扩展会话:0x10(会话控制) ; 0x03(扩展会话)
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x500x03\\\\
(2)读取软件版本:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x030x220xFB0x88\\\
通过ID读取数据:  0x22(通过ID读取); 0xFB88(自定义读取软件版本号的DID) 。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x060x620xFB0x88XXYYZZ
软件版本号:XX.YY.ZZ
(3)停用DTC存储功能:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x850x02\\\\
停用DTC存储功能:  0x85(故障码控制设置);0x02(停止故障码存储)  。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020xC50x02\\\\
(4)切换到编程会话:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x100x02\\\\
切换到编程会话:0x10(会话控制) ; 0x02(编程会话)。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x500x02\\\\
(5)安全访问请求种子:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x270x01\\\\
安全访问请求种子:  0x27(安全访问);0x01(请求种子)  。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x670x01XXXXXXXX
XX XX XX XX为获取的安全种子
(6)安全访问验证秘钥:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x060x270x02YYYYYYYY
安全访问验证key:  0x27(安全访问);0x02(验证key)   YY YY YY YY:为获取的安全访问种子经过算法转换后的key 。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x670x02\\\\
(7)检查刷写条件:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x040x310x010x020x03\\
检查刷写前条件:  0x31(例程控制);0x01(启动例程);0x0203(自定义RID表示检查电压状态) 。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x040x710x010x020x03\\
(8)擦除升级分区:
PC端请求byte1(NAD)byte2(PCI)byte3(LEN)byte4(SID)byte5byte6byte7byte8
首帧MCU节点地址0x100x0d0x310xff0x000x000x44
续帧1MCU节点地址0x21XXXXXXXXYYYY
续帧2MCU节点地址0x22YYYY\\\\
擦除升级分区:  0x31(例程控制);0x01(启动例程);0xff00(自定义RID表示擦除升级分区);0x44(地址4字节,大小4字节);XX XX XX XX(4字节擦除起始地址);YY YY YY YY(4字节擦除分区大小) 。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x040x710x010xff0x00\\
(9)请求下载:
PC端请求byte1(NAD)byte2(PCI)byte3(LEN)byte4(SID)byte5byte6byte7byte8
首帧MCU节点地址0x100x0b0x340x000x44XXXX
续帧1MCU节点地址0x21XXXXYYYYYYYY
请求数据:  0x34(请求下载);0x00(没有压缩和加密算法);0x44(地址4字节,大小4字节);XX XX XX XX(4字节擦除起始地址);YY YY YY YY(4字节擦除分区大小) 。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x040x740x200x000x42\\
0x20(包长度2字节表示);0x0042(一包66字节,包括SID+包序号,也就是实际一包数据64字节)
(10)升级包数据指令:
PC端请求byte1(NAD)byte2(PCI)byte3(LEN)byte4(SID)byte5byte6byte7byte8
首帧MCU节点地址0x100x420x360x01D1D2D3
续帧1MCU节点地址0x21D4D5D6D7D8D9
续帧2MCU节点地址0x22D10D11D12D13D14D15
续帧3MCU节点地址0x23D16D17D18D19D20D21
续帧4MCU节点地址0x24D22D23D24D25D26D27
续帧5MCU节点地址0x25D28D29D30D31D32D33
续帧6MCU节点地址0x26D34D35D36D37D38D39
续帧7MCU节点地址0x27D40D41D42D43D44D45
续帧8MCU节点地址0x28D46D47D48D49D50D51
续帧9MCU节点地址0x29D52D53D54D55D56D57
续帧10MCU节点地址0x2AD58D59D60D61D62D63
续帧11MCU节点地址0x2BD64\\\\\
传输第1包数据:  0x36(传输数据);0x01(数据包序列号);D1~D64(64字节升级包数据),最后一包数据如果没有64字节则用0xFF填充 
MCU端应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x760x01\\\\
(11)传输退出:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x010x37\\\\\
请求传输退出:  0x37(传输退出)  。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x010x77\\\\\
(12)检查数据包完整性:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x060x310x010x020x02校验码高8位校验码低8位
检查升级数据包完整性:  0x31(例程控制);0x01(启动例程);0x0202(自定义RID表示检查数据包是否完整) ; crc_h/l(2字节CRC校验值)。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x040x710x010x020x02\\
(13)重启MCU指令:
PC端请求byte1(NAD)byte2(PCI)byte3(SID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x110x03\\\\
ECU复位:  0x11(复位); 0x03(软件复位)  。
MCU端肯定应答byte1(NAD)byte2(PCI)byte3(RSID)byte4byte5byte6byte7byte8
单帧MCU节点地址0x020x510x03\\\\
说明:byte6字节为错误码定义,参照升级错误码定义。

三、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升级功能。用户可以在没有烧写工具的情况下通过LIN升级APP软件,升级界面如下图1所示。

其中“升级节点探测”功能是为了探测可升级的节点地址,为后续升级使用。如果探测到可升级的MCU节点,将在“探测节点地址列表”中显示。

在“节点地址”所在的编辑框直接填写节点地址。然后点击“加载升级文件”按钮选则需要升级的bin文件,Bin文件信息将在旁边的矩形框中显示。点击“开始升级”按钮开始进行升级。如果升级过程中出现错误,比如CRC校验错误等,可以再次点击“开始升级”按钮进行升级,升级过程比较慢,大概需要两三分钟。当所有的升级包都发送成功后会弹出对话框提示用户是否需要写入升级标志并重启MCU,如果用户点击取“取消”按钮,升级包数据仅仅保存在B分区,并不会更新到A分区,升级过程实际并没有完成。用户点击“确定”按钮才真正重启MCU将B分区数据拷贝到A分区,并从A分区启动运行程序。

注:有需要MCU UDS LIN协议栈及上位机程序欢迎咨询。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1625780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第52题N皇后II

题目: 题解: struct hashTable {int key;UT_hash_handle hh; };struct hashTable* find(struct hashTable** hashtable, int ikey) {struct hashTable* tmp NULL;HASH_FIND_INT(*hashtable, &ikey, tmp);return tmp; }void insert(struct hashTabl…

nvm 使用教程

在任意目录中的空白处 按住Shift键不放,鼠标点击右键,在弹出的菜单中选择 “在此处打开 Powershell 窗口(S)”。 查看远程线上的nodejs版本 nvm ls available 查看自己安装的nodejs版本 nvm ls 切换nodejs版本号 nvm use 版本号 安装 xxx版本的nodej…

浅谈游戏机制

浅谈游戏机制 前言什么是游戏机制?机制组成机制类别结语 前言 最近在编写游戏开发文档的时候了解到游戏机制,第一次接触游戏机制的概念难免有些陌生,但感觉又跟常见,在网上查阅浏览了一些资料后了解到游戏机制还不止一个。 现在将…

Linux|Awk 变量、数字表达式和赋值运算符

引言 本部分[1]将深入学习 Awk 的高级应用,以应对更为复杂的文本或字符串过滤任务。将介绍包括变量、数值表达式和赋值运算符在内的 Awk 功能。 这些概念与你之前可能在诸如shell、C、Python等许多编程语言中接触过的概念并没有本质上的不同,所以你不必过…

【RAG 论文】Chain-of-Note:为 RAG 引入 CoT 让模型生成阅读笔记来提高面对噪音文档和未知场景的鲁棒性

论文:Chain-of-Note: Enhancing Robustness in Retrieval-Augmented Language Models ⭐⭐⭐ Tencent AI Lab, arXiv:2311.09210 文章目录 一、论文速读二、实现的细节2.1 Note Design2.2 Data Collection2.3 Model Training 三、实验结果3.1 QA Performance3.2 对 …

Python:解析pyserial串口通讯

简介:串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单&#…

全额退款20000,what?

接单的时候有多兴奋,退单的时候就有多落寞。今天我对客户全额退款了,跟踪了10天的项目正式结束。 这是我接单以来项目单价最高的一个项目,本来不太想接的,因为业务领域不擅长,又想挑战一下。兜兜转转找了几个人因为各种…

Python请求示例电商商品详情数据(API接口开发系列),从入门到实战

在电商系统中,商品详情数据通常通过API接口提供。以下是一个从入门到实战的Python请求示例,展示如何获取电商商品详情数据。 入门篇:理解API接口 首先,你需要了解API(应用程序接口)的基本概念。API允许不…

用Redis实现获取验证码,外加安全策略

安全策略 一小时内只能获取三次,一天内只能获取五次 Redis存储结构 代码展示 import cn.hutool.core.util.RandomUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; import org.spri…

JVM学习笔记(五)内存模型

目录 1、原子性 1.1 问题分析 1.2 解决方法 2、可见性 2.1 退不出的循环 2.2 解决办法 3、有序性 3.1 诡异的结果 3.2 解决办法 3.3 有序性理解 3.4 happens-before 4、CAS与原子类 4.1 CAS 4.2 乐观锁与悲观锁 4.3 原子操作类 5、synchronized 优化 5.1 轻量…

鸿蒙入门11-DataPanel组件

数据面板组件 用于将多个数据的占比情况使用 占比图 进行展示 参数 参数形式 : DataPanel( options:{ values: number[], max?: number, type?: DataPanelType } ) 参数名 参数类型 是否必填 默认值 参数描述 values number[] 是 - 数据值列表 最大支持…

Recommended Azure Monitors

General This document describes the recommended Azure monitors which can be implemented in Azure cloud application subscriptions. SMT incident priority mapping The priority “Blocker” is mostly used by Developers to prioritize their tasks and its not a…

zigbee cc2530的室内/矿井等定位系统RSSI原理

1. 定位节点软件设计流程 2. 硬件设计 cc2530 最小系统 3. 上位机 c# 设计上位机,通过串口连接协调器节点,传输数据到pc上位机,显示节点坐标信息 4. 实物效果 需要4个节点,其中一个协调器,两个路由器作为参考节点&a…

1分钟掌握 Python 函数参数

任何编程语言函数都是非常重要的一部分,而在进行函数调用时,了解函数的参数传递方式是非常有必要的。Python中支持哪些传参方式呢? Python中的传参方式是比较灵活的,主要包括以下六种: 按照位置传参按照关键字传参默…

第59篇:创建Nios II工程之控制LED<一>

Q:还记得第1篇吗?设计简单的逻辑电路,控制DE2-115开发板上LED的亮与熄灭,一行Verilog HDL的assign赋值语句即可实现。本期开始创建Nios II工程,用C语言代码控制DE2-115开发板上的LED实现流水灯效果。 A:在…

STL ——priority_queue的模拟实现与基本使用 | 仿函数的介绍| 容器适配器的介绍

了解priority_queue 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为…

JetBot手势识别实验

实验简介 本实验目的在JetBot智能小车实现手势识别功能,使用板卡为Jetson Nano。通过小车摄像头,识别五个不同的手势,实现小车的运动及灯光控制。 1.数据采集 连接小车板卡的Jupyterlab环境,运行以下代码块,配置数据…

Go Energy 实现的跨平台桌面(GUI)应用介绍

关于 Energy Energy是Go语言基于LCL和CEF开发的跨平台桌面应用框架 系统支持 Windows 系列 XP SP3 到 Windows 11, Linux,MacOS. 版本 当前版本2.x 底层动态链接库 liblcl LCL: Lazarus 跨平台 GUI LCL 组件库, 包含了大量的系统原生GUI控件, 多达几百个控件. 在…

快速体验 Llama3 的 4 种方式,本地部署,800 tokens/s 的推理速度真的太快了!

北京时间4月19日凌晨,Meta在官网上官宣了Llama-3,作为继Llama1、Llama2和CodeLlama之后的第三代模型,Llama3在多个基准测试中实现了全面领先,性能优于业界同类最先进的模型,你有没有第一时间体验上呢,这篇文…

DS:单链表的实现

欢迎各位来到 Harper.Lee 的编程学习小世界! 博主主页传送门:Harper.Lee的博客 我将在这里分享我的学习过程等心得 创作不易,码字不易,兄弟们养成先赞后看的好习惯哦! 想一同进步的uu,可以来后来找我哦&…