3、测量与标定协议(一):CCP协议详解——CAN通信下的标定协议,包括CRO/DTO、DAQ与STIM模式

各位工程师朋友,今天我们聊聊CCP协议。

CCP,全称CAN Calibration Protocol。说白了,它就是一套跑在CAN总线上的“对话规则”。ECU内部有成千上万个变量,标定就是通过这套规则,去读写这些变量。

我最早接触CCP是在2008年,那时候做柴油机标定。说实话,第一次看到CRO、DTO这些缩写,头都大了。但搞懂了之后,你会发现它其实很巧妙。

3.1 CCP协议的核心:主从架构

CCP采用主从模式。标定工具(比如INCA、CANape)是主设备,ECU是从设备。主设备发命令,从设备执行并回复。

为什么这么设计?你想想看,ECU是实时系统,它不能主动发一堆数据把总线占满。主设备问一句,它答一句,这样最安全。

关键点:CCP协议基于CAN 2.0A,使用11位标识符。一个CCP会话通常占用两个CAN ID:一个用于接收命令(主->从),一个用于发送响应(从->主)。

3.2 报文结构:CRO与DTO

CCP的报文分两种:CRO和DTO。这两个词你得记住,因为后面所有操作都离不开它们。

3.2.1 CRO(Command Receive Object)

CRO是主设备发给从设备的命令。它占用8字节CAN数据场,结构如下:

字节0: CRO命令ID(如0x01表示CONNECT)
字节1-7: 命令参数(根据具体命令而定)

举个例子,连接命令(CONNECT)的CRO是这样的:

CAN ID: 0x100(主->从)
数据: 01 00 00 00 00 00 00 00
      ↑
    CRO命令ID = 0x01

我个人习惯把CRO理解成“遥控器”。你按哪个键(命令ID),ECU就执行哪个动作。

3.2.2 DTO(Data Transmission Object)

DTO是从设备回复给主设备的报文。它也有8字节,但结构稍微复杂一点:

字节0: PID(Packet ID)
  - 0xFF: CRM(Command Return Message),命令响应
  - 0x00-0xFE: DAQ(Data Acquisition),测量数据
字节1-7: 数据内容

DTO有两种类型:

  • CRM(Command Return Message):对CRO命令的响应。PID固定为0xFF。
  • DAQ-DTO:周期性发送的测量数据。PID从0x00到0xFE。

小技巧:我在项目中遇到过一个问题——DTO的PID和CAN ID搞混了。记住:PID是DTO报文内部的第一个字节,不是CAN ID。CAN ID是报文头,PID是数据内容。

3.3 测量模式:DAQ(Data Acquisition)

DAQ是CCP最常用的功能。它让ECU按照设定的周期,自动往总线上发送测量数据。

为什么要用DAQ?

  • 你不可能一条一条发命令去读数据,那样太慢了
  • ECU需要连续采集数据,比如发动机转速、喷油量
  • DAQ是“推”模式,ECU主动推数据,主设备只管收

3.3.1 DAQ的工作原理

DAQ的工作流程分三步:

  1. 配置ODT(Object Descriptor Table):告诉ECU要采集哪些变量,每个变量占几个字节
  2. 启动DAQ:ECU开始按周期发送数据
  3. 接收数据:主设备解析DTO报文,提取变量值

举个例子,假设你要采集三个变量:

变量名 地址 长度(字节) DAQ位置
EngineSpeed 0x8000 2 ODT 0, 字节0-1
InjQuantity 0x8004 2 ODT 0, 字节2-3
CoolantTemp 0x8008 1 ODT 0, 字节4

配置好之后,ECU会每隔一个预设周期(比如10ms)发送一个DTO报文:

CAN ID: 0x101(从->主)
数据: 00 [EngineSpeed高字节] [EngineSpeed低字节] [InjQuantity高] [InjQuantity低] [CoolantTemp] 00 00
      ↑
    PID = 0x00,表示这是DAQ数据

注意:DAQ的周期不能太短。我曾经遇到过把DAQ周期设成1ms的情况,结果CAN总线直接被ECU的数据淹没了,其他报文都发不出去。一般建议至少5ms以上,具体看总线负载。

3.4 标定模式:STIM(Stimulation)

STIM是DAQ的“反向操作”。它让主设备按照周期,自动往ECU发送标定数据。

什么时候用STIM?

  • 在线标定:一边运行一边修改参数
  • 批量写入:同时更新多个标定值
  • 实时控制:比如在HIL测试中模拟传感器信号

3.4.1 STIM的工作原理

STIM和DAQ是对称的:

  • DAQ:ECU -> 主设备(测量数据)
  • STIM:主设备 -> ECU(标定数据)

配置STIM时,你需要:

  1. 定义STIM的ODT,指定要写入的变量地址
  2. 设置发送周期
  3. 主设备按周期发送CRO报文(其实是STIM-DTO,但通过CRO通道发送)

嗯,这里要注意:STIM的报文格式和DAQ的DTO很像,但方向相反。主设备发送的STIM报文,PID从0x00到0xFE,数据内容就是你要写入的变量值。

避坑指南:我曾经在STIM模式下犯过一个低级错误——忘记检查ECU的“写保护”状态。有些ECU在运行状态下不允许写入标定数据,必须先发送SET_S_STATUS命令解锁。否则你发再多STIM数据,ECU都不理你。

3.5 常用CCP命令一览

CCP定义了约20条命令,但日常标定常用的就这几条:

命令ID 命令名称 功能
0x01 CONNECT 建立连接,获取ECU信息
0x02 GET_CCP_VERSION 获取CCP协议版本
0x03 EXCHANGE_ID 交换设备ID
0x12 SET_MTA 设置内存传输地址
0x13 UPLOAD 从ECU读取数据
0x14 DOWNLOAD 向ECU写入数据
0x15 DOWNLOAD_6 写入6字节数据(优化版)
0x1C SET_S_STATUS 设置ECU状态(如解锁写保护)
0x1D GET_S_STATUS 获取ECU状态
0x20 SET_DAQ_PTR 配置DAQ的ODT
0x21 WRITE_DAQ 写入DAQ配置
0x22 START_STOP 启动/停止DAQ或STIM
0x23 START_STOP_ALL 启动/停止所有DAQ

我建议你重点记住CONNECT、SET_MTA、UPLOAD、DOWNLOAD和START_STOP这五条。其他命令可以在需要时查手册。

3.6 实际标定中的CCP流程

一个典型的CCP标定会话是这样的:

  1. 连接:发送CONNECT命令,ECU回复CRM,包含协议版本和状态
  2. 获取信息:发送EXCHANGE_ID,获取ECU的ID信息
  3. 配置DAQ:使用SET_DAQ_PTR和WRITE_DAQ,定义要测量的变量
  4. 启动测量:发送START_STOP,启动DAQ,ECU开始周期性发送数据
  5. 在线标定:使用SET_MTA和DOWNLOAD,修改标定参数
  6. 停止测量:发送START_STOP,停止DAQ
  7. 断开连接:发送DISCONNECT命令

经验之谈:我习惯在连接后先发送GET_S_STATUS,检查ECU是否处于“可标定”状态。如果状态不对,先发SET_S_STATUS解锁。这一步能避免很多莫名其妙的问题。

3.7 CCP的局限性

CCP虽然经典,但也不是万能的。我总结了几点:

  • CAN带宽限制:8字节数据场,一次最多传7字节有效数据。大数据量传输很慢
  • 无分段传输:超过8字节的数据需要多次UPLOAD/DOWNLOAD,效率低
  • 无加密认证:所有数据明文传输,安全性差
  • 单主设备:一个CCP会话只能有一个主设备

正因为这些限制,后来才出现了XCP协议。但CCP作为基础,你搞懂了它,学XCP会轻松很多。

好了,CCP协议的核心内容就这些。下一章我们讲XCP,看看它怎么解决CCP的痛点。

总结:CCP是CAN总线上的标定协议,核心是CRO/DTO的主从通信。DAQ用于周期性测量,STIM用于周期性标定。掌握CCP,你就掌握了ECU标定的基本功。