XCP 版本 1.1
第 1 部分 -- 概述
目录(摘要)
-
引言
-
0.1 XCP 协议家族
-
0.2 文档概述
-
0.3 定义和缩写
-
0.4 XCP 数据类型与 ASAM 数据类型的映射
-
-
XCP 特性
-
1.1 同步数据传输
-
1.1.1 同步数据传输模型(基本)
-
DAQ、STIM 和 ODT 概述
-
ODT 条目
-
对象描述表(ODT)
-
DAQ 列表
-
事件通道
-
-
1.1.2 同步数据传输模型(可选特性)
-
动态 DAQ 配置
-
高级特性(DAQ 配置存储与上电数据传输、主从同步、优先级、ODT 优化、位级激励)
-
-
1.1.3 同步数据传输方向
-
同步数据采集(DAQ)
-
同步数据激励(STIM)
-
-
-
1.2 测量模式
- 轮询、标准突发、改进突发、交替
-
1.3 旁路(BYP)
-
1.4 在线标定
-
1.5 Flash 编程
-
-
XCP 协议
- 拓扑、通信模型、状态机、保护处理、消息格式
-
性能限制
-
版本管理
0. 引言
0.1 XCP 协议家族
本文档基于 CAN 标定协议(CCP)2.1 版本的经验,并采纳了多家公司的反馈意见(Accurate Technologies Inc., Compact Dynamics GmbH, DaimlerChrysler AG, dSPACE GmbH, ETAS GmbH, Kleinknecht Automotive GmbH, Robert Bosch GmbH, Siemens VDO Automotive AG 和 Vector Informatik GmbH)。
XCP 规范文档描述了 CCP 的改进和通用化版本。通用化的协议定义作为协议家族的标准,称为 XCP (通用测量与标定协议,Universal Measurement and Calibration Protocol)。字母 "X" 代表该协议家族成员所使用的"各种"传输层,例如 XCP on CAN 、XCP on TCP/IP 、XCP on UDP/IP 、XCP on USB 等。

注意:XCP 不向后兼容现有的 CCP 实现。
0.2 文档概述
XCP 规范由 5 个部分组成,每个部分是一份独立的文档:
-
第 1 部分 "概述":概述 XCP 协议家族、XCP 特性和基本协议定义(本文档)。
-
第 2 部分 "协议层规范":定义独立于所用传输层的通用协议。
-
第 3 部分 "传输层规范":定义 XCP 协议如何通过特定传输层(如 CAN、TCP/IP、UDP/IP)传输。
-
第 4 部分 "接口规范":定义从 XCP 主设备到 ASAM MCD 2MC 描述文件的接口,以及用于计算 Seed & Key 算法和校验和的接口。
-
第 5 部分 "示例通信序列":给出使用 XCP 执行典型操作的示例序列。
本文档中未明确提及的任何内容均应视为实现特定的。
0.3 定义和缩写
| 缩写 | 描述 |
|---|---|
| A2L | ASAM 2MC 语言文件的扩展名 |
| AML | ASAM 2 元语言 |
| ASAM | 自动化与测量系统标准化协会 |
| BYP | 旁路(BYPassing) |
| CAL | 标定(CALibration) |
| CAN | 控制器局域网 |
| CCP | CAN 标定协议 |
| CMD | 命令(CoMmanD) |
| CS | 校验和(CheckSum) |
| CTO | 命令传输对象 |
| CTR | 计数器(CounTeR) |
| DAQ | 数据采集(Data AcQuisition) |
| DTO | 数据传输对象 |
| ECU | 电子控制单元 |
| ERR | 错误包(ERRor) |
| EVE | 事件包(EVEnt) |
| LEN | 长度(LENgth) |
| MCD | 测量、标定和诊断 |
| MTA | 存储器传输地址 |
| ODT | 对象描述表 |
| PAG | 分页(PAGing) |
| PGM | 编程(ProGraMming) |
| PID | 包标识符 |
| RES | 命令响应包(RESponse) |
| SERV | 服务请求包(SERVICE) |
| SPI | 串行外设接口 |
| STD | 标准(STanDard) |
| STIM | 数据激励包(STIMulation) |
| TCP/IP | 传输控制协议/互联网协议 |
| TS | 时间戳(Time Stamp) |
| UDP/IP | 统一数据协议/互联网协议 |
| USB | 通用串行总线 |
| XCP | 通用标定协议 |
0.4 XCP 数据类型与 ASAM 数据类型的映射
| XCP 数据类型 | ASAM 数据类型 |
|---|---|
| BYTE | A_UINT8 |
| WORD | A_UINT16 |
| DWORD | A_UINT32 |
| DLONG | A_UINT64 |
1. XCP 特性
XCP 提供以下基本功能:
-
同步数据采集
-
同步数据激励
-
在线存储器标定(读/写访问)
-
标定数据页面初始化和切换
-
用于 ECU 开发目的的 Flash 编程
XCP 提供以下可选的新功能:
-
多种传输层(CAN、以太网、USB 等)
-
块通信模式
-
交错通信模式
-
动态数据传输配置
-
带时间戳的数据传输
-
数据传输同步
-
数据传输优先级化
-
原子位修改
-
位级数据激励
与 CCP 2.1 相比,XCP 改进了以下功能:
-
兼容性和规范清晰度
-
效率和吞吐量
-
上电数据传输
-
数据页面冻结
-
自动配置
-
Flash 编程
XCP 的设计遵循以下原则:
-
最小化从设备资源消耗(RAM、ROM、运行时间)
-
高效通信
-
简化从设备实现
1.1 同步数据传输
1.1.1 同步数据传输模型(基本)
1.1.1.1 概述:DAQ、STIM 和 ODT

图1:ODT 列表组织结构
位于从设备存储器中的数据元素通过数据传输对象(DTO)进行传输:DAQ (从设备到主设备)和 STIM(主设备到从设备)。
对象描述表(ODT) 描述了同步数据传输对象与从设备存储器之间的映射关系。
同步数据传输对象由其 包标识符(PID) 标识,PID 标识了描述该同步数据传输对象内容的 ODT,其他7个字节所对应的地址 和 对应参数的长度。
1.1.1.2 ODT 条目
ODT 中的条目通过 地址 、地址扩展 、元素大小(以地址粒度 AG 为单位) 以及(对于表示位的元素)位偏移 来引用数据元素。
GRANULARITY_ODT_ENTRY_SIZE_x 确定了 ODT 条目所引用的数据元素的最小大小。
GRANULARITY_ODT_ENTRY_SIZE_x [BYTE] >= AG [BYTE]
地址和大小必须满足关于 GRANULARITY_ODT_ENTRY_SIZE_x 的对齐要求:
-
Address[AG] mod (GRANULARITY_ODT_ENTRY_SIZE_x[BYTE] / AG[BYTE]) = 0 -
SizeOf(element)[AG] mod (GRANULARITY_ODT_ENTRY_SIZE_x[BYTE] / AG[BYTE]) = 0
GRANULARITY_ODT_ENTRY_SIZE_x 的可能值为 {1, 2, 4, 8}。
ADDRESS_GRANULARITY 的可能值为 {1, 2, 4}。
必须满足:GRANULARITY_ODT_ENTRY_SIZE_x[BYTE] mod (ADDRESS_GRANULARITY[BYTE]) = 0
MAX_ODT_ENTRY_SIZE_x 参数表示 ODT 条目所描述元素大小的上限(以地址粒度为单位)。
SizeOf(element)[AG] <= MAX_ODT_ENTRY_SIZE_x[AG]
如果从设备仅支持大小为 BYTE 的元素,主设备必须将多字节数据元素拆分为单字节。
ODT 条目通过 ODT_ENTRY_NUMBER 引用。
1.1.1.3 对象描述表(ODT)
ODT 条目分组在 ODT 中。
-
如果 DAQ 列表是静态配置的,MAX_ODT_ENTRIES 指定该 DAQ 列表中每个 ODT 的最大条目数。
-
如果 DAQ 列表是动态配置的,
MAX_ODT_ENTRIES不固定,为 0。
对于每个 ODT,ODT 条目编号(ODT_ENTRY_NUMBER)从 0 重新开始:
ODT_ENTRY_NUMBER [0, 1, ... MAX_ODT_ENTRIES(DAQ list) - 1]
1.1.1.4 DAQ 列表
多个 ODT 可以分组为一个 DAQ 列表 。XCP 允许同时激活多个 DAQ 列表。每个 DAQ 列表的采样和传输由从设备中的独立事件触发(参见 SET_DAQ_LIST_MODE)。

图2:DAQ 列表组织结构
-
如果 DAQ 列表静态配置,MAX_ODT 指定该 DAQ 列表的 ODT 数量。
-
如果动态配置,
MAX_ODT不固定,为 0。
MAX_DAQ 是从设备中可用的 DAQ 列表总数,包括预定义的不可配置 DAQ 列表(由 GET_DAQ_LIST_INFO 中的 PREDEFINED 指示)和可配置的 DAQ 列表。
-
如果
DAQ_CONFIG_TYPE = dynamic,则MAX_DAQ = MIN_DAQ + DAQ_COUNT。 -
MIN_DAQ :预定义 DAQ 列表的数量,编号范围
[0, 1, ... MIN_DAQ - 1]。 -
DAQ_COUNT:动态分配的 DAQ 列表数量。
-
可配置 DAQ 列表的编号范围:
[MIN_DAQ, MIN_DAQ+1, ... MAX_DAQ - 1]。
对于每个 DAQ 列表,ODT 编号(ODT_NUMBER)从 0 重新开始。
在同一个 XCP 从设备中,DAQ 列表编号范围从 0 开始且必须连续:
DAQ_LIST_NUMBER [0,1,...MIN_DAQ-1] + [MIN_DAQ,...MAX_DAQ-1]
为了降低期望的传输速率,可对 DAQ 列表应用传输速率预分频器(参见 GET_DAQ_PROCESSOR_INFO 中的 PRESCALER_SUPPORTED 标志)。无降速时,预分频值必须为 1;降速时,预分频值大于 1。仅允许对 DIRECTION = DAQ 的 DAQ 列表使用预分频器。
允许定义不包含任何条目的"虚拟"DAQ 列表。
1.1.1.5 事件通道
XCP 允许同时激活多个 DAQ 列表。每个 DAQ 列表的采样和传输由从设备中的独立事件触发。
事件通道 是有效决定数据传输时序的通用信号源。
-
MAX_EVENT_CHANNEL:可用事件通道的数量。
-
对于每个事件通道,MAX_DAQ_LIST 表示可分配给该事件通道的最大 DAQ 列表数。
MAX_DAQ_LIST = 0x00表示该事件可用但当前无法使用;0xFF表示无限制。
XCP 允许事件通道的优先级化。该优先级是从设备的固定属性,因此是只读的。事件通道优先级为 FF 的具有最高优先级。
测量变量到事件通道的分配可以在 ASAM MCD 2MC 描述文件的 DAQ_EVENT 部分中控制,可以是固定或可变的:
-
固定分配 :需在测量变量处定义
FIXED_EVENT_LIST,工具无法更改。 -
可变分配 :可提供
AVAILABLE_EVENT_LIST(有效事件列表),若不存在则 ECU 提供的所有事件通道均可由工具分配。 -
默认分配 :可提供
DEFAULT_EVENT_LIST,工具可更改为不同分配。
如果定义了 AVAILABLE_EVENT_LIST,则 DEFAULT_EVENT_LIST 中的事件通道必须是该测量变量 AVAILABLE_EVENT_LIST 的子集。
1.1.2 同步数据传输模型(可选特性)
1.1.2.1 动态 DAQ 配置
对于可配置的 DAQ 列表,从设备可以具有关于 DAQ 列表数量、每个 DAQ 列表的 ODT 数量以及每个 ODT 的 ODT 条目数量的固定限制。
从设备也可以具备完全动态配置 DAQ 列表的能力。
可配置 DAQ 列表是静态还是动态配置,由 GET_DAQ_PROCESSOR_INFO 中 DAQ_PROPERTIES 的 DAQ_CONFIG_TYPE 标志指示。

图3:静态和动态 DAQ 列表配置
动态配置时,应用其他限制:
| 参数 | 静态 | 动态 |
|---|---|---|
| MAX_DAQ | 固定值 | MIN_DAQ + DAQ_COUNT |
| MAX_ODT | 固定值 | MAX_ODT_DAQ_ABS / MAX_ODT_STIM_ABS |
| MAX_ODT_ENTRIES | 固定值 | MAX_ODT_ENTRIES_ABS, MAX_ODT_ENTRIES_DAQ_ABS, MAX_ODT_ENTRIES_STIM_ABS |
动态 DAQ 列表配置通过命令 FREE_DAQ 、ALLOC_DAQ 、ALLOC_ODT 和 ALLOC_ODT_ENTRY 完成。这些命令允许在上述限制内动态分配 DAQ 列表、ODT 和 ODT 条目。
如果内存不足,返回负响应 ERR_MEMORY_OVERFLOW,此时整个 DAQ 列表配置无效。
动态配置时,主设备必须遵循特定顺序:
-
首先发送
FREE_DAQ。 -
然后通过
ALLOC_DAQ分配可配置的 DAQ 列表数。 -
接着通过
ALLOC_ODT为所有 DAQ 列表分配所有 ODT。 -
最后通过
ALLOC_ODT_ENTRY为所有 ODT 分配所有 ODT 条目。
如果顺序错误(例如在 ALLOC_ODT 后直接发 ALLOC_DAQ 而无 FREE_DAQ),从设备返回 ERR_SEQUENCE。

图4:静态和动态 DAQ 配置序列
1.1.2.2 高级特性
1.1.2.2.1 DAQ 配置存储与上电数据传输
将 DAQ 配置存储到非易失存储器在以下情况下有益:
-
在重复使用、未更改的测量配置中节省测量配置时间;
-
启用上电数据传输(RESUME 模式)。
XCP 上电数据传输(RESUME 模式)自 XCP 1.0 起可用。从 XCP 1.1.0 开始,也可以存储 DAQ 配置而不自动启动数据传输。
通过 START_STOP_DAQ_LIST(Select),主设备可选择要存储的 DAQ 列表。主设备需基于所选 DAQ 列表的当前配置计算 会话配置 ID ,内部存储,并发送给从设备(SET_REQUEST)。
如果设置了 STORE_DAQ_REQ_RESUME 或 STORE_DAQ_REQ_NO_RESUME 且满足条件,从设备将所有选中的 DAQ 列表保存到非易失存储器,同时存储会话配置 ID(GET_STATUS 返回)。这允许主设备验证自动启动的 DAQ 列表是否包含预期的配置。
存储时,从设备首先清除非易失存储器中可能已存在的任何 DAQ 配置。
STORE_DAQ_REQ 位在请求完成后由从设备复位,可能通过发送 EV_STORE_DAQ 事件包指示。
1.1.2.2.1.1 不带上电数据传输的 DAQ 配置存储
目的:支持更快地启动未更改的 DAQ 配置(DAQ/STIM)。
IF_DATA 中的 STORE_DAQ_SUPPORTED 条目指示从设备可以存储 DAQ 配置。

图5:不带启动的存储流程
可通过 SET_REQUEST (STORE_DAQ_REQ_NO_RESUME) 存储配置。主设备通过检查 GET_STATUS 返回的会话配置 ID 来检测是否存储了配置(非零表示存在)。
1.1.2.2.1.2 带上电数据传输的 DAQ 配置存储(RESUME 模式)
RESUME 模式是状态机的一个状态。目的是使从设备上电后直接自动开始数据传输(DAQ、STIM)。
GET_DAQ_PROCESSOR_INFO 中 DAQ_PROPERTIES 的 RESUME_SUPPORTED 标志指示从设备可设置为 RESUME 模式。

图6:带启动的存储流程
-
GET_STATUS可识别从设备是否处于 RESUME 模式。 -
GET_DAQ_LIST_MODE可识别 DAQ 列表是否属于 RESUME 模式使用的配置。 -
若设置
STORE_DAQ_REQ_RESUME,从设备内部将之前用START_STOP_DAQ_LIST(select)选中的 DAQ 列表的 RESUME 位置位。
RESUME 模式允许 DAQ 和 STIM 两种方向。
每次上电,从设备恢复 DAQ 列表并发送 EV_RESUME_MODE 事件包(包含会话配置 ID,若支持时间戳则包含当前时间戳)。
对于 DIRECTION = DAQ 的 DAQ 列表,从设备自动开始发送 DAQ 包;对于 DIRECTION = STIM 的 DAQ 列表,从设备自动准备接收 STIM 包,甚至在任何 XCP 命令发送之前。
RESUME 模式意味着数据传输仅在物理通信通道启动并运行后才开始。
主设备和从设备需记住发送 SET_REQUEST(STORE_DAQ_REQ_RESUME) 时使用的所有通信参数,上电后使用相同参数。
上电时从设备的解锁状态可能不同于发送存储请求时的状态。
1.1.2.2.2 主从同步
GET_DAQ_CLOCK 命令通过计算偏移量,提供同步主设备和从设备时钟的方法。
1.1.2.2.3 DAQ 列表优先级
XCP 允许 DAQ 列表的优先级化。DTO 的有限长度加上优先级机制,确保高优先级 DAQ 列表可以以可接受的延迟中断低优先级 DAQ 列表的传输。
1.1.2.2.4 ODT 优化
XCP 允许在 ODT 级别进行 DTO 优化。从设备实现可使用一个或多个特定拷贝例程,以充分利用 CPU 架构进行数据拷贝。优化可以最小化运行时间,或最大化有效数据传输速率,或两者兼有。
Optimization_Method 属性指示从设备使用的优化方法类型。主设备应根据此方法配置 ODT。Optimization_Method 是全局 DAQ 属性,位于 GET_DAQ_PROCESSOR_INFO 的 DAQ_KEY_BYTE 中。
定义的优化方法:
-
OM_DEFAULT:无特殊要求,考虑粒度(GRANULARITY_ODT_ENTRY_SIZE_x)和最大大小(MAX_ODT_ENTRY_SIZE_x)。
-
OM_ODT_TYPE_16:ODT 级使用类型特定拷贝例程,WORD (16 Bit) 为最大类型,同一 ODT 内所有条目应类型相同,考虑对齐和最大大小。
-
OM_ODT_TYPE_32:同上,DWORD (32 Bit) 为最大类型。
-
OM_ODT_TYPE_64:同上,DLONG (64 Bit) 为最大类型。
-
OM_ODT_ALIGNMENT:同一 ODT 内允许所有数据类型,但必须按对齐顺序排列(大类型在前,小类型在后)。
-
OM_MAX_ENTRY_SIZE:仅支持固定长度的 ODT 条目(例如 16 字节数据块),长度由 MAX_ODT_ENTRY_SIZE_x 定义。
如果 ODT 配置不符合请求的优化方法,从设备可返回 ERR_DAQ_CONFIG 表示无法处理,此时所有 DAQ 列表配置无效;也可容忍配置,但以非优化方式处理。
1.1.2.2.5 位级激励
GET_DAQ_PROCESSOR_INFO 中 DAQ_PROPERTIES 的 BIT_STIM_SUPPORTED 标志指示从设备支持位级数据激励。
WRITE_DAQ 的 BIT_OFFSET 字段允许传输表示位状态的数据激励元素:
-
对于
DIRECTION = DAQ的测量变量,关键字BIT_MASK描述用于提取单一位状态的掩码。 -
对于
DIRECTION = STIM的测量变量,关键字BIT_MASK描述要激励的位位置。
主设备需将 BIT_MASK 转换为 BIT_OFFSET(例如 Bit7 -> BIT_MASK=0x80 -> BIT_OFFSET=0x07)。
如果 BIT_OFFSET = FF,该字段可忽略,WRITE_DAQ 应用于以字节为单位表示的普通数据元素。如果 BIT_OFFSET 从 0x00 到 0x1F,ODT 条目描述表示位状态的元素,元素大小必须等于 GRANULARITY_ODT_ENTRY_SIZE_x,值为 0 表示位为 0,值 >0 表示位为 1。
1.1.3 同步数据传输方向
1.1.3.1 同步数据采集(DAQ)
通过 DIRECTION 标志,DAQ 列表可设置为同步数据采集模式。通过 PID(0x00 <= PID <= 0xFB)的 DAQ 包,从设备将 ODT 中定义的元素内容传输给主设备。
处理 ODT 时,当当前 ODT 中找到大小为 0 的元素或该 ODT 所有条目处理完毕,从设备进入下一个 ODT。处理 DAQ 列表时,当第一个 ODT 的第一个条目大小为 0 或该列表所有 ODT 处理完毕,进入下一个 DAQ 列表。
从设备必须一致地采样元素。当 DAQ 列表被触发时,从设备至少要对同一个 ODT 一致地采样(ODT 级一致性始终保证)。但采样和传输完整 DAQ 列表可能需要时间。
如果在新事件周期触发时前一周期的传输尚未完成,称为"过载(OVERLOAD) "情况。从设备可通过 DAQ_PROPERTIES 中的 OVERLOAD_x 标志指示过载。从设备对过载的反应是实现特定的。
通过 ASAM MCD 2MC 中事件通道定义的 CONSISTENCY DAQ ,从设备可指示该事件下同一 DAQ 列表的所有数据一致采样。CONSISTENCY EVENT 指示该事件下所有数据一致采样。
1.1.3.2 同步数据激励(STIM)
同步数据激励是同步数据采集的逆模式。通过 DIRECTION 标志,DAQ 列表可设置为同步数据激励模式。激励数据在 DTO 包中传输。ODT 描述 DTO 与从设备存储器的映射。通过 PID(0x00 <= PID <= 0xBF)的 STIM 包,主设备将 ODT 中定义的元素内容传输给从设备。STIM 处理器缓冲传入的数据激励包,当触发 DAQ 列表的事件发生时,缓冲数据被传送到从设备存储器。
1.2 测量模式
1.2.1 轮询(Polling)

图7:轮询模式
最简单的测量方法。每个测量值原则上通过单独的 XCP 命令由主设备请求。有效采样率取决于 XCP 从设备和主设备的性能。无时间戳机制,不同测量值之间无一致性。无需为从设备配置 DAQ 列表。命令:SHORT_UPLOAD (推荐)或 SET_MTA + UPLOAD。
1.2.2 同步数据传输,DIRECTION=DAQ,突发(Burst),标准

图8:标准突发模式
XCP 的标准测量模式使用优化方法读取 ECU 内部值。配置阶段,主设备通过定义 ODT 并分配给 DAQ 事件来指定所有关注数据。启动后,XCP 从设备独立于主设备,仅基于内部 DAQ 触发事件发送 ODT。
数据特征:ODT 一致性 (ODT 完整内容在同一时刻采样)。请求采样率的遵守取决于 XCP 从设备性能和完整 DAQ 消息的传输时间。可选支持时间戳。DAQ 过载是从设备生成的事件,通知主设备测量需求被违反。配置命令:SET_DAQ_LIST_MODE。
1.2.3 同步数据传输,DIRECTION=DAQ,突发,改进

图9:改进突发模式
基于标准模式,但使用单事件驱动的数据采样方法。数据特征:DAQ 一致性 (一个 DAQ 的所有 ODT 在同一时刻采样)。其他同标准突发。配置命令:SET_DAQ_LIST_MODE。
1.2.4 同步数据传输,DIRECTION=DAQ,交替(Alternating)

图10:交替模式
低性能的精简测量模式,仅用于显示 ECU 内部数据,消耗 ECU 资源极少。尽管所有 ODT 形式上分配给一个 DAQ 列表,但允许采样间隙且不报告,因此数据不合格用于测量。不允许时间戳。复用标准测量模式配置结构,但工作方式不同。每个 DAQ 事件采样一个 ODT,内部延迟不会导致过载事件。因此主设备不知道完整 DAQ 的真实刷新周期,仅 ODT 序列稳定。
配置命令:SET_DAQ_LIST_MODE ,使用 ALTERNATING 标志选择。注意:不能同时设置 ALTERNATING 和 TIMESTAMP 标志。
1.3 旁路(BYP)
旁路可通过同时使用同步数据采集和同步数据激励来实现。
旁路需要至少两个 DAQ 列表用于 ECU 和旁路工具之间的同步数据传输(一个方向 DAQ,一个方向 STIM)。需要专门用于旁路的事件通道,关键字 COMPLEMENTARY_EVENT_CHANNEL_NUMBER 可用于组合两个事件通道构建旁路光栅。

图11:旁路
两种方法:
-
无延迟:旁路函数的输入数据发送到旁路工具后,原始 ECU 函数调用前,输出变量在函数末尾激励,输出基于同一步骤输入。
-
有延迟(一个或多个采样步):输出基于前一步骤输入,通常 ECU 任务结束时发送输入数据,下一步骤 ECU 函数执行后刺激输出变量,用于慢速传输层。
1.3.1 旁路激活
ECU 代码支持旁路光栅称为旁路钩子,可能需要激活后才能使用(实现特定,建议通过 XCP 标定参数激活)。
1.3.2 合理性检查
从设备应对接收的激励数据执行合理性检查,边界和动作可通过标准标定设置。
1.3.3 数据一致性
若激励数据分多个 ODT 传输,从设备应缓冲所有 ODT,并在接收完毕后一致地激励数据。无延迟旁路时,从设备可能需要等待特定时间接收所有 ODT。超时时是否使用不一致、旧数据或默认数据由实现决定,可发送 EV_STIM_TIMEOUT 事件包。
1.3.4 故障检测
旁路要求每个采样步都收到所有激励数据。传输错误或通信中断时,从设备应识别不稳定旁路连接并采取行动,可发送 EV_SESSION_TERMINATED。
1.3.5 最小分离时间
从设备接收多个 ODT 可能需要时间间隔,参数 MIN_ST_STIM 用于向旁路工具指示。

图12:MIN_ST_STIM
1.4 在线标定
1.4.1 在线数据标定模型(基本)
1.4.1.1 概述:SECTOR、SEGMENT 和 PAGE

图13:标定数据组织
从设备存储器布局描述为连续物理空间,元素通过 40 位地址引用(32 位 XCP 地址 + 8 位地址扩展)。
-
物理布局 :使用 SECTOR(扇区) 描述,用于重编程(刷写)。
-
逻辑布局 :使用 SEGMENT(段) 描述,说明标定数据对象在存储器中的位置(起始地址和大小不需符合 SECTOR 限制)。
-
PAGE(页):每个 SEGMENT 可有多个 PAGE,描述相同地址的数据但属性不同(如不同值或读写权限)。
任何时候,对于每个 SEGMENT,ECU 控制算法只能访问一个 PAGE(ECU 访问活动页 );XCP 主设备也只能访问一个 PAGE(XCP 访问活动页)。两者可独立切换,每个 SEGMENT 独立切换。
1.4.1.2 逻辑布局:SEGMENT
SEGMENT 由 ASAM MCD2 关键字 MEMORY_SEGMENT 描述(包含名称、地址、大小、镜像段偏移等)。XCP 特定信息在 IF_DATA 部分。
每个 SEGMENT 有地址扩展,对该段内所有标定对象有效。XCP 通过 SEGMENT_NUMBER 引用段。同一从设备中,段编号从 0 开始且连续:[0, 1, ... 255]。
1.4.1.3 可访问性:PAGE
每个 SEGMENT 可有多个 PAGE,至少有一个 PAGE 0。从设备必须初始化所有 PAGE 的所有段。INIT_SEGMENT 的 PAGE 0 包含初始数据。
-
GET_CAL_PAGE:获取当前 XCP 和 ECU 访问的活动页。
-
ECU_ACCESS_x 标志:指示 ECU 是否能访问该页及访问条件(不同时/同时/不关心)。
-
XCP_READ_ACCESS_x / XCP_WRITE_ACCESS_x 标志:指示 XCP 主设备读写该页的条件。
每个 SEGMENT 中 PAGE_NUMBER 从 0 重新开始:PAGE_NUMBER(Segment j) [0, 1, ... 255]。
1.4.2 在线数据标定模型(可选特性)
1.4.2.1 标定数据页面切换
如果从设备支持 GET_CAL_PAGE 和 SET_CAL_PAGE,则支持页面切换。
-
GET_CAL_PAGE:请求当前活动页。 -
SET_CAL_PAGE:设置当前活动页(XCP 或 ECU 访问)。主设备完全控制页面切换,从设备不能自主切换。需遵守
XCP_ACCESS_TYPE和ECU_ACCESS_TYPE约束。
1.4.2.2 高级特性
1.4.2.2.1 标定数据页面冻结
GET_PAG_PROCESSOR_INFO 中 PAG_PROPERTIES 的 FREEZE_SUPPORTED 标志指示所有段可进入 FREEZE 模式。
-
SET_SEGMENT_MODE:选择要冻结的段。 -
GET_SEGMENT_MODE:识别段是否被选择冻结。 -
STORE_CAL_REQ(SET_REQUEST):请求从设备将标定数据保存到非易失存储器。对于 FREEZE 模式的每个段,从设备将当前 XCP 活动页保存到该页的INIT_SEGMENT的 PAGE 0。完成后复位
STORE_CAL_REQ位,可发送EV_STORE_CAL。
1.4.3 在线数据标定操作
1.4.3.1 寻址

图14:地址计算
从设备存储器布局为连续物理空间,元素通过 40 位地址引用。地址扩展取自当前引用地址所属的 SEGMENT。
MEMORY_SEGMENT 的地址范围描述主设备可生成文件的地址,编程后可使从设备正常运行。
检查 CHARACTERISTIC 是否属于某 MEMORY_SEGMENT 时,主设备取 CHARACTERISTIC 地址,应用 ECU_CALIBRATION_OFFSET 和近指针解引用,然后检查结果地址是否属于该段。
SET_MTA、SHORT_UPLOAD、SHORT_DOWNLOAD 使用的(目标)地址按上述计算,并应用 ADDRESS_MAPPING 从源地址映射到目标地址。地址映射可能因段的不同部分而不同。
1.4.3.2 主设备 - 从设备
从设备需支持所有由 SECTOR 或 SEGMENT 描述的地址范围的校验和计算。所有 XCP_ACCESS_ALLOWED 的 PAGE 均可计算校验和。
-
若 PAGE 可读 ,主设备可通过
UPLOAD、SHORT_UPLOAD(标准模式及块模式)访问。 -
若 PAGE 可写 ,主设备可通过
SHORT_DOWNLOAD、DOWNLOAD_MAX(标准模式)及DOWNLOAD、DOWNLOAD_NEXT(块模式)访问,还可使用MODIFY_BITS原子修改位。
1.4.3.3 页面 - 页面
若从设备有多个 PAGE,主设备可用 COPY_CAL_PAGE 将数据从一个 PAGE 复制到另一个(任意段的任意 PAGE,但可能存在限制,返回 ERR_PAGE_NOT_VALID、ERR_SEGMENT_NOT_VALID 或 ERR_WRITE_PROTECTED)。
1.5 Flash 编程
1.5.1 Flash 模型
1.5.1.1 物理布局:SECTOR

图15:绝对访问模式
物理布局由 SECTOR 描述,通过 SECTOR_NUMBER 引用,编号从 0 开始连续 [0, 1, ... 255]。
1.5.1.2 概述
Flash 过程大致分三步(视用例而定):
-
前期管理(如版本控制)
-
原始刷写过程(编程动作)
-
后期管理(如版本或校验和控制)
XCP 主要关注原始刷写过程,提供专用编程命令(不定义顺序,需项目特定的"编程流程控制"):
-
PROGRAM_START -
PROGRAM_CLEAR -
PROGRAM_FORMAT -
PROGRAM(循环,可选块传输) -
PROGRAM_VERIFY -
PROGRAM_RESET
XCP 支持两种 Flash 访问方法:绝对模式 和 功能模式,可混合使用。
1.5.1.3 绝对访问模式:按地址访问
图15(续):绝对访问模式
默认模式。前提:主设备已知 Flash 物理布局和要编程的数据地址。数据块通过 CTO 传输,从指定 MTA 开始编程到非易失存储器,MTA 后递增。可存在间隙(缺失地址允许)。
1.5.1.4 功能访问模式:按 Flash 区域访问

图16:功能访问模式
适用于两种用例:
-
主设备不需要内存映射信息和数据地址信息。
-
地址信息作为相对于下载软件的相对指针(从 0 开始),适用于压缩或加密数据。
数据块通过 CTO 传输,ECU 软件自动知道新 Flash 内容的起始地址(取决于 PROGRAM_CLEAR 命令)。MTA 作为块序列计数器,在主设备和服务器中计数。从设备收到 PROGRAM_FORMAT 时计数器初始化为 1,之后每个 PROGRAM 请求递增,溢出后从 0x00 重新开始。行为类似于 ISO 14229-1 和 ISO 15765-3(UDS 诊断协议)。
1.5.1.5 校验和控制与程序验证
刷写后进行版本控制,检查新内容是否适合。XCP 支持校验和控制(标准校验命令)及从设备内部测试例程。相关命令:BUILD_CHECKSUM、PROGRAM_VERIFY。
1.5.1.6 Flash 会话结束
整体编程序列结束由 PROGRAM_RESET 命令指示,从设备进入断开状态,通常执行硬件复位。相关命令:PROGRAM_RESET。
2. XCP 协议
2.1 拓扑

图17:XCP 拓扑
XCP 基本是 单主/单从 通信类型,所有通信由主设备发起,从设备响应。使用"软"主从原则:连接建立后,从设备可自主发送某些消息(事件、服务请求、DAQ)。主设备发送 STIM 消息不期望直接响应。
主设备建立通道时,与特定从设备建立连续、逻辑、明确的点对点连接。从设备驱动不能处理多连接。
XCP 不允许 "单主/多从"拓扑,主设备不能广播(仅 GET_SLAVE_ID on CAN 例外)。但允许"多个单主/单从"拓扑同时存在。
XCP 允许网关:主设备直接连接的网络称为主网络 ,通过网关间接连接的称为远程网络。网关需适配不同传输层的 Header 和 Tail。
2.2 XCP 通信模型
2.2.1 标准通信模型

图18:标准通信模型
连接状态下,每个请求包对应一个响应包或错误包。主设备在收到前一个请求响应之前不能发送新请求。
2.2.2 块传输通信模型

图19:主块传输

图20:从块传输
标准模式下一请求对应一个响应。为加速上传/下载/刷写,UPLOAD、SHORT_UPLOAD、DOWNLOAD、SHORT_DOWNLOAD、PROGRAM 可支持块传输(类似 ISO 15765-2)。
主块传输 :MASTER_BLOCK_MODE_SUPPORTED 指示主设备可使用。从设备可能有块大小和最小间隔限制(MIN_ST、MAX_BS),由 GET_COMM_MODE_INFO 获取。
从块传输 :SLAVE_BLOCK_MODE_SUPPORTED 指示从设备支持,主设备无限制。
块传输模式与交错模式互斥。
2.2.3 交错通信模型

图21:交错通信模型
标准模式下需等待响应。为加速,交错模式下主设备可在收到前一个响应前发送下一个请求。
INTERLEAVED_MODE_SUPPORTED 指示主设备可使用。从设备可能有队列大小限制(QUEUE_SIZE),由主设备遵守。与块传输互斥。
2.3 状态机

图22:XCP 从设备状态机
从设备启动时,检查非易失存储器中是否有 RESUME 模式可用的 DAQ 配置。若无,进入 DISCONNECTED 状态。
-
DISCONNECTED :无 XCP 通信,会话状态、DAQ 列表和保护状态位复位,仅响应
CONNECT(CAN 上还响应GET_SLAVE_ID)。 -
CONNECTED :
CONNECT建立连接,处理所有 XCP 命令并响应。
USER_DEFINED 模式 :主设备发送 CONNECT(USER_DEFINED) 告诉从设备进入特殊模式,不影响 XCP 驱动行为。超时规则不同:主设备连续发送直到收到确认,间隔 16,无需 SYNCH 等。

图23:CONNECT USER_DEFINED 和 NORMAL 典型用法
CONNECT(NORMAL) 正常启动通信。连接状态下收到新的 CONNECT 当作断开重连。
若启动时检测到 RESUME 配置,从设备进入 RESUME 状态,自动启动存储的 DAQ 列表。RESUME 状态下仅响应 CONNECT,保持 DTO 传输运行。
DISCONNECT 命令使从设备回到 DISCONNECTED。错误严重性 S0-S2 不改变状态,S3(致命错误)导致 DISCONNECTED。
2.4 保护处理
XCP 为测量/激励、标定、刷写提供保护,使用 Seed & Key 机制。密钥长度足够支持非对称算法。若 XCP 主设备成功计算安全访问算法,从设备允许访问相应命令。相关命令:GET_STATUS、GET_SEED、UNLOCK。
对于读取内存的命令(UPLOAD、SHORT_UPLOAD、BUILD_CHECKSUM)无法用标准安全机制保护,若从设备决定隐藏信息,返回 ERR_ACCESS_DENIED(与 ERR_ACCESS_LOCKED 不同,表示无法解锁)。
注意:必须始终可读取 XCP 从设备的 ID 信息(GET_ID)。
2.5 XCP 消息(帧)格式

图24:XCP 消息(帧)格式
XCP 消息始终在特定传输层(CAN、TCP/IP 等)的数据字段中传输。传输层需满足:消息长度和内容不变,顺序不变,不重复。
XCP 消息由 XCP 头部 、XCP 包 、XCP 尾部 组成。
-
XCP 包 :通用协议部分,包含 标识字段 、可选时间戳字段 和 数据字段(第 2 部分描述)。
-
XCP 头部和尾部 :依赖传输层,由 控制字段 组成(第 3 部分描述)。
3. 性能限制
3.1 通用性能参数
-
MAX_CTO:CTO 包最大长度(字节),范围 0x08 -- 0xFF。
-
MAX_DTO:DTO 包最大长度(字节),范围 0x0008 -- 0xFFFF。
(范围可能因传输层而更小)
3.2 DAQ/STIM 特定性能参数
MAX_EVENT_CHANNEL :事件通道数量,由 EVENT_CHANNEL_NUMBER 标识。
MAX_DAQ :DAQ 列表数量,由 DAQ_LIST_NUMBER 标识。MIN_DAQ 为预定义数量,DAQ_COUNT 为动态配置数量。
MAX_ODT_ENTRIES :ODT 最大条目数,ODT_ENTRIES_COUNT 为动态配置时的条目数。
3.2.1 DAQ 特定参数
-
MAX_ODT:ODT 最大数量,范围 0x00 -- 0xFC。
-
MAX_ODT_ENTRY_SIZE_DAQ:DAQ 条目大小上限。
-
ODT_COUNT:动态配置时 DAQ 列表的 ODT 数量。
-
ODT_NUMBER:ODT 编号,范围 0x00 -- 0xFB。
3.2.2 STIM 特定参数
-
MAX_ODT:同上,范围 0x00 -- 0xC0。
-
MAX_ODT_ENTRY_SIZE_STIM:STIM 条目大小上限。
-
ODT_COUNT:同上。
-
ODT_NUMBER:范围 0x00 -- 0xBF。
4. 版本管理
4.1 XCP 协议层版本号
第 2 部分描述独立于传输层的通用协议。协议层版本号为 16 位值:
-
若修改导致从设备驱动软件需要功能变更,高字节 递增(如修改现有命令参数或添加新命令)。
-
若修改无直接影响(如重述解释文本或修改 AML 描述),低字节 递增。
从设备在 CONNECT 响应中仅返回协议层版本号最高有效字节。
4.2 XCP 传输层版本号
第 3 部分描述特定传输层的控制字段和可能的附加包。每个传输层规范有独立的版本号(16 位)。规则同上。
从设备在 CONNECT 响应中仅返回当前传输层的版本号最高有效字节。