• Automotive

CCP协议背景

正如其名,CCP(CAN校正协议)是一种用于从电子控制单元(ECU)进行数据采集和进行数据校正的协议。此协议由ASAM(自动化和测量统一标准化协会)定义。ASAM原名是ASAP(应用系统标准化协会)。该协会是由众多著名汽车制造商(如奥迪、宝马、大众等)组成的国际组织。到目前为止,在ECU硬件和软件的开发、校正、生产和服务领域,使用了各种不同的技术方案。CCP的目标是创建一个适合ECU所有开发阶段并且各种硬件和软件都可兼容的通用工具。

ASAM组织定义了很多标准。CCP和XCP标准位于AE(汽车电子)分类标准中,归类为AAE MCD 1组。CCP协议规范目前版本是1999年2月发布的2.1版。

 

CCP应用领域

CCP协议最常见的应用领域是汽车行业,在汽车行业中CAN被经常用到,而在其它行业中也可以使用CAN。已知的应用领域包括:

  • ECU开发
  • ECU功能和环境测试系统
  • 内燃机、齿轮箱或气候控制的试验工作台
  • 车辆投产前的测量和校正
  • 汽车行业之外的一般CAN应用

 

CCP协议简介

CCP是针对CAN 2.0B(11或29位CAN标识符)的应用层协议。按照OSI模型,本协议处于顶层(第7层)。这表示本协议对位和字节如何创建不进行描述,而是使用CAN 2.0B协议的物理层、数据链路层和网络层。

CCP支持以下功能:

  • 读写ECU内存
  • 从ECU进行同步循环数据采集
  • 同时校准和数据采集
  • 处理CAN总线上的多个节点
  • 闪存编程
  • 即插即用
  • 资源保护(数据采集和校准)

CCP/XCP

深入了解

CCP协议详解

CCP是一种主从模式应用,CCP主节点通过向从节点发送命令来开始通信。一条CAN总线上可以连接多个从节点。CCP使用通用的命令进行数据采集,并使用简单的内存处理机制进行数据校正。这两种资源相互独立,因此可以同时使用。

fig1-ccp-connection1
图1:CCP 总线连接

CCP的设计能够同时处理小型8位微控制器和高性能ECU的限制和需求。ECU无需连接额外的硬件。CCP驱动程序完全通过软件实现。CCP的简单实现仅需很少的RAM、ROM和CPU执行时间。简单实现仅需两个CAN报文标识符。可以把这两个标识符设置成低优先级,从而不干扰正常通信。如果在普通电脑上使用CCP,那么可以使用和微控制器中相同的简单且低成本的CAN接口。

 

通用命令

CCP使用非特定节点的通用命令在从节点中执行不同的功能。因为命令是通用的,所以每个节点都必须有单独的工作站地址。发送命令之前,必须在主节点和从节点之间建立逻辑连接。在主节点决定连接到另一个从节点或发送断开命令之前,这个连接一直存在。建立连接之后,主节点控制主从节点之间的所有通信。从主节点发出的每条报文后面都有来自从节点的应答报文,此应答报文包含数据或错误码。

 

CCP特定的CAN报文

CCP建立在CAN 2.0B协议之上。所有报文均为8字节长度。

只需要两种类型的CAN报文:CRO和DTO,每个方向一种报文。CRO(命令接收对象)报文从主节点发送到从节点,包含控制命令。DTO(数据传输对象)报文从从节点发送到主节点。从节点收到CRO后,执行给出的指令,然后通过包含CRM(命令返回报文)的DTO报文作出应答。CRM代码通知主节点是否已经执行相应的控制命令。

fig2-ccp-cro-dto1
图2:CRO和DTO报文

CRO和DTO报文使用的CAN标识符由配置文件(“A2L”文件,由ASAM MCD 2MC/ASAP2标准定义,用来配置主节点)确定。配置文件可能还包含关于从节点内存结构的信息,此信息用于数据采集和数据校正。因为CAN标识符定义报文的优先级,所以其选择不应影响总线上的正常通信。CCP不规定常规数据传输中使用的字节序(Motorola或Intel)。但是有一个例外,它规定在主从节点之间建立连接时使用的工作站地址的字节序必须是Intel字节序(先放最低有效字节,小端对齐)。

 

CRO报文说明

CRO报文从主节点发送到从节点,包含指令。第一个字节是命令码(CMD),描述报文的目的。第二个字节是命令计数器(CTR),用来跟踪记录通信。从从节点返回的DTO报文中也应包含命令计数器。字节2到7用来存放数据参数(不同的命令码有不同的数据参数)。报文长度始终是8字节,没有定义的字节视为可以忽略。

fig3-ccp-cro1

图3:CRO报文的结构

 

DTO报文说明

DTO报文由从节点发送,用来对收到CRO报文进行确认,同时用于数据采集。报文中的第一个字节称为PID(包标识符)。PID的值描述报文类型。有三种类型的报文:

  • 0xFF,命令返回报文(CRM)。DTO被用来确认收到CRO报文。
  • 0xFE,事件报文。DTO报告内部从节点状态变化,以便调用错误恢复或其它服务。
  • 0 – 0xFD,数据采集报文(DAQ)。这个PID包含ODT(对象描述符表)的值,ODT会在后面阐述。

fig4-ccp-dto1

图4:DTO报文的结构

 

数据采集(DAQ)

主设备可以发起和启动从设备的数据采集。然后从设备以特殊的DAQ-DTO发送数据。数据字节组织在DAQ列表中,而DAQ列表包含许多ODT列表。ODT列表包含多达7个指针,这些指针指向ECU中存储数据的内存地址。除了内存地址指针外,ODT可以包含一个地址扩展和发送的字节数。所有从设备都不处理大于一个字节的数据元素,这个问题由主设备通过把数据分割成独立的字节来解决。

fig5-ccp-daq-list1
图5:ODT列表的结构

DAQ-DTO包含一个PID和ODT列表中内存指针所指向的数据元素。PID号(通常和ODT列表相同)的值范围是0到253,这表示同时只能有254个ODT列表。

 

fig6-ccp-daq-odt1
图6:DAQ列表的结构

CCP规范允许多个可以同时激活的DAQ列表。由主节点通过START_STOP命令发起DAQ列表的传输。如果从节点在进行中的DAQ周期结束之前收到新的START_STOP命令,可以有两种反应方式。一种是启动新的DAQ命令,终止正在进行的DAQ。另一种是继续完成正在进行的DAQ,忽略新收到的命令。两种方式都存在优缺点,CCP规范没有说明该选择哪一种。

 

CCP命令

CCP规范包含下列命令(图7)。如果不需要数据校正能力,则不必实现所有命令。这些命令在下表(图7)中标记为可选。而且,GET_DAQ_SIZE、SET_DAQ_PTR、WRITE_DAQ和START_STOP(和START_STOP_ALL)是DAQ特定的命令,如果没用到该资源,则不必实现。GET_SEED和UNLOCK用来解锁诸如数据采集和数据纠正的CCP资源(如果这些资源由可选的密钥/密码进行保护)。

 

fig7-ccp-commands1

图7:命令

 

错误处理

根据从节点返回的错误码及其严重程度,主节点进行图8中描述的不同操作。
fig8-ccp-error-handling1

图8:错误处理

错误C0是警告,不进行任何操作。如果发生错误C1,表示通信中发生错误,或者发送节点处于繁忙状态。发生错误C1时,主节点应当等待ACK时间(图7中描述),然后尝试重新发送报文。应该尝试两次。错误C2可能是临时的功率不足,可以通过重新初始化来解决。错误C3无法解决,主节点应当终止运行中的会话。

冷启动表示通过CONNECT命令和一些进一步的初始化操作在主从节点之间建立新的逻辑连接。

 

命令序列示例

以下示例演示主节点进行基本CCP通信所使用的命令。

 

登录会话(冷启动)

这是主从节点之间的一种典型连接,从来自主节点的包含CONNECT命令的CRO开始。从节点应当使用相应的DTO进行应答。为了确保主从节点使用相同的协议版本,主节点会发送包含期望版本号的GET_CCP_VERSION命令。如果从节点返回的版本号匹配期望的版本号,则通信可以继续。对于兼容即插即用的节点,可以根据工作站地址使用EXCHANGE_ID命令进行自动会话配置。收到GET_SEED命令时,从结点返回关于资源(DAQ或数据校正)保护状态(锁定/未锁定)的信息。如果出于某些原因,资源处于锁定状态,那么必须将其解锁才能使用。要解锁资源,主节点必须发送包含GET_SEED DTO中收到的“密钥”的UNLOCK命令。登录会话结束之前,建议通过SET_S_STATUS命令对状态位进行初始化。

 

数据校正发起会话

本会话说明的前提是已经完成登录会话。本会话的第一个操作是使用SET_S_STATUS命令将数据校正的会话状态位设置成“关闭”。然后,使用SET_MTA命令选择包含要交换数据的内存地址。为了确保此内存地址可用,应当发送BUILD_CHKSUM命令,并且应收到来自从节点的确认应答。然后,可以把数据字节下载到选择的地址。首先发送包含数据字节数量和每个字节值的DOWNLOAD命令。然后发送SELECT_CAL_PAGE命令真正地执行数据交换。使用SET_S_STATUS命令把数据校正的会话状态位设置成“打开”,指示已经开始进行数据校正。

 

DAQ发起会话

本会话说明的前提是已经完成登录会话。使用SET_S_STATUS命令将DAQ的会话状态位设置成“关闭”。使用GET_DAQ_SIZE命令选择一个DAQ列表,从节点的应答报文中包含可用ODT的数量。使用SET_DAQ_POINTER命令选择应该写到哪个DAQ列表、哪个ODT表和ODT中的哪个元素。然后使用WRITE_DAQ命令把数据参数的内存地址指定给前面所选的元素。根据需要填充所有DAQ列表后,使用SET_S_STATUS把DAQ的会话状态位设置成“打开”。使用START_STOP命令启动DAQ列表的传输。如果要同时启动多个DAQ列表并同步发送,使用START_STOP_ALL命令。

返回至 高层协议