CAN/CANFD
CCP/UDS
Bootloader/OTA
ECU/VCU/FCU
Simulink/ECUCoder
Ethernet
Hardware
Download
上一篇
下一篇
CCP/XCP指令参考表
一.CCP命令代码简介
二.CCP基础命令
-1.连接命令(CONNECT)
-2.获取CCP协议版本
-3.交换站标识符(EXCHANGE_ID)
-4.设置MTA地址(SET_MTA)
-5.数据下载(DNLOAD)
-6.数据上传(UPLOAD)
-7.获取DAQ列表大小
-8.设置DAQ列表指针
-9.写入DAQ列表(WRITE_DAQ)
-10.开始/终止数据上传
-11.断开(DISCONNECT)
三.CCP可选命令
-1.GET_SEED与UNLOCK
-2.六字节数据下载(DNLOAD_6)
-3.数据短上传(SHORT_UP)
-4.选择标定数据页
-5.设置与获取当前通信状态
-6.建立checksum表
-7.清空内存(CLEAR_MEMORY)
-8.PROGRAM与PROGRAM_6
-9.内存转移(MOVE)
-10.连接状态测试(TEST)
-11.获取处于激活状态下的标定页
-12.开始/停止同步数据传输
-13.诊断服务与操作服务
四.XCP指令参考表
回到顶部
CCP/XCP指令参考表
一.CCP命令代码简介
二.CCP基础命令
-1.连接命令(CONNECT)
-2.获取CCP协议版本
-3.交换站标识符(EXCHANGE_ID)
-4.设置MTA地址(SET_MTA)
-5.数据下载(DNLOAD)
-6.数据上传(UPLOAD)
-7.获取DAQ列表大小
-8.设置DAQ列表指针
-9.写入DAQ列表(WRITE_DAQ)
-10.开始/终止数据上传
-11.断开(DISCONNECT)
三.CCP可选命令
-1.GET_SEED与UNLOCK
-2.六字节数据下载(DNLOAD_6)
-3.数据短上传(SHORT_UP)
-4.选择标定数据页
-5.设置与获取当前通信状态
-6.建立checksum表
-7.清空内存(CLEAR_MEMORY)
-8.PROGRAM与PROGRAM_6
-9.内存转移(MOVE)
-10.连接状态测试(TEST)
-11.获取处于激活状态下的标定页
-12.开始/停止同步数据传输
-13.诊断服务与操作服务
四.XCP指令参考表
回到顶部
# CCP/XCP命令参考表 ## 一.CCP命令代码简介
CCP协议共规定了28条命令,其中11条为基础命令,17条为可选命令。CCP协议相对开放,只需要实现其中的一部分命令,就可以达成测量与标定的目的。每条命令在CCP协议中拥有对应的CMD代码,从设备将解析主设备发来的CRO中的CMD代码执行相应操作,如下表所示。 | 命令 | CMD代码 | 定义 | 应答时间 | 备注 | | ------------------- | ----- | ------------- | ----- | --- | | CONNECT | 0x01 | 连接 | 25ms | | | GET_CCP_VERSION | 0x1B | 获取CCP协议版本 | 25ms | | | EXCHANGE_ID | 0x17 | 交换站标识符 | 25ms | | | GET_SEED | 0x12 | 申请密钥 | 25ms | 可选 | | UNLOCK | 0x13 | 解除保护 | 25ms | 可选 | | SET_MTA | 0x02 | 设置MTA地址 | 25ms | | | DNLOAD | 0x03 | 数据下载 | 25ms | | | DNLOAD_6 | 0x23 | 6字节数据下载 | 25ms | 可选 | | UPLOAD | 0x04 | 数据上传 | 25ms | | | SHORT_UP | 0x0F | 数据短上传 | 25ms | 可选 | | SELECT_CAL_PAGE | 0x11 | 选择标定数据页 | 25ms | 可选 | | GET_DAQ_SIZE | 0x14 | 获取DAQ列表大小 | 25ms | | | SET_DAQ_PTR | 0x15 | 设置DAQ列表指针 | 25ms | | | WRITE_DAQ | 0x16 | 写入DAQ列表 | 25ms | | | START_STOP | 0x06 | 开始/终止数据上传 | 25ms | | | DISCONNECT | 0x07 | 断开 | 25ms | | | SET_S_STATUS | 0x0C | 设置当前通信状态 | 25ms | 可选 | | GET_S_STATUS | 0x0D | 获取当前通信状态 | 25ms | 可选 | | BUILD_CHECKSUM | 0x0E | 建立checksum表 | 30s | 可选 | | CLEAR_MEMORY | 0x10 | 清空内存 | 30s | 可选 | | PROGRAM | 0x18 | 编程 | 100ms | 可选 | | PROGRAM_6 | 0x22 | 6字节数据编程 | 100ms | 可选 | | MOVE | 0x19 | 内存转移 | 30s | 可选 | | TEST | 0x05 | 连接测试 | 25ms | 可选 | | GET_ACTIVE_CAL PAGE | 0x09 | 获取处于激活状态下的标定页 | 25ms | 可选 | | START_STOP_ALL | 0x08 | 开始/停止同步数据传输 | 25ms | 可选 | | DIAG_SERVICE | 0x20 | 诊断服务 | 500ms | 可选 | | ACTION_SERVICE | 0x21 | 操作服务 | 5s | 可选 |
CCP命令代码表
注: - 如果ECU内部不支持DAQ通信模式,以下4条有关DAQ的指令也成为可选项: GET_DAQ_SIZE、SET_DAQ_SIZE、WRITE_DAQ、START_STOP。 - 如果使用了SELECT_CAL_PAGE指令,则GET_ACTIVE_CAL_PAGE指令也必须使用。 ## 二.CCP基础命令
CCP协议支持Motorola或Intel的数据格式,在本章节中以Motolora格式为例,特殊情况会另外注明,命令序列仅为序号编号,实际应用中请根据需求排序。 本章介绍CCP的11条基础命令。 ### 1.连接命令(CONNECT)
首先需要使主设备与总线上的某个从设备建立逻辑连接,才能与其开始通信。 主设备发送CONNECT命令即0x01,通过ECU地址与总线上对应的从设备建立逻辑连接,之后主设备发出的所有命令都是针对与其建立连接的从设备,直到连接断开,或者其他ECU与其建立新的连接。 如果主设备使用CONNECT命令连接一个新的ECU,则与当前ECU的连接会暂时断开。 如果使用CONNECT命令连接一个已处于连接状态的ECU,则该ECU返回一个确认信息。只有当某个ECU被正确连接后,该ECU才会对主设备发出的CRO命令做出响应。 但CONNECT命令中的ECU站地址必须采用Intel格式,CONNECT命令的CRO数据场结构如下所示。 | 位置 | 定义 | | ----- | -------------------- | | 字节0 | 命令代码=0x01(CONNECT) | | 字节1 | 命令序号=CTR | | 字节2~3 | ECU地址(Intel格式,低字节在前) | | 字节4~7 | 无效 | 针对CONNECT命令反馈DTO数据场结构,如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备需要与某个从设备建立逻辑连接,ECU地址=0x0001,CTR=1,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4~7 | | --- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0x01 | 0x01 | 0x01 | 0x00 | ------------- | 从设备收到该指令后,且正确执行,返回一条DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x01 | ------------- | ### 2.获取CCP协议版本(GET_CCP_VERSION)
该条命令用于统一主、从设备所使用的CCP协议版本,在EXCHANGE_ID 命令之前执行。 GET_CCP_VERSION命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | -------------------------- | | 字节0 | 命令代码=0x1B(GET_CCP_VERSION) | | 字节1 | 命令序号=CTR | | 字节2 | 协议主版本号(期望值) | | 字节3 | 协议副版本号(期望值) | | 字节4~7 | 无效 | 针对GET_CCP_VERSION命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 从设备所使用的协议主版本号 | | 字节4 | 从设备所使用的协议副版本号 | | 字节5~7 | 无效 | 例如,主设备向从设备发送GET_CCP_VERSION命令,CTR=0x02,希望的协议版本号为2.1,即主版本号为2,副版本号为1,主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4~7 | | --- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0x1B | 0x02 | 0x02 | 0x01 | ------------- | 从设备收到该指令后,返回自身的协议主版本号,假设与主设备期待的版本号相同,返回一条DTO,如下所示。 | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5~7 | | --- | ---- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x02 | 0x02 | 0x01 | ------------- | ### 3.交换站标识符(EXCHANGE_ID)
EXCHANGE_ID在ASAP标准中,MCD系统与ECU的通信需要ASAP2描述文件的支持,通过该条命令,自动化系统可由DTO返回的ID标识符自动为ECU分配一个ASAP描述文件。 EXCHANGE_ID命令的CRO数据场结构如下所示: | 位置 | 定义 | | --- | ------------------------- | | 字节0 | 命令代码=0x17(EXCHANGE_ID) | | 字节1 | 命令序号=CTR | | 字节2 | CCP主设备ID信息(可选,根据实际应用情况而定) | 针对EXCHANGE_ID命令反馈的DTO数据场结构如下所示: | 位置 | 定义 | | --- | ----------------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 从设备ID标识符的长度(字节数) | | 字节4 | 从设备ID数据类型(可选字节,视实际应用而定) | | 字节5 | 资源可用状态字节 | | 字节6 | 资源保护状态字节 | | 字节7 | 无效 | 从设备收到该命令后,会自动将地址指针定义到存放ID标识符的起始地址,主设备随后就以该起始地址使用UPLOAD指令上传ID信息(另见SET_MTA及UPLOAD命令)。 CCP协议在基本通信的基础上定义了一些其他功能,如非易失性内存烧写等。为了防止可能对ECU进行的误操作,在ECU程序实现时,可以对某些功能通过密钥进行保护(见GET_SEED及UNLOCK命令)。资源可用状态及资源保护状态两个字节反映了这些特殊功能当前是否处于保护状态,字节5、6的结构定义如下所示。 | 位 | 位7 | 位6 | 位5~2 | 位1 | 位0 | | --- | --- | --- | ---- | --- | --- | | 数据 | X | PGM | X | DAQ | CAL | 功能定义如下 | 功能 | 定义 | | --- | --------- | | CAL | 标定 | | DAQ | DAQ通信模式 | | PGM | 非易失性内存烧写 | | X | 暂时无效,日后扩展 | 对于资源可用状态字节,如某位值为“真(1)”,则表明当前该项功能未受保护,可以启用;如果某位值为“假(0)”,则表明当前该项功能受保护,不可以启用。 对于资源保护状态字节,如某位值为“真(1)”,则表明该项功能当前受密钥保护,需要权限才能访问(具体见GET_SEED及UNLOCK指令);如某位值为“假(0)”,则表明该项功能当前未受密钥保护,可以直接访问。 例如,主设备向从设备发送EXCHANGE_ID命令,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2~7 | | --- | ---- | ---- | ------------- | | 数据 | 0x17 | 0x03 | ------------- | 假设所有功能均处于保护状态,从设备返回DTO,如下所示。 | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | --------- | | 数据 | 0xFF | 0x00 | 0x03 | 0x04 | 0x02 | 0x00 | 0xFF | --------- | 由返回DTO可知,从设备ID号长度为4个字节,数据类型编码为2,资源可用状态字节为0x00,资源保护状态字节也是0xFF。 ### 4.设置MTA地址(SET_MTA)
MTA地址的英文全称是Memory Transfer Address,相当于一个地址指针的概念。SET_MTA命令就用于设置一个初始地址(32位基地址与地址偏移),许多CCP命令都需要根据该地址对内存进行读取或擦写。 地址偏移量取决于ECU本身的实现形式,可以指向内存中的一个页或其中某一块区域。 CCP协议定义了两个MTA地址:MTA0与MTA1,分别针对不同的命令。 - 以下指令使用MTA0: DNLOAD、UPLOAD、DNLOAD_6、SELECT_CAL_PAGE、CLEAR_MEMORY、PROGRAM、PROGRAM_6 - 以下指令使用MTA1: MOVE SET_MTA命令CRO的数据场结构,如下所示: | 位置 | 定义 | | ----- | ------------------ | | 字节0 | 命令代码=0x02(SET_MTA) | | 字节1 | 命令序号=CTR | | 字节2 | MTA序号(0或1) | | 字节3 | 地址偏移 | | 字节4~7 | 地址(无符号长整型) | 针对SET_MTA命令返回DTO的数据场结构,如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备向从设备发送SET_MTA命令,地址偏移为0x00,基地址为0x20 00 00 16,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x02 | 0x04 | 0x00 | 0x00 | 0x20 | 0x00 | 0x00 | 0x16 | 从设备返回DTO,如下所示。 | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ----- | | 数据 | 0xFF | 0x00 | 0x04 | — | ### 5.数据下载(DNLOAD)
DNLOAD指令负责将CRO中的数据下载到ECU中,以先前设定的MTA0为起始地址,开始擦写数据,下载完成后MTA0指针偏移至MTA0加上下载数据的字节数。 DNLOAD命令的CRO数据场结构,如下所示: | 位置 | 定义 | | ----- | ----------------- | | 字节0 | 命令代码=0x03(DNLOAD) | | 字节1 | 命令序号=CTR | | 字节2 | 下载数据大小(字节数) | | 字节3~7 | 下载数据(最多为5个字节) | 针对DNLOAD命令返回DTO的数据场结构,如下所示。 | 位置 | 定义 | | ----- | ------------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | MTA0偏移量(自增后) | | 字节4~7 | MTA0地址(自增后)(无符号长整型) | 例如,主设备向从设备发送DNLOAD命令,数据大小5字节,下载数据为0x10 11 12 13 14,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x03 | 0x05 | 0x05 | 0x10 | 0x11 | 0x12 | 0x13 | 0x14 | 从设备返回DTO,如下所示。 | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0xFF | 0x00 | 0x05 | 0x00 | 0x20 | 0x00 | 0x00 | 0x21 | 先前设定MTA0为0x20 00 00 16,执行命令后MTA0自动增加5个字节。 ### 6.数据上传(UPLOAD)
主设备通过UPLOAD命令,请求从设备以MTA0为起始地址,开始读取命令中规定的字节数,并且将数据上传至主设备,随后MTA0指针自动增加上传数据的字节数,但是不会向主设备汇报增加后的MTA0。 UPLOAD命令的CRO数据场结构,如下所示: | 位置 | 定义 | | ----- | ----------------- | | 字节0 | 命令代码=0x04(UPLOAD) | | 字节1 | 命令序号=CTR | | 字节2 | 请求上传的数据大小(字节数) | | 字节3~7 | 无效 | 针对UPLOAD命令返回DTO的数据场结构,如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 所请求的数据 | 例如,主设备向从设备发送UPLOAD命令,请求以MTA0为起始地址,上传4个字节的数据,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0x04 | 0x07 | 0x04 | ------------- | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0xFF | 0x00 | 0x07 | 0x10 | 0x11 | 0x12 | 0x13 | ------------ | ### 7.获取DAQ列表大小(GET_DAQ_SIZE)
如果ECU内部不支持DAQ通信模式,该命令为可选命令! 该命令用来获取某个特定DAQ列表的大小,即其中ODT列表的个数,并清空当前DAQ列表内的数据,为下次DAQ通信做准备。 如果GET_DAQ_SIZE命令选定的DAQ列表不存在或者不使用,从设备返回的ODT列表个数则为0。同时该命令还对DAQ列表进行初始化并中止该DAQ列表当前的通信。 当要同时对多个ECU进行DAQ操作时,可以在字节4~7发送对应的DTO_ID,该项为可选功能,如果给出的ID号不存在,则返回一个错误代码。 GET_DAQ_SIZE命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | --------------------------------- | | 字节0 | 命令代码=0x14(GET_DAQ_SIZE) | | 字节1 | 命令序号=CTR | | 字节2 | DAQ列表序号(#0,#1…) | | 字节3 | 无效 | | 字节4~7 | 该DAQ列表,其所对应的DTO的CAN ID标识符(无符号长整型) | 针对GET_DAQ_SIZE命令返回DTO的数据场结构如下所示。 | 位置 | 定义 | | ----- | --------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | DAQ列表大小(ODT列表数) | | 字节4 | DAQ列表的第一个PID号 | | 字节5~7 | 无效 | DAQ列表中某个ODT的PID号=DAQ列表中的第一个PID号+ODT数目。 例如,主设备先向从设备发送GET_DAQ_SIZE命令,DAQ列表的序号为0x03,CAN ID为0x00 00 02 01,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | -------- | ---- | ---- | ---- | ---- | | 数据 | 0x14 | 0x23 | 0x03 | -------- | 0x00 | 0x00 | 0x02 | 0x01 | 从设备返回DTO,DAQ列表的第一个PID号(0x08),总共有10个ODT,每个ODT 为7个字节,如下所示。 | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5~7 | | --- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0xFF | 0x00 | 0x23 | 0x0A | 0x08 | ------------ | ### 8.设置DAQ列表指针(SET_DAQ_PTR)
如果ECU内部不支持DAQ通信模式,该命令为可选命令! 在进行DAQ模式通信前,必须先对DAQ列表进行配置,将数据写入到相应DAQ列表的ODT元素中。SET_DAQ_PTR命令用来为写入DAQ列表数据设置入口地址指针。 SET_DAQ_PTR命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ---------------------- | | 字节0 | 命令代码=0x15(SET_DAQ_PTR) | | 字节1 | 命令序号=CTR | | 字节2 | DAQ列表序号(0,1…) | | 字节3 | ODT序号(0,1…) | | 字节4 | 该ODT中的第几个元素(0,1…) | | 字节5~7 | 无效 | 针对SET_DAQ_PTR命令返回DTO的数据场结构,如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备先向从设备发送SET_DAQ_PTR命令,DAQ列表的序号为0x01,ODT序号为0x03,将指针设置到该ODT中的第2个元素,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5~7 | | --- | ---- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0x15 | 0x24 | 0x01 | 0x03 | 0x02 | ------------- | 从设备返回DTO,下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x24 | ------------- | 在该命令执行后,可使用WRITE_DAQ指令将数据写入到选中的ODT中。 ### 9.写入DAQ列表(WRITE_DAQ)
如果ECU内部不支持DAQ通信模式,该命令为可选命令! 在DAQ通信前,需要对DAQ列表进行配置,将所需上传的数据事先写入DAQ列表的ODT列表中,该命令的功能就是将数据写入DAQ列表,先前由SET_DAQ_PTR命令所定义的地址为该命令的数据写入地址。在WRITE_DAQ命令中,一次写入的数据称为一个DAQ元素。写入的DAQ元素大小可为:1字节(BYTE)、2字节(DWORD)、4字节(Long int/Float)。由于一个ODT列表最多只能存储7字节的数据,因此对于长整形或浮点数,ECU必须保证上传时DAQ列表中数据的完整性与连贯性。 WRITE_DAQ命令的CRO数据场结构如下所示。 | 位置 | 定义 | | ----- | -------------------- | | 字节0 | 命令代码=0x16(WRITE_DAQ) | | 字节1 | 命令序号=CTR | | 字节2 | DAQ元素的大小(可为1,2,4字节) | | 字节3 | DAQ元素的地址偏移 | | 字节4~7 | DAQ元素的地址(无符号长整型) | 针对WRITE_DAQ命令返回DTO的数据场结构如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备向从设备发送WRITE_DAQ命令,写入DAQ元素的大小为2字节,写入元素的地址偏移为0x00,地址为0x02 00 20 00,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x16 | 0x25 | 0x02 | 0x00 | 0x02 | 0x00 | 0x20 | 0x00 | 从设备返回DTO,如下所示。 | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x25 | ------------- | 在该命令执行后,可使用WRITE_DAQ指令将数据写入到选中的ODT中。 ### 10.开始/终止数据上传(START_STOP)
如果ECU内部不支持DAQ通信模式,该命令为可选命令! 该命令用于DAQ通信模式,其作用是开始或终止某个DAQ列表的数据上传。 START_STOP命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | --------------------- | | 字节0 | 命令代码=0x06(START_STOP) | | 字节1 | 命令序号=CTR | | 字节2 | 模式:开始/终止准备数据传输 | | 字节3 | DAQ列表序号 | | 字节4 | 最后一个ODT序号 | | 字节5 | 事件通道号 | | 字节6~7 | 传输速率预分频值 | 该条命令对于不同的模式有不同的含义: - 模式=0x00:终止某DAQ列表的数据传输; - 模式=0x01:开始某DAQ列表的数据传输; - 模式=0x02:为开始同步传输做准备。 该命令用于开始或终止某个特定DAQ列表的数据上传,由命令中的DAQ列表序号决定,命令该DAQ列表的ODT开始上传。 事件通道号对应该DAQ列表上传的周期,通过预分频值可延长上传周期,预分频值必须≥1。 如果命令中的模式为0x02,主设备将对特定DAQ列表进行参数标识,当所有需要上传的列表都完成标识以后,主设备会利用START_STOP_ALL命令将所有进行过参数标识的DAQ列表同步上传。 针对START_STOP命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备向从设备发送START_STOP命令,命令模式为0x01(开始上传DAQ列表数据),DAQ列表序号为0x01,最后一个ODT序号为0x05,事件通道为0x02,预分频值为1,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x06 | 0x26 | 0x01 | 0x01 | 0x05 | 0x02 | 0x00 | 0x01 | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x26 | ------------- | 之后,从设备将按主设备的请求开始上传DAQ列表#01中从第0个ODT列表到第5个ODT列表内的数据。 ### 11.断开(DISCONNECT)
当主设备需要结束与当前ECU的通信或者准备与下一个ECU通信时,需要使用DISCONNECT断开与当前ECU的逻辑连接,根据命令参数设置可以暂时将设备设置为离线状态,也可以彻底终止与当前ECU的通信。 彻底断开会使先前对ECU状态的所有设置变成无效,并使ECU内部各项功能的保护状态恢复到初始状态。 暂时断开不会终止与当前ECU的DAQ通信,也不会影响先前对DAQ列表、ECU通信状态、各项功能的保护状态及MTA地址值的设置。 该命令中的ECU地址必须采用Intel格式,低位在前。DISCONNECT命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ---------------------- | | 字节0 | 命令代码=0x07(DISCONNECT) | | 字节1 | 命令序号=CTR | | 字节2 | 命令参数:0x00:暂时断开,0x01:终止 | | 字节3 | 无效 | | 字节4~5 | ECU地址(Intel格式,低位在前) | | 字节6~7 | 无效 | 针对DISCONNECT命令返回DTO的数据场结构,如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备向从设备发送DISCONNECT命令,命令代码=0x00(暂时将ECU设为“离线”状态),ECU地址=0x0001,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6~7 | | --- | ---- | ---- | ---- | ------------ | ---- | ---- | ------------ | | 数据 | 0x07 | 0x09 | 0x00 | ------------ | 0x01 | 0x00 | ------------ | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------ | | 数据 | 0xFF | 0x00 | 0x09 | ------------ | ## 三.CCP可选命令
本章介绍CCP的17条可选命令。 ### 1.GET_SEED与UNLOCK
**1.申请密钥种子(GET_SEED)** 如果某项功能处于保护状态,主设备需要通过GET_SEED命令向ECU申请解开该项功能的密钥种子。 GET_SEED命令每次只能请求解开一项功能,若需要请求开放多项功能,则需要先获取一项功能的“种子”计算出密钥,解锁功能后,再次发送GET_SEED获取另一项功能的“种子”。 从设备通过DTO返回“种子”数据,主设备通过seed&key算法解密得出密钥的值,算法由用户自定义,再使用UNLOCK命令解锁功能的访问权限,字节2有关功能的描述请查看"3.3.交换站标识符(EXCHANGE_ID)。 GET_SEED命令的CRO数据场结构,如下所示: | 位置 | 定义 | | ----- | ------------------- | | 字节0 | 命令代码=0x12(GET_SEED) | | 字节1 | 命令序号=CTR | | 字节2 | 请求从设备开放的功能 | | 字节3~7 | 无效 | 针对GET_SEED命令返回DTO的数据场结构,如下所示。 | 位置 | 定义 | | ----- | -------------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 请求功能当前受保护状态(“真“或“假’) | | 字节4~7 | “密钥”数据 | 例如,主设备向从设备发送GET_SEED命令,请求从设备开放DAQ通信模式,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0x12 | 0x20 | 0x02 | ------------- | 假设DAQ功能不可用,需要使用UNLOCK解锁命令,从设备返回的DTO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0xFF | 0x00 | 0x20 | 0x01 | 0x14 | 0x15 | 0x16 | 0x17 | 所请求功能当前受保护状态值为“真”(0x01),需要通过UNLOCK命令解开对该命令的保护,种子为0x14 15 16 17。 **2.解除保护(UNLOCK)** 在”申请密钥种子(GET_SEED)“获得了DAQ功能的”种子”数据,再由seed&key算法算出“密钥”的值,最后发送UNLOCK命令可解开从设备的DAQ功能的保护。 UNLOCK命令的CRO数据场结构,如下所示: | 位置 | 定义 | | ----- | ----------------- | | 字节0 | 命令代码=0x13(UNLOCK) | | 字节1 | 命令序号=CTR | | 字节2~7 | 密钥 | 针对UNLOKC命令返回DTO的数据场结构,如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 各项功能当前状态 | | 字节4~7 | 无效 | 例如,假设通过seed&key算法算出“密钥”为 0x14 15 16 17,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6~7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0x13 | 0x21 | 0x14 | 0x15 | 0x16 | 0x17 | ------------ | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4~7 | | --- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x21 | 0x02 | ------------- | 当前状态位为0x02,表示当前只有DAQ通信模式可用。 ### 2.六字节数据下载(DNLOAD_6)
该命令的功能与DNLOAD命令相似,区别在于DNLOAD命令一次下载数据可为1~5个字节不等,DNLOAD_6下载固定为6字节大小的数据,起始地址为MTA0,下载结束后MTA0指针会自增6个字节。 DNLOAD_6的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ------------------ | | 字节0 | 命令代码=0x23(DNLOAD6) | | 字节1 | 命令序号=CTR | | 字节2~7 | 需要下载的数据(6个字节) | 针对DNLOAD_6命令返回DTO的数据场结构如下所示。 | 位置 | 定义 | | ----- | ------------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | MTA0偏移量(自增后) | | 字节4~7 | MTA0地址(自增后)(无符号长整型) | 例如,主设备向从设备发送DNLOAD_6命令,下载数据为0x10 11 12 13 14 15,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x03 | 0x06 | 0x10 | 0x11 | 0x12 | 0x13 | 0x14 | 0x15 | 从设备返回DTO,如下所示。 | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0xFF | 0x00 | 0x06 | 0x00 | 0x20 | 0x00 | 0x00 | 0x22 | 执行下载前,设定MTA0为0x20 00 00 16,执行命令后MTA0自动增加6个字节。 ### 3.数据短上传(SHORT_UP)
该命令的功能与UPLOAD命令相似,区别在于UPLOAD命令中上传数据的起始地址是MTA0,而SHORT_UP命令中指定了起始地址,从设备按该起始地址读取命令中规定的字节数,并且将数据上传至主设备。 SHORT_UP命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ------------------- | | 字节0 | 命令代码=0x0F(SHORT_UP) | | 字节1 | 命令序号=CTR | | 字节2 | 请求数据大小(字数1~5) | | 字节3 | 地址偏移量 | | 字节4~7 | 地址(无符号长整型) | 针对SHORT_UP命令返回DTO的数据场结构,如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 所请求的数据 | 例如,主设备向从设备发送SHORT_UP命令,所要上传数据长度为4个字节,起始地址为0x20 00 30 10,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x0F | 0x08 | 0x04 | 0x00 | 0x20 | 0x00 | 0x30 | 0x10 | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0xFF | 0x00 | 0x08 | 0x02 | 0x03 | 0x04 | 0x05 | ------------ | ### 4.选择标定数据页(SELECT_CAL_PAGE)
该命令的功能取决于ECU的内部实现。执行该条命令后,先前设置的MTA0地址将会自动指向由该命令激活的标定页。 SELECT_CAL_PAGE命令的CRO数据场结构,如下所示: | 位置 | 定义 | | ----- | -------------------------- | | 字节0 | 命令代码=0x11(SELECT_CAL_PAGE) | | 字节1 | 命令序号=CTR | | 字节2~7 | 无效 | 针对SELECT_CAL_PAGE命令返回DTO的数据场结构,如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备首先向从设备发送SET_MTA命令,再发送SELECT_CAL_PAGE命令,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2~7 | | --- | ---- | ---- | ------------- | | 数据 | 0x11 | 0x22 | ------------- | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------ | | 数据 | 0x11 | 0x00 | 0x22 | ------------ | ### 5.SET_S_STATUS与GET_S_STATUS
**1.设置当前通信状态(SET_S_STATUS)** 从设备通过该条命令设置当前主,从设备间的通信状态。SET_S_STATUS命令的CRO数据场结构,如下所示: | 位置 | 定义 | | ----- | ----------------------- | | 字节0 | 命令代码=0x0C(SET_S_STATUS) | | 字节1 | 命令序号=CTR | | 字节2 | 状态字节(见下表) | | 字节3~7 | 无效 | 从设备通过状态字节来设置当前通信所处的状态,具体定义如下所示: | 位 | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 | | --- | --- | ----- | --- | --- | --- | ----- | --- | --- | | 定义 | RUN | STORE | res | res | res | RESUE | DAQ | CAL | 状态字节中各位定义如下所示: | 位置 | 名称 | 定义 | | ---- | ----- | ----------------------------------------- | | 位7 | RUN | 正处于运行阶段 | | 位6 | STORE | 请求ECU断电时保存标定数据 | | 位5~3 | res | 保留 | | 位2 | RESUE | 请求ECU断电时自动保存DAQ列表设置,
在下次启动时再自动启动DAQ列表。 | | 位1 | DAQ | DAQ列表初始化完成 | | 位0 | CAL | 标定数据初始化完成 | 状态字节中如果某位的数值为1,则该位的表达式为真;数值为0,则该位的表达式为假。从设备可以对状态字节进行读/写操作。上电、连接断开或发生错误时,状态字节中的数据会被清空。 针对SET_S_STATUS命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备先向从设备发送SET_S_STATUS命令,状态字节的值为0b 10000001(RUN,CAL),则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------ | | 数据 | 0x0C | 0x27 | 0x81 | ------------ | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------ | | 数据 | 0xFF | 0x00 | 0x27 | ------------ | **2.获取当前通信状态(GET_S_STATUS)** 主设备通过该条命令请求从设备提供当前通信状态。GET_S_STATUS命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ----------------------- | | 字节0 | 命令代码=0x0D(GET_S_STATUS) | | 字节1 | 命令序号=CTR | | 字节2~7 | 无效 | 针对GET_S_STATUS命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 状态字节 | | 字节4 | 其他状态信息限定 | | 字节5 | 其他状态信息(可选) | | 字节6~7 | 无效 | 注: 返回DTO中的其他状态信息为可选项,是否采用由制造商或具体应用制定,并不属于CCP协议范畴。 如果ECU返回的DTO中不包括其他状态信息,则其他状态信息限定必须为0(FALSE),若如该位值不为FALSE,则由该位的值决定其他状态信息的类型。 例如,主设备先向从设备发送GET_S_STATUS命令,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2~7 | | --- | ---- | ---- | ------------ | | 数据 | 0x0D | 0x28 | ------------ | 从设备返回DTO,状态字的0位(CAL)与第7位(RUN)位1,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4~7 | | --- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0x0D | 0x00 | 0x28 | 0X81 | ------------ | 由DTO返回的状态字节,其中第0位(CAL)和第7位(RUN)分别为1。 ### 6.建立checksum表(BUILD_CHECKSUM)
为了提高效率,在每次对ECU标定前,CCP支持先对需要进行标定的内存区域进行checksum算法,如果checksum结果与下载数据不一致,表明内存中的数据与标定数据不同,主设备才开始下载标定数据。 主设备用该条命令请求从设备对指定内存区域(起始地址为MTA0,大小由命令中的Block大小决定)进行checksum计算,并返回计算结果。checksum算法由制造商和或根据实际应用决定,不属于CCP协议范畴。 BUILD_CHKSUM命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ----------------------- | | 字节0 | 命令代码=0x0E(BUILD_CHKSUM) | | 字节1 | 命令序号=CTR | | 字节2~5 | Block大小(以字节数表示,无符号长整型) | | 字节6~7 | 无效 | 针对BUILD_CHKSUM命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | -------------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | checksum数据长度 | | 字节4~7 | checksum数据(根据实际应用而定) | 例如,主设备向从设备发送BUILD_CHKSUM命令,内存块的大小为28KB(0x7000),起始地址为MTA0地址,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6~7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0x0E | 0x29 | 0x00 | 0X00 | 0x70 | 0x00 | ------------ | 从设备返回DTO,通过计算得到的checksum数据(0x03 05),如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6~7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0xFF | 0x00 | 0x29 | 0X02 | 0x03 | 0x05 | ------------ | ### 7.清空内存(CLEAR_MEMORY)
这条命令可在标定前清空FLASH_EPROM中的数据,被清空区域的起始地址即是MTA0地址。CLEAR_MEMORY命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ----------------------- | | 字节0 | 命令代码=0x10(CLEAR_MEMORY) | | 字节1 | 命令序号=CTR | | 字节2~5 | 内存区域大小(长整型) | | 字节6~7 | 无效 | 针对CLEAR_MEMORY命令返回DTO的数据场结构,如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备向从设备发送CLEAR_MEMORY命令,内存区域大小为28KB(0x7000),如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6~7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0x10 | 0x30 | 0x00 | 0X00 | 0x70 | 0x00 | ------------ | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x30 | ------------- | ### 8.PROGRAM与PROGRAM_6
**1.编程(PROGRAM)** PROGRAM命令可以将一块大小确定的数据(由命令中的数据大小决定)烧写到ECU的非易失性内存(FLASH、EEPROM)中,起始地址为MTA0。烧写结束后,MTA0地址按烧写数据的字节数自增。 PROGRAM命令的CRO数据结构如下所示: | 位置 | 定义 | | ----- | ------------------ | | 字节0 | 命令代码=0x18(PROGRAM) | | 字节1 | 命令序号=CTR | | 字节2 | 数据大小(字节数) | | 字节3~7 | 数据(最多为5个字节) | 针对PROGRAM命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | ------------------ | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | MTA0偏移(自增后) | | 字节4~7 | MTA0自增后的地址(无符号长整型) | 例如,主设备向从设备发送PROGRAM命令,需要要烧写3个字节数据,数据为:0x10 11 12,CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6~7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0x18 | 0x31 | 0x03 | 0X10 | 0x11 | 0x12 | ------------ | 从设备返回DTO,MTA0偏移地址(0x00),如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0xFF | 0x00 | 0x31 | 0X00 | 0x20 | 0x00 | 0x00 | 0x19 | 执行编码命令前,设定MTA0为0x20 00 00 16,执行命令后MTA0自动增加3个字节。 **2.六字节数据编程(PROGRAM_6)** 该命令的功能与PROGRAM命令相同,区别在于PROGRAM命令写入数据的长度由CRO命令消息指定,而该条命令写入数据长度固定为6个字节。烧写结束后,MTA0地址自增6个字节。 PROGRAM_6命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ------------------- | | 字节0 | 命令代码=0x22(PROGRAM6) | | 字节1 | 命令序号=CTR | | 字节2~7 | 烧写数据(6个字节) | 针对PROGRAM_6命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | ------------------ | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | MTA0偏移(自增后) | | 字节4~7 | MTA0自增后的地址(无符号长整型) | 例如,MTA0 以0x20000016为例,主设备向从设备发送PROGRAM_6命令,烧写数据大小为6个字节,分别为0x10、0x11、0x12、0x13、0x14、0x15,CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x22 | 0x32 | 0x10 | 0X11 | 0x12 | 0x13 | 0x14 | 0x15 | 从设备返回DTO,MTA0偏移地址(0x00),如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 7字节 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0xFF | 0x00 | 0x32 | 0X00 | 0x20 | 0x00 | 0x00 | 0x22 | 执行编码命令前,设定MTA0为0x20 00 00 16,执行命令后MTA0自动增加6个字节。 ### 9.内存转移(MOVE)
MOVE可将固定长度的一块内存区域中的内容由MTA0起始地址处转移到MTA1起始地址处。MOVE命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | --------------------- | | 字节0 | 命令代码=0x19(MOVE) | | 字节1 | 命令序号=CTR | | 字节2~5 | 需要转移的内存区域的长度(字节数,长整型) | | 字节6~7 | 无效 | 针对MOVE命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备向从设备发送MOVE命令,需转移内存区域大小为28KB(0x7000),如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6~7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0x19 | 0x33 | 0x00 | 0X00 | 0x70 | 0x00 | ------------ | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x33 | ------------- | ### 10.连接状态测试(TEST)
该条命令用来测试某个ECU当前是否与主设备处于连接状态。该命令并不在主设备与从设备间建立逻辑连接,也不请求从设备进行任何活动。命令消息中的ECU地址必须使用Intel格式(低字节在前)。TEST命令的CRO数据场结构如下所示。 | 位置 | 定义 | | ----- | -------------------- | | 字节0 | 命令代码=0x05(TEST) | | 字节1 | 命令序号=CTR | | 字节2~3 | ECU地址(Intel格式,低字节在前) | | 字节4~7 | 无效 | 针对TEST命令返回DTO的数据场结构如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备测试ECU1是否连接,ECU1地址=0x0001,则主设备发送的CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4~7 | | --- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0x05 | 0x34 | 0x01 | 0x00 | ------------- | 从设备收到该指令后,且正确执行,返回一条DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x34 | ------------- | ### 11.获取处于激活状态下的标定页(GET_ACTIVE_CAL_PAGE)
该条命令的功能实返回当前处于激活状态下的标定页的首地址。GET_ACTIVE_CAL_PAGE命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ------------------------------ | | 字节0 | 命令代码=0x09(GET_ACTIVE_CAL PAGE) | | 字节1 | 命令序号=CTR | | 字节2~7 | 无效 | 针对GET_ACTIVE_CAL PAGE命令返回DTO的数 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 地址偏移 | | 字节4~7 | 首地址 | 例如,主设备获取处于激活状态下的标定页,CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2~7 | | --- | ---- | ---- | ------------- | | 数据 | 0x09 | 0x35 | ------------- | 从设备收到该指令后,且正确执行,返回一条DTO,偏移量为0,首地址为0x20 00 60 01,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0xFF | 0x00 | 0x35 | 0x00 | 0x20 | 0x00 | 0x60 | 0x01 | ### 12.开始/停止同步数据传输(START_STOP_ALL)
若先前的START_STOP命令中的命令模式值为0x02,则对DAQ列表进行标识,为同步数据传输做准备。该条命令的作用就是让经过标识的DAQ列表开始或终止同步数据传输。START_STOP_ALL命令的CRO数据场结构如下所示。 | 位置 | 定义 | | ----- | ------------------------- | | 字节0 | 命令代码=0x08(START_STOP_ALL) | | 字节1 | 命令序号=CTR | | 字节2 | 0x00停止数据传输:0x01开始数据传输 | | 字节3~7 | 无效 | 针对START_STOP_ALL命令返回DTO的数据场结构如下所示。 | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3~7 | 无效 | 例如,主设备向从设备发送开始同步数据传输,CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------ | | 数据 | 0x19 | 0x36 | 0x01 | ------------ | 从设备返回DTO,如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3~7 | | --- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x36 | ------------- | ### 13.DIAG_SERVICE与ACTION_SERVICE
**1.诊断服务(DIAG_SERVICE)** 该条命令使从设备自动执行主设备请求的诊断服务,MTA0会自动重新定位,主设备从新的MTA0起始地址处获取诊断服务的反馈信息。DIAG_SERVICE的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ----------------------- | | 字节0 | 命令代码=0x20(DIAG_SERVICE) | | 字节1 | 命令序号=CTR | | 字节2~3 | 诊断服务号 | | 字节4~7 | 附加参数(如果有) | 针对DIAG_SERVICE返回的DTO数据场结构如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 反馈信息长度(字节数) | | 字节4 | 反馈信息数据类型限定 | | 字节5~7 | 无效 | 例如,主设备向从设备发送DIAG_SERVICE命令,所请求的诊断服务号为0x03,没有附加参数,CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4~7 | | --- | ---- | ---- | ---- | ---- | ------------ | | 数据 | 0x20 | 0x37 | 0x00 | 0x03 | ------------ | 从设备返回DTO,反馈信息的长度0x02及数据类型0x00,CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5~7 | | --- | ---- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x37 | 0x02 | 0x00 | ------------- | 之后通过UPLOAD指令从新的MTA0处取得诊断服务的反馈信息。 **2.操作服务(ACTION_SERVICE)** 同DIAG_SERVICE命令,主设备通过该条命令请求从设备自动执行某项操作,MTA0将自动重新定位,主设备可从新的MTA0起始地址处获取所请求操作服务的反馈信息(如果该项服务有反馈信息)。 ACTION_SERVICE命令的CRO数据场结构如下所示: | 位置 | 定义 | | ----- | ------------------------- | | 字节0 | 命令代码=0x21(ACTION_SERVICE) | | 字节1 | 命令序号=CTR | | 字节2~3 | 请求操作服务号 | | 字节4~7 | 附加参数(如果有) | 针对ACTION_SERVICE命令返回DTO的数据场结构如下所示: | 位置 | 定义 | | ----- | -------------- | | 字节0 | Packet ID:0xFF | | 字节1 | 命令返回代码=ERR | | 字节2 | 命令序号=CTR | | 字节3 | 反馈信息长度(字节数) | | 字节4 | 反馈信息数据类型限定 | | 字节5~7 | 无效 | 例如,主设备向从设备发送ACTION_SERVICE命令,所请求的操作服务号为0x05,附加参数为0x03,CRO如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 | 字节7 | | --- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 数据 | 0x21 | 0x38 | 0x00 | 0x05 | 0x00 | 0x00 | 0x00 | 0x03 | 从设备返回DTO,反馈信息长度(0x02)及数据类型(0x00),如下所示: | 字节 | 字节0 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5~7 | | --- | ---- | ---- | ---- | ---- | ---- | ------------- | | 数据 | 0xFF | 0x00 | 0x38 | 0x02 | 0x00 | ------------- | 之后主设备可通过UPLOAD指令从新的MTA0处取得操作服务的反馈信息。 ## 四.XCP指令参考表
| 基础标准指令STD | CODE | 备注 | | ----------------------- | -------- | ------------------------------------------------------------------- | | CONNECT | 0xFF | 必选指令,用于建立与ECU的连接,指令包含ECU的地址等信息,在建立连接后,外部设备可以向ECU发送其它指令。 | | DISCONNECT | 0xFE | 必选指令,用于断开与ECU的连接,在断开连接后,外部设备不能再向ECU发送指令。 | | GET_STATUS | 0xFD | 必选指令,用于获取ECU的状态信息,可以返回ECU的运行状态、错误码等信息。 | | SYNCH | 0xFC | 必选指令,用于同步ECU和外部设备的信息,可以确保ECU和外部设备在同一时间点上进行通信。 | | GET_COMM_MODE_INFO | 0xFB | 可选指令 | | GET_ID | 0xFA | 可选指令 | | SET_REQUEST | 0xA9 | 可选指令 | | GET_SEED | 0xF8 | 可选指令 | | UNLOCK | 0xF7 | 可选指令 | | SET_MTA | 0xF6 | 可选指令 | | UPLOAD | 0xF5 | 可选指令 | | SHORT_UPLOAD | 0xF4 | 可选指令 | | BUILD_CHECKSUM | 0xF3 | 可选指令 | | TRANSPORT_LAYER_CMD | 0xF2 | 可选指令 | | USER_CMD | 0xF1 | 可选指令 | | **标定功能指令CAL** | **CODE** | **备注** | | DOWNLOAD | 0xF0 | 必选指令,用于向ECU写入数据,可以包含写入的地址、长度、数据等信息。 | | DOWNLOAD_NEXT | 0xEF | 可选指令 | | DOWNLOAD_MAX | 0xEE | 可选指令 | | SHORT_DOWNLOAD | 0xED | 可选指令 | | MODIFY_BITS | 0xEC | 可选指令 | | **标定页面切换指令PAG** | **CODE** | **备注** | | SET_CAL_PAGE | 0xEB | 可选指令 | | GET_CAL_PAGE | 0xEA | 可选指令 | | GET_PAG_PROCESSOR_INFO | 0xE9 | 可选指令 | | GET_SEGEMENT_INFO | 0xE8 | 可选指令 | | GET_PAGE_INFO | 0xE7 | 可选指令 | | SET_SEGEMENT_MODE | 0xE6 | 可选指令 | | GET_SEGEMENT_MODE | 0xE5 | 可选指令 | | COPY_CAL_PAGE | 0xE4 | 可选指令 | | **DAQ传输指令DAQ** | **CODE** | **备注** | | CLEAR_DAQ_LIST | 0xE3 | DAQ模式必选指令,清除DAQ列表,可用于预定义的和可配置的DAQ列表。 | | SET_DAQ_PTR | 0xE2 | DAQ模式必选指令,设置DAQ指针,为WRITE_DAQ或READ_DAQ的后续操作来初始化DAQ列表指针。 | | WRITE_DAQ | 0xE1 | DAQ模式必选指令,写DAQ的ODT条目,将一个ODT条目写入由DAQ列表指针(SET_DAQ_PTR)定义的DAQ列表。 | | SET_DAQ_LIST_MODE | 0xE0 | DAQ模式必选指令,设置DAQ列表模式,可用于预定义的和可配置的DAQ列表。 | | GET_DAQ_LIST_MODE | 0xDF | DAQ模式必选指令,获取DAQ列表模式,可用于预定义的和可配置的DAQ列表。 | | START_STOP_DAQ_LIST | 0xDE | DAQ模式必选指令,启动/停止/选择DAQ列表,可用于预定义的和可配置的DAQ列表。 | | START_STOP_SYNCH | 0xDD | DAQ模式必选指令,启动/停止DAQ列表,用于同步启停数据的传输采集列表。 | | GET_DAQ_CLOCK | 0xDC | 可选指令 | | READ_DAQ | 0xDB | 可选指令 | | GET_DAQ_PROCESSOR_INFO | 0xDA | 可选指令 | | GET_DAQ_RESOLUTION_INFO | 0xD9 | 可选指令 | | GET_DAQ_LIST_INFO | 0xD8 | 可选指令 | | GET_DAQ_EVENT_INFO | 0xD7 | 可选指令 | | FREE_DAQ | 0xD6 | 可选指令 | | ALLOC_DAQ | 0xD5 | 可选指令 | | ALLOC_ODT | 0xD4 | 可选指令 | | ALLOC_ODT_ENTRY | 0xD3 | 可选指令 | | WRITE_DAQ_MULTIPLE | 0xC7 | 可选指令 | | **数据刷写指令PGM** | **CODE** | **备注** | | PROGRAM_START | 0xD2 | 数据刷写必选指令,表示一个编程序列的开始,用于指示非易失性内存编程的开始序列。 | | PROGRAM_CLEAR | 0xD1 | 数据刷写必选指令,清除部分非易失性内存,用于在重编程之前清除一部分非易失性内存。 | | PROGRAM | 0xD0 | 数据刷写必选指令,编程非易失性内存,用于对ECU内部的数据进行编程。 | | PROGRAM_RESET | 0xCF | 数据刷写必选指令,表示一个编程序列的结束,用于指示非易失性内存编程序列的结束。ECU会转到断开连接的状态,此命令可用于强制ECU复位。 | | GET_PGM_PROCESSOR_INFO | 0xCE | 可选指令 | | GET_SECTOR_INFO | 0xCD | 可选指令 | | PROGRAM_PREPARE | 0xCC | 可选指令 | | PROGRAM_FORMAT | 0xCB | 可选指令 | | PROGRAM_NEXT | 0xCA | 可选指令 | | PROGRAM_MAX | 0xC9 | 可选指令 | | PROGRAM_VERIFY | 0xC8 | 可选指令 |