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

article/2025/7/23 11:18:38

文章目录

    • 前言
    • 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.hkcw.cn/article/BEmTpIvIQM.shtml

相关文章

c++ 模板

测试代码。my_template.h头文件内容如下&#xff1a; #ifndef MY_TEMPLATE_HEADER_H #define MY_TEMPLATE_HEADER_H// 函数模板示例 函数模板的 T 作用域仅限于此函数 template<typename T> T my_max(T a, T b) {return (a > b) ? a : b; }// 类模板示例 类模板的 T…

HTML网页-练习float

划分 12个格子&#xff0c;第一栏为&#xff1a;人物简介&#xff1b;其他栏为人物名称&#xff1b; 使用float: left将格子左浮动。 设置格子背景颜色&#xff0c;字体颜色&#xff0c;鼠标放上去后的字体颜色和背景颜色。 <style>.title {width: 100%;overflow: hidd…

Express教程【003】:Express获取查询参数

文章目录 3、获取URL中携带的查询参数3.1 参数形式&#xff1a;查询字符串3.2 参数形式&#xff1a;动态参数3.3 参数形式&#xff1a;Json数据 3、获取URL中携带的查询参数 3.1 参数形式&#xff1a;查询字符串 1️⃣通过req.query对象&#xff0c;可以访问到客户端通过查询…

搭建最新版开源监控平台SigNoz踩的坑

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权并注明出处。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 一、前言 SigNoz 是一款开源应用程序性能监控工具&#xff0c;在往期相关文章&#xff08;文末有链接&#xff09;中…

ArcGIS应用指南:基于网格与OD成本矩阵的交通可达性分析

随着城市化进程的加速,交通系统的效率和公平性日益成为影响居民生活质量的关键因素之一。在这一背景下,如何科学评估城市区域内的交通可达性,成为了城市规划、交通管理和公共政策制定中的重要议题。作为中国东南沿海的重要港口城市,厦门以其独特的地理优势和快速的城市发展…

数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(下)

1. 数据架构的量子跃迁 1.1 从线性堆叠到立体网络 传统六层架构正在经历基因重组。某智能家居企业将数据流转路径重构为三维拓扑网络后&#xff0c;新品研发周期从18个月压缩至9个月。这个改造的核心在于打破数据层间的物理隔离&#xff0c;让原始数据流能直接触达决策中枢。…

HTML5实现简洁的端午节节日网站源码

HTML5实现简洁的端午节节日网站源码 前言一、设计来源1.1 网站首页界面1.2 端午由来界面1.3 节日活动界面1.4 传统美食界面1.5 民俗文化界面1.6 登录界面1.7 注册界面 二、效果和源码2.1 动态效果2.2 源代码 结束语 HTML5实现简洁的端午节节日网站源码&#xff0c;酷炫的大气简…

复旦提出自适应Reasoning方法ARM,“能屈能伸”

为什么需要“自适应推理”&#xff1f; LLM 虽然聪明&#xff0c;但有个“学霸病”——不管题目难易&#xff0c;都要写满解题过程。比如问“11&#xff1f;”&#xff0c;它可能从宇宙起源开始推导&#xff0c;这就是论文提到的“过思考&#xff08;overthinking&#xff09;”…

如何使用 Elastic 检测恶意浏览器扩展

作者&#xff1a;Aaron Jewitt 当你的 CISO 问你某个特定浏览器扩展是否曾经被安装在任何工作站上时&#xff0c;你能多快给出正确的答案&#xff1f;恶意浏览器扩展是一个重大威胁&#xff0c;许多组织却无法管理或检测它们。本文介绍了 Elastic 信息安全团队如何使用 osquery…

[网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结

文章目录 创建房间类创建房间类实现房间管理器 实现匹配器(3)验证匹配功能问题&#xff1a;匹配按钮不改变验证多开 小结 创建房间类 LOL&#xff0c;通过匹配的方式&#xff0c;自动给你加入到一个房间&#xff0c;也可手动创建游戏房间 这一局游戏&#xff0c;进行的“场所…

LangChain【3】之进阶内容

文章目录 说明一 LangChain Chat Model1.1 少量示例提示(Few-Shot Prompting)1.2 Few-Shot示例代码1.3 示例选择器&#xff08;Eample selectors&#xff09;1.4 ExampleSelector 类型1.5 ExampleSelector案例代码1.6 LangServe工具1.7 LangServe安装1.8 langchain项目结构1.9 …

LangChain-自定义Tool和Agent结合DeepSeek应用实例

除了调用LangChain内置工具外&#xff0c;也可以自定义工具 实例1&#xff1a; 自定义多个工具 from langchain.agents import initialize_agent, AgentType from langchain_community.agent_toolkits.load_tools import load_tools from langchain_core.tools import tool, …

探索JS数组新方法:

js数组新方法&#xff1a;Array.with()、Array.toSorted()、Array.toReversed() 和 Array.toSpliced() 在Javascript中数组作为引用类型&#xff0c;如果我们想在不修改原始数组的情况下执行splice, sort,reverse等方法&#xff0c;那么我们必须首先创建原始数组的副本&#x…

电子书阅读器:基于UDP的网络日志调试系统

目录 为什么要引入网络编程进行远程打印&#xff1f; 框架与管理 debug层结构 stdout.c netprint.c&#xff08;重头戏&#xff09; 明确两个问题&#xff1a;udp和server端的选择 核心机制 实现细节 debug_manager.c netprint_client.c 为什么要引入网络编程进行远程…

《HelloGitHub》第 110 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对开源感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

⼤模型驱动的DeepInsight Copilot在蚂蚁的技术实践

本文整理自潘兰天&#xff08;蚂蚁数据智能团队数据分析平台技术专家)在DA数智大会2025上海站的演讲实录。 本文围绕AI技术在数据分析领域的应用及DeepInsight Copilot产品展开。DeepInsight是一款蚂蚁长期深耕数据分析领域的BI产品&#xff0c;本文首先介绍了DeepInsight Copi…

小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)

导入工具包 rom langchain_core.tools import BaseTool from typing import Sequence, Optional, List from langchain_core.prompts import BasePromptTemplate import re from langchain_core.tools import tool from langchain_core.prompts.chat import (ChatPromptTempla…

在大型中实施访问控制 语言模型

大家读完觉得有帮助记得关注&#xff01;&#xff01;&#xff01; 抽象 在企业设置中&#xff0c;组织数据是隔离的、孤立的 并受到精心设计的访问控制框架的精心保护。 如果 LLM 对 siloed data serve 请求进行微调&#xff0c;用于下游任务&#xff0c; 来自具有不同访问权限…

边缘计算网关在管网压力远程调控中的通信协议配置

一、项目背景 在现代城市供水系统中&#xff0c;恒压供水是确保居民用水稳定的关键。传统的恒压供水系统通常依赖人工巡检和本地监控&#xff0c;这种方式存在实时性差、效率低、故障响应慢等问题。随着物联网技术的发展&#xff0c;某大型城市供水企业为了实现对供水系统的实…

51. N-Queens

目录 题目描述 方法一、回溯每次判断是否合法 方法二、回溯哈希 方法三、回溯位运算 题目描述 51. N-Queens 方法一、回溯每次判断是否合法 class Solution {vector<vector<string>> res;vector<string> chessboard; public:vector<vector<strin…