基于NXP例程学习CAN UDS刷写流程

news2025/6/7 10:28:25

文章目录

    • 前言
    • 1.概述
      • 1.1 诊断报文
    • 2.协议数据单元(N_PDU)
      • 2.1 寻址信息(N_AI)
        • 2.1.1 物理寻址
        • 2.1.2 功能寻址
        • 2.1.3 常规寻址(Normal addressing)
        • 2.1.4 常规固定寻址(Normal fixed addressing)
        • 2.1.5 扩展寻址(Extended addressing)
        • 2.1.6 混合寻址(Mixed addressing)
      • 2.2 协议控制信息(N_PCI)
        • 2.2.1 单帧(SF)
        • 2.2.2 多帧
    • 3.诊断服务
      • 3.1 请求和响应
        • 3.1.1 流程图
        • 3.1.2 消息流格式
        • 3.1.3 抑制肯定响应
        • 3.1.4 NRC
      • 3.2 常见服务
        • DiagnosticSessionControl(诊断会话控制)($10)服务
          • 服务描述
          • 请求/响应
        • ECUReset(ECU 复位)($11)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • SecurityAccess(安全访问)($27)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • CommunicationControl(通信控制)($28)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • WriteDataByIdentifier(通过标识符写数据)($2E)服务
            • 服务描述
          • 请求消息
          • 响应消息
        • RoutineControl(例程控制)($31)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • RequestDownload(请求下载)($34)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • TransferData(传输数据)($36)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • RequestTransferExit(请求传输终止)($37)服务
          • 服务描述
          • 请求消息
          • 响应消息
    • 4.刷写流程
      • 4.1 预编程阶段
      • 4.2 编程阶段
        • 4.2.1 $31服务
      • 4.3 后编程阶段

前言

基于EcuBus-Pro实现CAN UDS升级

上文介绍了如何使用EcuBus-Pro实现CAN UDS升级的上位机,本文基于EcuBus-Pro监控的数据,详细介绍下S32K144官方CAN UDS Bootloader的流程。

笔者没有UDS的实战经验,所以文章内容是参考《GB/T 40822-2021》和一些网络上的培训资料完成,如果有不对的地方,还请帮忙评论区指出。

1.概述

通常车厂提高的DBC文件中有三类报文,如下所示:

  • 应用报文,用于多个ECU之间交互功能,比如执行开转向灯功能。
  • 诊断报文,用于Tester读取ECU端存储的故障信息,程序升级等。
  • 网络管理报文,用于协调多个ECU进行有序的休眠唤醒。

下文要介绍的CAN UDS刷写,使用的就是诊断报文。

1.1 诊断报文

Tester端和ECU端使用诊断报文传输的流程图如下:

通信流程图(来源于网络)

可以看到诊断报文的使用也是按照OSI模型来的,如下图所示:

CAN UDS的OSI模型(来源于网络)

2.协议数据单元(N_PDU)

按上文描述,诊断报文需要经过网络层进行组包拆包,所以需要了解网络层的协议格式,即N_PDU的组成,如下图所示。

PDU格式

其中,N_AI,N_PCI,N_Data的说明如下图所示。

PDU组成参数说明(来源于网络)

2.1 寻址信息(N_AI)

寻址方式按通信对象分为功能寻址和物理寻址;按地址格式分为常规寻址、常规固定寻址、扩展寻址、混合寻址四种方式。

另外,下文提到的SATA的意义如下:

  • 源地址(SA):发送节点地址
  • 目标地址(TA):接收节点地址
2.1.1 物理寻址

物理寻址,即Tester和ECU一对一通信,示例图如下:

物理寻址(来源于网络)

2.1.2 功能寻址

功能寻址,即Tester向多个ECU发出同一功能的诊断请求,示例图如下:

功能寻址(来源于网络)

2.1.3 常规寻址(Normal addressing)

常规寻址,使用11位CAN ID,将N_AI映射到消息帧的CAN ID区域,但是没有规定N_AI与CAN ID的具体映射关系,如下图所示。

常规寻址(来源于网络)

常规寻址是最常见的寻址方式,对于常规寻址:

  • 如果使用物理地址,每个ECU需要分配两个CAN ID,一个用于请求,一个用于响应。

物理-常规寻址(来源于网络)

  • 如果使用功能地址,同一个组的ECU共用一个CAN ID用于请求。

功能-常规寻址(来源于网络)

2.1.4 常规固定寻址(Normal fixed addressing)

常规固定寻址,使用29位CAN ID,与混合寻址编排方式类似,完整定义了N_AI如何映射到29位CAN ID,格式如下图所示。

常规固定寻址(来源于网络)

下文介绍的S32K1 CAN UDS升级流程,就是使用的这种寻址方式。

2.1.5 扩展寻址(Extended addressing)

扩展寻址,使用11位CAN ID,N_AI中的N_TA映射到CAN数据帧的第一个字节,其它域映射到CAN ID,格式如下图所示。

扩展寻址(来源于网络)

2.1.6 混合寻址(Mixed addressing)

混合寻址,仅用于远程诊断,格式如下图所示。

混合寻址-11位ID(来源于网络)

混合寻址-29位ID(来源于网络)

2.2 协议控制信息(N_PCI)

PCI的结构如下图所示,根据后续发送的N_Data长度分为单帧和多帧两种。

N_PCI结构(来源于网络)

2.2.1 单帧(SF)

当N_Data的长度在7个字节以内,选择单帧发送。

上图中的SF_DL代表N_Data的长度,<=7个字节,一个单帧的示例如下图:

单帧示例(来源于网络)

2.2.2 多帧

当N_Data的长度超过7个字节,需要选择多帧发送。一个多帧的示例如下图:

多帧示例(来源于网络)

多帧报文需要用到三种报文:

  • 第一帧FF,其中FF_DL代表N_Data的长度,>7个字节,<=4095个字节。单独的FF示例如下:

FF示例(来源于网络)

  • 连续帧CF,其中SN用于0-F循环计数。单独的CF示例如下:

CF示例(来源于网络)

  • 流控帧FC,相关的参数有FS、BS和STmin,参数说明和单独的FC示例如下:
参数含义
FS0继续发送。让发送方继续发送接下来的连续帧,表示接收方已经准备好了接收最大为BS数量的连续帧。
1等待。发送方等待下一帧流控帧并重置自己的计时。一般用于接收方没有处理完上一次接收到的连续帧。
2过载。发送方打算发送的数据长度超过了接收方的储存能力。
BS1~FF表示发送方在发送BS数值的连续帧之后,需要等待接收方的流控帧。
0表示不需要任何流控帧,直接发送全部数据。
STmin00~7F单位为ms
F1~F9表示0.1~0.9ms
0按照发送方最快的速度发送

FC示例(来源于网络)

3.诊断服务

N_Data和应用层的关系对应关系如下:

N_PDU映射到A_PDU

  • N_Data的第一个字节对应诊断服务ID
  • N_Data的第二个字节对应诊断服务的子功能或者数据参数(不具有子功能的诊断服务)

接下来介绍Tester和ECU基于诊断服务的交互方式,以及常见的诊断服务。

3.1 请求和响应

诊断服务的交互模式一般是是Tester发起服务请求,ECU端对服务进行响应。

3.1.1 流程图

诊断服务的请求和响应的流程图如下:

诊断服务流程图(来源于网络)

3.1.2 消息流格式

流程图中的消息流对应的格式如下图所示:

消息流格式

3.1.3 抑制肯定响应

有些时候为了提高传输效率,有些服务不回复肯定响应报文,即抑制肯定响应,通过设置请求消息流的子功能参数的bit7,如下图所示:

3.1.4 NRC

常见的NRC如下图所示,更多NRC的描述,查阅《GB/T 40822-2021》。

NRC

3.2 常见服务

下图是常见的服务以及支持的会话模式。

常见服务

下面详细介绍下S32K1官方CAN UDS升级例程使用到的几种服务。

DiagnosticSessionControl(诊断会话控制)($10)服务
服务描述

DiagnosticSessionControl(诊断会话控制)服务用于在服务端中启用不同的诊断会话。

请求/响应

请求/响应消息格式如下:

$10服务格式(来源于网络)

数据参数定义如下:

$10服务数据参数

该服务支持的NRC如下:
$10服务支持的NRC

ECUReset(ECU 复位)($11)服务
服务描述

客户端使用ECUReset(ECU 复位)服务来请求服务端复位。

该服务请求服务端根据嵌入在ECU 复位请求消息中的复位类型参数值的内容有效地执行服务端复位。可以在服务端中执行复位之前或之后发送ECU 复位肯定响应消息(如果需要)。建议在执行ECU 复位之前发送ECU 复位肯定响应消息。

请求消息

请求消息的定义如下:

请求消息定义

请求消息子功能的定义如下:

请求消息子功能定义

响应消息

肯定响应消息的定义如下:

肯定响应消息定义

支持的NRC如下:

支持的NRC

SecurityAccess(安全访问)($27)服务
服务描述

该服务的目的是提供访问数据和/或诊断服务的手段,这些服务由于保密、排放或安全的原因而受到限制。

该用于将例程或数据下载或上传到服务端和从服务端读取指定的内存位置的诊断服务,可能需要在SecurityAccess(安全访问)的情况下进行。

下载到服务端的非正常例程或数据可能会损坏电子设备或其他车辆部件,或者影响车辆排放、保密或安全标准的符合性。保密概念利用了种子和密钥之间的关系。

使用该服务的典型示例如下所示

  • 客户端请求“种子”;
  • 服务端发送“种子”;
  • 客户端发送“密钥”(与接收的种子配对);
  • 服务端响应“密钥”有效,并且它将自行解锁。

$27服务流程图

主机厂一般会设置不同的安全等级,用于执行后续不同的功能。安全级别切换的常见方式如下:

安全级别切换

请求消息

请求消息的定义如下:

请求消息的定义

子功能参数的定义如下:

子功能参数的定义

requestSeed(请求种子)值与sendKey(发送密钥)值具有固定关系:

  • “requestSeed=01”确定了“requestSeed=01”和“sendKey=02”之间的固定关系;
  • “requestSeed=03”确定了“requestSeed=03”和“sendKey=04”之间的固定关系。

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

支持的NRC如下:

支持的NRC

CommunicationControl(通信控制)($28)服务
服务描述

该服务的目的是开启/关闭服务端(例如应用程序通信消息)某些消息的发送和/或接收。

请求消息

请求消息的定义如下:

请求消息的定义

子功能参数的定义如下:

子功能参数的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

支持的NRC如下:

支持的NRC

WriteDataByIdentifier(通过标识符写数据)($2E)服务
服务描述

通过标识符写数据服务允许客户端向服务端中给定数据标识符指定的内部位置写入信息。

请求消息

请求消息的定义如下:

请求消息的定义

数据参数包含的值定义太多,文章篇幅有限,有兴趣的建议查看《GB/T 40822-2021》的附录C.1。

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

支持的NRC如下:

支持的NRC

RoutineControl(例程控制)($31)服务
服务描述

客户端使用RoutineControl(例程控制)服务执行指定的步骤的序列并且获得任何相关结果。

该服务具有较大灵活性,但一般用途包括擦除内存、重置或学习自适应数据、运行自测试、覆盖正常服务端控制策略、控制服务端值随时间变化以及预定义序列(比如关闭敞篷车顶)等。

客户端使用RoutineControl(例程控制)服务进行如下操作:

  • StartRoutine(启动例程);
  • StopRoutine(停止例程);
  • 请求例程结果。

使用2字节routineIdentifier(例程标识符)。

请求消息

请求消息的定义如下:

请求消息的定义

子功能参数的定义如下:

子功能参数的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

RequestDownload(请求下载)($34)服务
服务描述

客户端利用“requestDownload(请求下载)”服务启动客户端到服务端之间的数据传输(下载)。

服务端收到“requestDownload(请求下载)”请求消息后,应在其发送肯定响应消息之前采取必要行动接收数据。

请求消息

请求消息的定义如下:

请求消息的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

TransferData(传输数据)($36)服务
服务描述

客户端利用传输数据服务从客户端向服务端(下载)或从服务端向客户端(上传)传输数据。

请求消息

请求消息的定义如下:

请求消息的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息定义如下:

肯定响应消息定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

RequestTransferExit(请求传输终止)($37)服务
服务描述

客户端利用此服务终止客户端与服务端之间的数据传输(上传或下载)

请求消息

请求消息的定义如下:

请求消息的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息定义如下:

肯定响应消息定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

4.刷写流程

整个刷写流程分三步,分别是预编程阶段、编程阶段以及后编程阶段。

4.1 预编程阶段

预编程阶段主要做一些程序升级前的准备工作,包括禁用DTC设置以及非诊断通信等。

预编程阶段的流程图如下所示,左侧的标准步骤是必须要实现的。

预编程阶段流程图

从EcuBus-Pro抓取的该阶段的数据如下所示。

MCU例程没有DTC设置的功能,所以未使用$85服务关闭DTC设置。

预编程阶段数据log

4.2 编程阶段

编程阶段是对MCU程序进行升级的主要阶段。

编程阶段的流程图如下所示。

编程阶段流程图

从EcuBus-Pro抓取的该阶段的数据如下所示。

$36服务传输的数据量太大,下图隐藏了大量的传输数据。如果需要查看完整数据,可以去前文提供的gitee仓库查看log表格。

编程阶段数据log

4.2.1 $31服务

其它服务内容的实现细节,可以通过前文提到的EcuBus-Pro工程的脚本文件详细查看;关于例程控制($31)服务,下面简单描述下。

S32K1官方demo使用的$31服务包含了三种RoutineID,如下图所示。

$31服务RoutineID

三种RoutineID实现的功能如下图:

  • Routine=0xFF00,实现Flash擦除功能
  • Routine=0x0202,发送CRC校验码,用于确认传输数据的完整性,即传输过程中数据是否有丢包或被篡改。
  • Routine=0xFF01,编程依赖性检查,确认传输的固件是否合法有效,即上位机给过来的固件是否来源可靠,功能是否验证过。

$31服务-MCU端功能

4.3 后编程阶段

后编程阶段用于在MCU程序升级完成后进行硬件复位,以及将编程会话切换到默认会话。

后编程阶段的流程图如下所示。

后编程阶段流程图

从EcuBus-Pro抓取的该阶段的数据如下所示。

后编程阶段数据log


如果觉得这篇文章对你有用,帮忙给个一键三连!!!

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

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

相关文章

基于有效集MPC控制算法的直线同步电机simulink建模与仿真,MPC使用S函数实现

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统仿真参数 5.系统原理简介 6.参考文献 7.完整工程文件 1.课题概述 有效集算法通过迭代地选择一组 "有效" 约束&#xff0c;将约束优化问题转化为一系列无约束或等式约束优化问题。直线同步电机 (Linear Synch…

让敏感数据在流转与存储中始终守护在安全范围

在企业数字化运营浪潮中&#xff0c;企业内部应用服务器面临着非法访问、数据泄露等风险&#xff0c;如何全面守护应用服务器文件安全&#xff0c;让敏感数据在流转与存储中始终守护在安全范围&#xff1f; 服务器白名单让数据流转安全又高效 天 锐 蓝盾的服务器白名单功能既…

【Linux】find 命令详解及使用示例:递归查找文件和目录

【Linux】find 命令详解及使用示例&#xff1a;递归查找文件和目录 引言 find 是 Linux/Unix 系统中强大的文件搜索工具&#xff0c;用于在目录层次结构中递归查找文件和目录。它提供了丰富的搜索条件和灵活的操作选项&#xff0c;可以满足从简单到复杂的各种文件查找需求。 …

【论文阅读笔记】万花筒:用于异构多智能体强化学习的可学习掩码

摘要 在多智能体强化学习&#xff08;MARL&#xff09;中&#xff0c;通常采用参数共享来提高样本效率。然而&#xff0c;全参数共享的流行方法通常会导致智能体之间的策略同质&#xff0c;这可能会限制从策略多样性中获得的性能优势。为了解决这一关键限制&#xff0c;我们提出…

负载均衡LB》》HAproxy

Ubuntu 22.04 安装HA-proxy 官网 资料 # 更新系统包列表&#xff1a; sudo apt update # 安装 HAproxy sudo apt install haproxy -y # 验证安装 haproxy -v # 如下图配置 Haproxy 在这里插入代码片》》》配置完之后 重启 Haproxy sudo systemctl restart haproxy 补充几…

UE 5 和simulink联合仿真,如果先在UE5这一端结束Play,过一段时间以后**Unreal Engine 5** 中会出现显存不足错误

提问 UE5报错如图。解析原因 回答 你遇到的这个错误提示是&#xff1a; “Out of video memory trying to allocate a rendering resource. Make sure your video card has the minimum required memory, try lowering the resolution and/or closing other applications tha…

Rust 控制流

文章目录 Rust 控制流if 表达式循环实现重复用 loop 重复代码从循环返回值循环标签用于区分多层循环while 条件循环用 for 循环遍历集合 Rust 控制流 在大多数编程语言中&#xff0c;根据条件是否为真来运行某些代码&#xff0c;以及在条件为真时重复运行某些代码&#xff0c;是…

Python 3.11.9 安装教程

前言 记录一下Windows环境下Python解释器的安装过程。 安装过程 1、安装程序下载 打开Python官网&#xff1a; 点击Downloads&#xff0c;选择Windows&#xff1a; 页面中找到需要的3.11.9版本&#xff0c;点击Download Windows installer (64-bit)下载&#xff1a; 2、…

【各种主流消息队列(MQ)对比指南】

主流消息队列对比分析 一、核心指标对比 特性/消息队列RabbitMQKafkaRocketMQActiveMQPulsar协议支持AMQP, MQTT, STOMP自定义协议JMS/自定义协议JMS, AMQP, MQTT, STOMPMQTT, AMQP, STOMP单机吞吐量万级百万级十万级万级百万级延迟微秒级&#xff08;低吞吐&#xff09;毫秒…

PySpark、Plotly全球重大地震数据挖掘交互式分析及动态可视化研究

全文链接&#xff1a;https://tecdat.cn/?p42455 分析师&#xff1a;Yapeng Zhao 在数字化防灾减灾的时代背景下&#xff0c;地震数据的深度解析成为公共安全领域的关键议题。作为数据科学工作者&#xff0c;我们始终致力于通过技术整合提升灾害数据的应用价值&#xff08;点击…

如何让AI自己检查全文?使用OCR和LLM实现自动“全文校订”(可DIY校订规则)

详细流程及描述参见仓库&#xff08;如果有用的话&#xff0c;请给个收藏&#xff09;&#xff1a; GitHub - xurongtang/DocRevision_Proj: A simple project about how to revist docment (such as your academic paper) in a automatic way with the help of OCR and LLM.A…

DFT测试之TAP/SIB/TDR

TAP的作用 tap全称是test access port&#xff0c;是将jtag接口转为reset、sel、ce、ue、se、si、tck和so这一系列测试组件接口的模块。 jtag的接口主要是下面几个信号&#xff1a; 信号名称信号方向信号描述TCK&#xff08;测试时钟&#xff09;输入测试时钟&#xff0c;同…

【推荐算法】DeepFM:特征交叉建模的革命性架构

DeepFM&#xff1a;特征交叉建模的革命性架构 一、算法背景知识&#xff1a;特征交叉的演进困境1.1 特征交叉的核心价值1.2 传统方法的局限性 二、算法理论/结构&#xff1a;双路并行架构2.1 FM组件&#xff1a;显式特征交叉专家2.2 Deep组件&#xff1a;隐式高阶交叉挖掘机2.3…

数据库表中「不是 null」的含义

例图&#xff1a; 1.勾选了「不是 null」&#xff08;NOT NULL&#xff09;&#xff1a; 这个字段在数据库中必须有值&#xff0c;不能为空。也就是说&#xff0c;你插入数据的时候&#xff0c;必须给它赋值&#xff0c;否则插入会报错。 2.没有勾选「不是 null」&#xff…

Visual Studio问题记录

程序"xxx dotnet.exe"已退出&#xff0c;返回值为-2147450730 问deepseek&#xff1a;visual studio输出程序dotnet.exe已退出&#xff0c;返回值为-2147450730 dotnet.exe 编译时退出并返回错误代码 **-2147450730**&#xff08;十六进制 0x80008076&#xff09;&…

重启路由器ip不变怎么回事?原因分析与解决方法

在日常生活中&#xff0c;我们经常会遇到网络问题&#xff0c;而重启路由器是解决网络故障的常用方法之一。然而&#xff0c;有些用户发现&#xff0c;即使重启了路由器&#xff0c;自己的IP地址却没有变化&#xff0c;这让他们感到困惑。那么&#xff0c;重启路由器IP不变是怎…

实践篇:利用ragas在自己RAG上实现LLM评估②

文章目录 使用ragas做评估在自己的数据集上评估完整代码代码讲解1. RAG系统构建核心组件初始化文档处理流程 2. 评估数据集构建3. RAGAS评估实现1. 评估数据集创建2. 评估器配置3. 执行评估 本系列阅读&#xff1a; 理论篇&#xff1a;RAG评估指标&#xff0c;检索指标与生成指…

高精度滚珠导轨在医疗设备中的多元应用场景

在医疗行业不断追求高效、精准与安全的今天&#xff0c;医疗设备的性能优化至关重要。每一个精密部件都像是设备这个庞大“生命体”中的细胞&#xff0c;共同维持着设备的稳定运行。滚珠导轨&#xff0c;这一看似不起眼却功能强大的传动元件&#xff0c;正悄然在医疗设备领域发…

JavaScript性能优化实战:从核心原理到工程实践的全流程解析

下面我给出一个较为系统和深入的解析&#xff0c;帮助你理解和实践“JavaScript 性能优化实战&#xff1a;从核心原理到工程实践的全流程解析”。下面的内容不仅解释了底层原理&#xff0c;也结合实际工程中的最佳模式和工具&#xff0c;帮助你在项目中贯彻性能优化理念&#x…

【应用】Ghost Dance:利用惯性动捕构建虚拟舞伴

Ghost Dance是葡萄牙大学的一个研究项目&#xff0c;研究方向是探索人与人之间的联系&#xff0c;以及如何通过虚拟舞伴重现这种联系。项目负责人Cecilia和Rui利用惯性动捕创造出具有流畅动作的虚拟舞伴&#xff0c;让现实中的舞者也能与之共舞。 挑战&#xff1a;Ghost Danc…