车载MCU CAN UDS刷写流程(新手自学笔记,欢迎指正)

本文详细描述了车载ECU的Bootloader流程,涉及UDS(统一诊断服务)中的3E服务、会话控制、请求种子、发送密钥、编程预条件检查、清除诊断信息等关键步骤,以及刷写过程和速度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考出处:

车载ECU的Bootloader流程 - 知乎

UDS基础知识介绍_uds功能寻址和物理寻址-优快云博客

https://download.youkuaiyun.com/download/weixin_42555769/88652927

13:50:36:160 0x709 3e 00

//3E-会话保持服务

这个服务的目的是确保诊断服务或者之前激活的通信还处在激活的状态,可以保持当前的非默认(Default Session)会话,通过周期地发送请求帧来阻止自动跳转回默认(Default Session)会话。

13:50:37:160 0x709 3e 00

13:50:37:167 0x789 7e 00

//肯定响应

zeroSubFunction = 00 肯定响应

详解文章:

UDS-3E服务_uds 3e服务-优快云博客

开始刷写:13:50:37:167

13:50:37:167 :--->准备进入Extended Session 

13:50:37:167 0x7df 10 03

13:50:37:178 0x789 50 03 00 32 01 f4                

//进入扩展对话

13:50:37:367 :--->准备进入Request Seed

13:50:37:367 0x709 27 01

13:50:37:379 0x789 67 01 04 47 27 13            //获取种子,计算密钥

13:50:37:379 :--->准备进入Send Key

13:50:37:381 0x709 27 02 9a c0 49 13

13:50:37:387 0x789 67 02                                //发送密钥

详解文章:【ISO14229_UDS_0x27服务详解】_27服务安全算法密钥78-优快云博客

13:50:37:387 :--->准备进入Check Programming Precondition

13:50:37:387 0x709 31 01 df fd

13:50:37:397 0x789 71 01 df fd 00

//Bootloader会计算所有下载数据的校验和,此校验和将于31服务发送的Data进行比较。如果相同则认为数据可用。

13:50:37:397 :--->准备进入DTC Setting Type=Off

13:50:37:397 0x7df 85 02

13:50:37:407 0x789 c5 02                                    //ECU应停止诊断故障码设置

参考文章:【车载开发系列】UDS诊断---控制DTC设置($0x85)_关闭dtc存储时发送报文-优快云博客

13:50:37:598 :--->准备进入Disable Non Diagnostic Communication

13:50:37:598 0x7df 28 01 01

13:50:37:608 0x789 68 01

                                                                               //Disable应用报文收发

13:50:37:798 :--->准备进入Program Session

13:50:37:798 0x709 10 02

13:50:37:818 0x789 7f 10 78

13:50:37:925 0x789 50 02 00 32 01 f4

                                                                                //通过10 02切换到ProgrammingSession。

详解文章:

UDS统一诊断服务【一】诊断会话控制0X10服务_uds诊断会话切换-优快云博客

13:50:37:925 :--->准备进入Request Seed

13:50:37:925 0x709 27 05

13:50:37:932 0x789 67 05 00 01 cb 91

//请求种子

13:50:37:932 :--->准备进入Send Key

13:50:37:932 0x709 27 06 2d e7 76 dc

13:50:37:939 0x789 67 06

//发送密钥

13:50:37:939 :--->准备进入Erase Memory

13:50:37:939 0x709 31 01 ff 00 44 01 00 00 10 00 1c a8 68

13:50:37:971 0x789 7f 31 78

13:50:39:908 0x789 7f 31 78

13:50:42:877 0x789 7f 31 78

13:50:45:846 0x789 71 01 ff 00

//擦除RAM内的程序

13:50:45:849 :--->准备进入Request Download                

//通过34、36、37服务下载APP程序,即最终的mcu程序。

13:50:45:849 0x709 34 00 44 01 00 00 10 00 1c a8 68

13:50:45:861 0x789 74 20 0f fa

13:50:45:861 序号:1 长度(Bytes):4088

13:50:45:861 0x709 36 01

13:50:46:456 0x789 7f 36 78

13:50:46:471 0x789 76 01

13:50:46:471 序号:2 长度(Bytes):4088

13:50:46:471 0x709 36 02

13:50:47:067 0x789 7f 36 78

13:50:47:080 0x789 76 02

13:50:47:080 序号:3 长度(Bytes):4088

13:50:47:080 0x709 36 03

13:50:47:674 0x789 7f 36 78

13:50:47:699 0x789 76 03

//此处省略刷写内容。

13:55:28:900 序号:458 长度(Bytes):4088

13:55:28:900 0x709 36 ca

13:55:29:494 0x789 7f 36 78

13:55:29:518 0x789 76 ca

13:55:29:518 序号:459 长度(Bytes):4088

13:55:29:518 0x709 36 cb

13:55:30:111 0x789 7f 36 78

13:55:30:136 0x789 76 cb

13:55:30:136 序号:460 长度(Bytes):1728

13:55:30:136 0x709 36 cc

13:55:30:393 0x789 7f 36 78

13:55:30:403 0x789 76 cc

13:55:30:403 :--->准备进入Request Transfer Exit

13:55:30:403 0x709 37 01

13:55:30:429 0x789 7f 37 78

13:55:32:060 0x789 77 01 7b c6

//Upload Download functional unit总共定义了5个诊断服务,分别是:

RequestDownload (0x34):客户端向服务器请求下载数据

RequestUpload (0x35)客户端向服务器请求上传数据

TransferData(0x36) 客户端向服务器传数据(下载),或者服务器向客户端传数据(上传)

RequestTransferExit(0x37)数据传输完成,请求退出

RequestFileTransfer(0x38) 传输文件的操作,可以用于替代上传下载的服务。

        引用出处:统一诊断服务 (Unified diagnostic services , UDS) (七) - 程序员大本营

13:55:32:060 :--->准备进入Check Programming Integrity

13:55:32:060 0x709 31 01 df ff

13:55:32:088 0x789 7f 31 78

13:55:32:259 0x789 7f 31 78

13:55:32:402 0x789 7f 31 78

13:55:32:467 0x789 71 01 df ff 00

//通过31服务检查APP程序的数据一致性和完整性。

13:55:32:467 :--->准备进入Check Programming Dependencies

13:55:32:467 0x709 31 01 ff 01

13:55:32:494 0x789 7f 31 78

13:55:32:526 0x789 71 01 ff 01 00

//通过31服务请求目标ECU运行一个例程,检查所有下载的软件部分的依赖关系。

13:55:32:526 :--->准备进入Hard Reset

13:55:32:526 0x709 11 01

13:55:32:532 0x789 51 01

13:55:37:532 :--->准备进入Default Session

13:55:37:532 0x7df 10 01

13:55:37:545 0x789 50 01 00 32 01 f4

//进入默认会话

13:55:37:732 :--->准备进入Clear Diagnostic Information

13:55:37:732 0x709 14 ff ff ff

13:55:37:774 0x789 7f 14 78

13:55:38:034 0x789 54

//清除诊断信息

参考文章:

汽车UDS诊断之清除诊断信息服务(0x14)深度剖析_cdtcipr-优快云博客

刷写完成:13:55:38:622

刷写总耗时:301s

刷写App平均速度:51.57 kbps

### 优化CAN协议刷写速度的技术方案 为了优化CAN协议的刷写速度,可以从硬件和软件两个方面入手。以下是一些关键点和技术细节: #### 1. 使用CAN FD代替传统CAN CAN FD(Flexible Data-rate)是一种扩展的CAN协议,允许更高的比特率和更大的数据帧长度。通过使用CAN FD,可以显著提高数据传输效率,从而加快刷写速度[^2]。 ```python # 示例:配置CAN FD控制器 import can bus = can.Bus(interface='socketcan', channel='can0', fd=True) ``` #### 2. 减少通信延迟 在UDS Bootloader刷写过程中,减少每次交互的确认时间可以有效提升整体性能。可以通过调整超时参数或使用批量传输模式来减少延迟[^3]。 ```python # 示例:设置CAN消息超时时间 bus.send(msg, timeout=0.1) # 设置较短的超时时间 ``` #### 3. 实现断点续传功能 断点续传不仅可以提高刷写的可靠性,还可以避免因网络中断导致的重复传输。通过记录和读取断点信息,可以在出现异常时快速恢复刷写过程[^4]。 ```python # 示例:实现断点续传逻辑 def read_breakpoint(bus): msg = bus.recv() if msg.arbitration_id == BREAKPOINT_ID: return msg.data[0] ``` #### 4. 提高ECU内存管理效率 对于嵌入式系统开发工程师来说,合理划分ECU内存并优化刷写颗粒度是关键。例如,将刷写内存划分为10%等量的部分,每完成一部分即写入断点信息,这有助于在出现问题时快速定位并恢复[^4]。 #### 5. 利用Python语言实现高效刷写 随着智能电动汽车行业的发展,Python语言因其易用性和强大的库支持,逐渐成为实现Bootloader刷写的主流工具。通过编写高效的Python脚本,可以进一步优化刷写流程[^5]。 ```python # 示例:使用Python实现CAN总线UDS Bootloader刷写 import cantools db = cantools.database.load_file('uds.dbc') message = db.get_message_by_name('DiagnosticMessage') data = message.encode({'Data': [0x01, 0x02, 0x03]}) bus.send(can.Message(arbitration_id=message.frame_id, data=data)) ``` #### 6. 调整刷写策略 根据具体的ECU硬件特性,调整刷写策略以适应不同的场景。例如,对于支持A/B分区的ECU,可以选择先刷写到备用分区,然后切换活动分区,从而实现无感刷写。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值