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的工作流程分三步:
- 配置ODT(Object Descriptor Table):告诉ECU要采集哪些变量,每个变量占几个字节
- 启动DAQ:ECU开始按周期发送数据
- 接收数据:主设备解析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时,你需要:
- 定义STIM的ODT,指定要写入的变量地址
- 设置发送周期
- 主设备按周期发送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标定会话是这样的:
- 连接:发送CONNECT命令,ECU回复CRM,包含协议版本和状态
- 获取信息:发送EXCHANGE_ID,获取ECU的ID信息
- 配置DAQ:使用SET_DAQ_PTR和WRITE_DAQ,定义要测量的变量
- 启动测量:发送START_STOP,启动DAQ,ECU开始周期性发送数据
- 在线标定:使用SET_MTA和DOWNLOAD,修改标定参数
- 停止测量:发送START_STOP,停止DAQ
- 断开连接:发送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标定的基本功。