1 概述
CCP通信按信息传输方式分为:POLLING(问答)和DAQ方式
按功能模式分为三种:SESSION(会话)、CAL(标定)、DAQ(查询)
工作流程一般为,程序初始化完成后,通过SET_S_STATE设置节点当前工作状态(Session/CAL/DAQ),若触发CAL和DAQ,需要在初始化时对该功能进行初始化。
正常情况下设置为会话模式(SESSION),需要CAL和DAQ时在进行初始化。
可以看出CCP通信协议的分为这四大模块,初始化、会话、标定、DAQ数据传输。
PS:“冷启动”包含:
① 连接:建立主从设备之间的逻辑连接,
② seed&key 登录程序,
③ 自动会话配置(EXCHANGE ID),除非被覆盖,
④ 自动代码更新,如果主设备支持。
1.1.初始化
应用程序完成CAN Driver初始化后,调用CCP功能前需要对其进行初始化,按顺序如下:
命令 |
描述 |
备注 |
TEST |
物理连接 |
测试是否物理连接建立起来,返回ECU的station address,该命令在可选命令中 |
CONNECT |
通信连接 |
建立点对点(master-slave)的物理链接,声明接下来的命令都是针对当前从节点发送的,直到另一从节点被选中,此时当前的节点处于暂时断开状态。从设备不响应任何指令,除非先用带正确station address信息的CONNECT命令链接。 |
GET_CCP_VERSION |
获取CCP版本 |
协议三原则:大版本号一定要相同;小版本号主节点大于等于从节点主节点支持有Non-Optional命令(初始化) |
EXCHANGE_ID |
交换ID |
CCP主站和从站交换id以实现自动会话配置。根据从服务器返回的ID,可能包含自动分配数据采集设置文件(Plug’n’Play)。 |
GET_SEED |
获取SEED |
EXCHANGE_ID 执行完后,自动将MTA0设置到相关位置,接到该命令后返回SEED,用来加密交互。 |
UNLOCK |
发送KEY解锁 |
与SEED和加密style配合,计算出Key,返回功能权限信息,三种权限CAL、DAQ及PGM需要三次破解。 |
SET_S_STATUS |
设置状态位 |
设置ECU内CCP通信状态,一般进入等待状态。bit 0 CAL初始化完成; bit 1 DAQ初始化完成 ;bit 2 保存DAQlist设置,上电开始传输;bit 6 CAL参数掉电不丢失 ;bit 7 Session in progress |
解锁完成后,依据任务的分配,系统工作状态可以设置为以下三种状态:
- ① 等待会话状态,接收命令,触发命令操作
- ② 继续初始化CAL和DAQ,例如:设置DAQ掉电不丢失,上电自动传输,此时需要设置为DAQ初始化完成状态
- ③ DISCONNECT,休眠当前节点。多ECU并行工作时,初始化时把所有节点都初始化,断开连接把每个ECU设置为休眠状态,通过CONNECT再唤醒具体ECU,切换工作。单节点工作时不需要此命令,直接进入某种工作状态。
1.2.会话状态
会话状态主要定义具体应用协议,接受具体代码,执行相关命令,返回结果数据。典型函数两条:
- ACTION SERVICE:行动响应(Action Service)
- DIAG SERVICE:诊断服务(Diagnostic Service)
都是先发送协议命令,从节点接收到命令信息后按照执行具体行动,并自动设置MTA0到要返回的数据存储首地址,通过DTO带回要返回信息长度。信息量大时调用UPLOAD读取,信息量小于3bytes,直接附在DTO未定义位返回,例如执行结果,增加执行效率。
UPLOAD、DNLOAD两个函数也可以实现会话服务,但传递数据需要先调用SETMTA指定具体存储地址,容易造成内存区存储混乱,且传输效率低,主要应用于批量数据传输。而
ACTION SERVICE和DIAG SERVICE传递的是握手信息,不需要明确传递参数的具体存储地址。DNLOAD 6相同。
SHORT UP与UPLOAD命令区别在于和MTA0无关,
CRO自带存储区首地址,且执行完后MTA0不自增,适用于小量单次数据上传。
2.CCP具体功能的实现例子
2.1.Session log-in
CONNECT (逻辑连接)
CRO |
0x01 |
0x45 |
0x00 |
0x02 |
|
|
|
|
DTO |
0xFF |
0x00 |
0x45 |
|
|
|
|
|
GET_CCP_VERSION (版本一致)
CRO |
0x1B |
0x27 |
0x02 |
0x01 |
|
|
|
|
DTO |
0xFF |
0x00 |
0x27 |
0x02 |
0x01 |
|
|
|
EXCHANGE_ID (交换身份标识)
CRO |
0x17 |
0x23 |
|
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
0x04 |
0x02 |
0x03 |
0x03 |
|
GET_SEED (得到秘钥种子,返回秘钥)
CRO |
0x12 |
0x23 |
0x02 |
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
0x01 |
0x14 |
0x15 |
0x16 |
0x17 |
UNLOCK (通过接收到的秘钥,解除保护)
CRO |
0x13 |
0x23 |
0x14 |
0x15 |
0x16 |
0x17 |
|
|
DTO |
0xFF |
0x00 |
0x23 |
0x02 |
|
|
|
|
SET_S_STATUS (设置会话状态,设置一个或多个状态位)
CRO |
0x0C |
0x23 |
0x81 |
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
2.2.Calibration Data Initialization
CONNECT (连接,如果已经连接,跳过)
CRO |
0x01 |
0x45 |
0x00 |
0x02 |
|
|
|
|
DTO |
0xFF |
0x00 |
0x45 |
|
|
|
|
|
SET_S_STATUS (设置会话状态(xxxx xxx0)CAL=off)
CRO |
0x0C |
0x23 |
0x81 |
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
Loop
SET_MTA (设置内存传输地址到目的块)
CRO |
0x02 |
0x23 |
0x00 |
0x02 |
0x34 |
0x00 |
0x20 |
0x00 |
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
BUILD_CHKSUM (构建内存块的校验和)
CRO |
0x0E |
0x23 |
0x00 |
0x00 |
0x80 |
0x00 |
|
|
DTO |
0xFF |
0x00 |
0x23 |
0x02 |
0x12 |
0x34 |
|
|
DOWNLOAD (下载,如果校验和不匹配)
CRO |
0x03 |
0x23 |
0x05 |
0x10 |
0x11 |
0x12 |
0x13 |
0x14 |
DTO |
0xFF |
0x00 |
0x23 |
0x02 |
0x34 |
0x00 |
0x20 |
0x05 |
SELECT_CAL_PAGE (选择标定数据页)
CRO |
0x11 |
0x23 |
|
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
SET_S_STATUS (设置会话状态 bit CAL=1(xxxx xxx1))
CRO |
0x0C |
0x23 |
0x81 |
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
2.3.DAQ list Initialization
CONNECT (连接,如果已经连接,跳过)
CRO |
0x01 |
0x45 |
0x00 |
0x02 |
|
|
|
|
DTO |
0xFF |
0x00 |
0x45 |
|
|
|
|
|
SET_S_STATUS (设置会话状态 DAQ=0(xxxx xx|0x))
CRO |
0x0C |
0x23 |
0x81 |
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
GET_DAQ_SIZE (分配DAQ列表,参考Organization of DAQ)
CRO |
0x14 |
0x23 |
0x03 |
------ |
0x01 |
0x02 |
0x03 |
0x04 |
DTO |
0xFF |
0x00 |
0x23 |
0x10 |
0x08 |
|
|
|
Loop
SET_DAQ_PTR (设置目标指针)
CRO |
0x15 |
0x23 |
0x03 |
0x05 |
0x02 |
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
WRITE_DAQ (写列表数据)
CRO |
0x15 |
0x23 |
0x02 |
0x01 |
0x02 |
0x00 |
0x42 |
0x00 |
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
SET_S_STATUS (设置会话状态 DAQ=1(xxxx xx1x))
CRO |
0x0C |
0x23 |
0x81 |
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
STATRT_STOP (开始DAQ- DTOs的数据传输,设置参数)
CRO |
0x06 |
0x23 |
0x01 |
0x03 |
0x07 |
0x02 |
0x00 |
0x01 |
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
2.4.Code Update
CONNECT (连接,如果已经连接,跳过)
CRO |
0x01 |
0x45 |
0x00 |
0x02 |
|
|
|
|
DTO |
0xFF |
0x00 |
0x45 |
|
|
|
|
|
SET_MTA (设置内存传输地址到开始地址)
CRO |
0x02 |
0x23 |
0x00 |
0x02 |
0x34 |
0x00 |
0x20 |
0x00 |
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
CLEAR_MEMORY (清除从设备的内存)
CRO |
0x10 |
0x23 |
0x00 |
0x00 |
0x80 |
0x20 |
|
|
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
Loop
PROGRAM (程序 取决于扇区或设备的大小)
CRO |
0x18 |
0x23 |
0x03 |
0x10 |
0x11 |
0x12 |
|
|
DTO |
0xFF |
0x00 |
0x23 |
0x02 |
0x34 |
0x00 |
0x20 |
0x03 |
PROGRAM (SIZE=0,程序结束)
CRO |
0x18 |
0x23 |
0x03 |
0x10 |
0x11 |
0x12 |
|
|
DTO |
0xFF |
0x00 |
0x23 |
0x02 |
0x34 |
0x00 |
0x20 |
0x03 |
2.5.Block DownLoad
CONNECT (连接,如果已经连接,跳过)
CRO |
0x01 |
0x45 |
0x00 |
0x02 |
|
|
|
|
DTO |
0xFF |
0x00 |
0x45 |
|
|
|
|
|
SET_MTA (设置内存传输地址到目的块)
CRO |
0x02 |
0x23 |
0x00 |
0x02 |
0x34 |
0x00 |
0x20 |
0x00 |
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
DOWNLOAD (下载,相应的数据块大小被下载)
CRO |
0x03 |
0x23 |
0x05 |
0x10 |
0x11 |
0x12 |
0x13 |
0x14 |
DTO |
0xFF |
0x00 |
0x23 |
0x02 |
0x34 |
0x00 |
0x20 |
0x05 |
2.6.Block UpLoad
CONNECT (连接,如果已经连接,跳过)
CRO |
0x01 |
0x45 |
0x00 |
0x02 |
|
|
|
|
DTO |
0xFF |
0x00 |
0x45 |
|
|
|
|
|
SET_MTA (设置内存传输地址到源数据块)
CRO |
0x02 |
0x23 |
0x00 |
0x02 |
0x34 |
0x00 |
0x20 |
0x00 |
DTO |
0xFF |
0x00 |
0x23 |
|
|
|
|
|
UPLOAD (上传)
CRO |
0x04 |
0x23 |
0x04 |
|
|
|
|
|
DTO |
0xFF |
0x00 |
0x23 |
0x10 |
0x11 |
0x12 |
0x13 |
|
3.附录:
错误码矩阵