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

文章目录

    • 前言
    • 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.pswp.cn/news/907594.shtml

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

相关文章

近期手上的一个基于Function Grap(类AWS的Lambda)小项目的改造引发的思考

函数式Function是云计算里最近几年流行起来的新的架构和模式&#xff0c;因为它不依赖云主机&#xff0c;非常轻量&#xff0c;按需使用&#xff0c;甚至是免费使用&#xff0c;特别适合哪种数据同步&#xff0c;数据转发&#xff0c;本身不需要保存数据的业务场景&#xff0c;…

什么是 SQL 注入?如何防范?

什么是 SQL 注入?如何防范? 1. SQL 注入概述 1.1 基本定义 SQL 注入(SQL Injection)是一种通过将恶意SQL 语句插入到应用程序的输入参数中,从而欺骗服务器执行非预期SQL命令的攻击技术。攻击者可以利用此漏洞绕过认证、窃取数据甚至破坏数据库。 关键结论:SQL 注入是O…

高德地图应用OceanBase单元化构建下一代在线地图服务

IEEE International Conference on Data Engineering (ICDE) 是数据库和数据工程领域的顶级学术会议之一&#xff08;与SIGMOD、VLDB并成为数据库三大顶会&#xff09;&#xff0c;自1984年首次举办以来&#xff0c;每年举办一次。ICDE涵盖广泛的主题&#xff0c;包括数据库系统…

Vue3中Element-Plus中el-input及el-select 边框样式

如果不需要显示下边框&#xff0c;纯无边框直接将 【border-bottom: 1px solid #C0C4CC; 】注掉或去掉即可。 正常引用组件使用即可&#xff0c;无须自定义样式&#xff0c;最终效果CSS样式。 <style scoped> /* 输入框的样式 */ :deep(.el-input__wrapper) { box-sha…

如何做好一份技术文档:从信息孤岛到知识图谱的进阶之路

如何做好一份技术文档&#xff1a;从信息孤岛到知识图谱的进阶之路 在软件开发的漫长征程中&#xff0c;技术文档如同隐藏在代码丛林中的路标&#xff0c;不仅指引着开发团队的前行方向&#xff0c;更在产品迭代的岁月里构筑起知识传承的桥梁。一份优质的技术文档&#xff0c;既…

Docker Compose使用自定义用户名密码启动Redis

通常我们使用下面的命令来启动 redis 容器&#xff0c;此时连接 Redis 的时候是不需要用户认证的 sudo docker run -d --name my-redis -p 6379:6379 redis此时我们可以使用 redis-server --requirepass "mypassword" 来指定默认用户&#xff08;default&#xff09…

1.什么是node.js、npm、vue

一、Node.js 是什么&#xff1f; &#x1f63a; 定义&#xff1a; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;让你可以在浏览器之外运行 JavaScript 代码&#xff0c;主要用于服务端开发。 &#x1f63a;从计算机底层说&#xff1a;什么是“运…

如何在 Vue.js 中集成 Three.js —— 创建一个旋转的 3D 立方体

在这篇文章中&#xff0c;我将向大家展示如何将 Three.js 与 Vue.js 结合&#xff0c;创建一个简单的 3D 场景&#xff0c;并展示一个旋转的立方体。通过这个简单的示例&#xff0c;你将学习到如何在 Vue 项目中集成 Three.js&#xff0c;以及如何创建动态的 3D 内容。 1. 安装…

DeepSeek‑R1-0528 重磅升级:蚂蚁百宝箱免费、无限量调用

DeepSeek‑R1-0528 重磅升级&#xff1a;蚂蚁百宝箱免费、无限量调用 端午假期前一天&#xff0c;DeepSeek‑R1 更新到了 0528 版本&#xff01; 官方说明&#xff1a;0528 版本在深度思考与推理能力方面显著增强——在数学、编程与通用逻辑等多项基准测评中&#xff0c;表现已…

RS232转Profinet网关在检漏仪与西门子PLC里的应用

RS232转Profinet网关在检漏仪与西门子PLC里的应用 在工业自动化和控制领域&#xff0c;设备间的高效通信至关重要。RS232转Profinet网关作为一种关键的转换工具&#xff0c;能够将传统的RS232接口设备接入现代化的Profinet网络&#xff0c;从而实现数据的无缝传输和设备的远程…

jenkins-jenkins简介

一、简介 jenkins是一个可扩展的持续集成引擎。持续集成&#xff0c;也就是通常所说的CI&#xff08;Continues Integration&#xff09;&#xff0c;可以说是现代软件技术开发的基础。持续集成是一种软件开发实践&#xff0c; 即团队开发成员经常集成他们的工作&#xff0c;通…

vue发版html 生成打包到docker镜像进行发版

将Vue项目打包成Docker镜像部署主要分为以下几个步骤&#xff1a; 1. Vue项目打包‌ 执行npm run build生成dist文件夹&#xff0c;包含静态资源文件 注意检查index.html中资源引用路径是否正确&#xff08;避免绝对路径问题&#xff09; 2. 编写Dockerfile Copy Code FROM…

扫地机器人苦寻新引擎,大疆们却已攻入腹地

原创 科技新知 前沿科技组 作者丨江篱 编辑丨樱木、九黎 竞争激烈的扫地机器人赛道&#xff0c;迎来了新玩家。 据近日相关报道&#xff0c;大疆扫地机器人产品已开始量产&#xff0c;预计将于6月份发布。消息称大疆研发扫地机器人已超过四年&#xff0c;即将上市的产品是扫…

【C++】22. 红黑树封装实现Mymap和Myset

上一章节我们实现了红黑树&#xff0c;这一章节我们就用红黑树封装来实现一个我们自己的map和set 1. 源码及框架分析 SGI-STL 3.0版本的源代码中&#xff0c;map和set的实现主要分布在若干头文件中&#xff0c;这些头文件构成了这两个容器的完整实现架构&#xff1a; 核心头文…

02_redis分布式锁原理

文章目录 一、redis如何实现分布式锁1. 使用 SETNX 命令2. 设置过期时间3. 释放锁4. 注意事项5. 示例代码二、Java中分布式锁如何设置超时时间1. Redis分布式锁2. 基于Zookeeper的分布式锁3. 基于数据库的分布式锁注意事项一、redis如何实现分布式锁 Redis 实现分布式锁是一种…

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方法

酷派Cool系列主打低端市场&#xff0c;系统无任何GMS程序&#xff0c;也不支持直接开启或者安装谷歌服务等功能&#xff0c;对于国内部分经常使用谷歌服务商店的小伙伴非常不友好。涉及机型有酷派Cool20/Cool20S /30/40/50/60等旗下多个设备。好在这些机型运行的系统都是安卓11…

技术为器,服务为本:AI时代的客服价值重构

在智能化浪潮中&#xff0c;大语言模型的出现为客户服务行业注入了全新动能。然而技术创新的价值不在于技术本身&#xff0c;而在于其赋能服务的深度与广度。AI对于我们来说&#xff0c;如同发动机之于汽车&#xff0c;重要的不是引擎参数&#xff0c;而是整车带给用户的驾驶体…

技术创新如何赋能音视频直播行业?

在全球音视频直播行业的快速发展中&#xff0c;技术的持续创新始终是推动行业进步的核心动力。作为大牛直播SDK的开发者&#xff0c;我很荣幸能分享我们公司如何从产品的维度出发&#xff0c;精准把握市场需求&#xff0c;并不断推动产品的发展&#xff0c;以满足不断变化的行业…

Linux线程池(下)(34)

文章目录 前言一、v3版本二、单例模式概念特点简单实现 三、其余问题STL线程安全问题智能指针线程安全问题其他锁的概念 总结 前言 加油&#xff01;&#xff01;&#xff01; 一、v3版本 「优化版」&#xff1a;从任务队列入手&#xff0c;引入 「生产者消费者模型」&#xff…

Netty 实战篇:Netty RPC 框架整合 Spring Boot,迈向工程化

本文将基于前面构建的 RPC 能力&#xff0c;尝试将其与 Spring Boot 整合&#xff0c;借助注解、自动扫描、依赖注入等机制&#xff0c;打造“开箱即用”的 Netty RPC 框架&#xff0c;提升开发效率与工程规范。 一、为什么要整合 Spring Boot&#xff1f; 手动 new 实例、写注…