ccp协议代码
- 格式:docx
- 大小:38.96 KB
- 文档页数:19
CCP(Client-Server Protocol)协议是一种常用的网络通信协议,它允许客户端和服务器之间进行数据传输和交互。
CCP协议通常用于文件传输、远程登录、网络通信等场景。
以下是CCP协议的基本代码实现,使用Python语言编写:```pythonimport socket# 创建TCP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定IP地址和端口号server_address = ('localhost', 8000)sock.bind(server_address)# 监听连接请求sock.listen(1)while True:# 接受客户端连接请求并建立连接print('等待客户端连接...')connection, client_address = sock.accept()try:print('连接来自', client_address)# 接收客户端发送的数据data = connection.recv(1024)print('收到数据:', data.decode())# 向客户端发送响应数据response = '文件已下载成功'connection.sendall(response.encode())finally:# 关闭连接connection.close()```这段代码创建了一个TCP套接字,绑定到本地IP地址和端口号8000上,并开始监听连接请求。
当有客户端连接请求时,程序会接受连接请求并建立连接,接收客户端发送的数据,向客户端发送响应数据,最后关闭连接。
需要注意的是,这段代码只是一个简单的示例,实际应用中还需要考虑更多的细节和异常处理。
在实际应用中,CCP协议的实现可能会涉及到更多的细节和复杂度,例如加密、身份验证、数据传输格式等。
ccp协议详解一、CCP协议简介P协议定义CCP(Credit Counterparty Protocol,信用对手方协议)是一种金融衍生品交易中的风险管理协议,旨在保障交易双方的权益,降低交易风险。
P协议的目的CCP协议的主要目的是在金融市场中,为交易双方提供一个公平、透明、稳定的交易环境,防止交易违约风险,维护市场的稳定运行。
P协议的适用场景CCP协议主要适用于金融衍生品交易,如期货、期权、互换等,涉及信用风险的交易场景。
二、CCP协议的主要内容1.交易双方的权益保障CCP协议为交易双方提供了一定程度的权益保障。
例如,当交易一方发生违约事件时,另一方可以根据协议约定采取相应措施,如终止交易、要求赔偿等。
2.交易过程中的风险管理CCP协议对交易过程中的风险进行有效管理。
协议规定了交易双方在交易过程中的义务与责任,如交易保证金、追加保证金等。
3.争议解决机制CCP协议中设立了争议解决机制,包括调解、仲裁、诉讼等,有助于及时化解交易过程中的纠纷,保障交易顺利进行。
三、CCP协议的执行流程1.签署CCP协议交易双方在开展金融衍生品交易前,需签署CCP协议,明确双方的权利和义务。
2.交易双方的义务与责任根据CCP协议,交易双方在交易过程中需履行相应的义务与责任,如按时缴纳保证金、遵守交易规则等。
3.违约处理与救济措施当交易一方发生违约事件时,另一方可根据CCP协议采取相应救济措施,如要求赔偿、终止交易等。
四、CCP协议在我国的应用与发展1.我国CCP协议的现状近年来,我国金融市场逐渐成熟,CCP协议在我国的应用越来越广泛,涉及期货、期权、互换等多种金融衍生品交易。
2.我国CCP协议的监管政策我国监管部门高度重视CCP协议在金融市场中的作用,出台了一系列监管政策,规范CCP协议的签署与执行。
3.我国CCP协议的推广与发展随着我国金融市场的不断拓展,CCP协议在降低交易风险、维护市场稳定方面将发挥更加重要的作用,有望在未来得到更广泛的推广与应用。
ccp协议详解摘要:一、CCP协议简介P协议定义P协议的目的P协议的适用场景二、CCP协议的核心内容1.交易流程2.信用评级3.争议解决机制三、CCP协议的优势1.提高交易效率2.降低交易风险3.保障交易安全四、我国CCP协议的应用与发展1.我国CCP协议市场现状2.我国CCP协议的政策支持3.我国CCP协议的未来发展趋势五、如何参与CCP协议1.参与CCP协议的条件2.参与CCP协议的流程3.参与CCP协议的注意事项正文:一、CCP协议简介P协议定义CCP(Credit Conversion Protocol,信用转换协议)是一种金融衍生品,旨在解决电子商务交易中买卖双方的信用问题。
通过CCP协议,可以为交易双方提供信用评级、交易保障等一站式服务,降低交易风险。
P协议的目的CCP协议的主要目的是建立一个公平、透明、可信的交易环境,提高电子商务的交易成功率。
通过信用评级、争议解决等机制,降低交易风险,保障交易安全。
P协议的适用场景CCP协议适用于各类电子商务交易场景,尤其是涉及到信用风险较高的领域,如金融衍生品、跨境贸易、供应链金融等。
二、CCP协议的核心内容1.交易流程CCP协议对交易流程进行了标准化,包括交易双方的注册、信用评级、交易撮合、交易履行等环节。
通过明确的流程,提高交易效率。
2.信用评级CCP协议通过对交易双方的信用评级,为买卖双方提供一个可靠的信用参考。
评级依据包括交易记录、信用评级、履约能力等多方面因素。
3.争议解决机制CCP协议设立了一套完善的争议解决机制,包括调解、仲裁、诉讼等途径。
在发生争议时,能够快速、公正地解决问题,保障交易顺利进行。
三、CCP协议的优势1.提高交易效率CCP协议通过标准化交易流程,降低了交易复杂度,使买卖双方能够快速完成交易。
2.降低交易风险CCP协议为交易双方提供了信用评级,使买卖双方能够更好地了解对方信用状况,降低交易风险。
3.保障交易安全CCP协议设有争议解决机制,能够在发生问题时快速采取措施,保障交易安全。
CCP协议简介与INCA信息交互详细流程P协议CCP协议属于CAN总线应用层协议,支持CAN2.0B(标准帧或扩展帧),采用主-从通信模式。
收发各使用一个ID,分别为CRO(命令接收消息),DTO(数据发送消息)。
ID可自行约定。
1.2数据发送消息DTO(c1.3CCP命令代码表P协议中Memory操作方法标定功能主要实现的目标:(1)修改RAM中数据(在线标定);(2)修改EEPROM中数据(外部EEPROM,16K)(3)修改Flash中数据(标定参数)2.1Flash标定流程(1)将标定数据保存在Flash中,存储地址0x00C20000 – 0x00C3FFFF。
(2)在程序初始化过程中,标定数据映射至RAM当中,程序从RAM中调取数据。
(3)标定过程开始时,在上位机中建立Flash存储区镜像,并保存至HEX文件。
(4)标定过程中,通过DNLOAD,DNLOAD_6等命令修改RAM中数据,实现在线标定,更新上位机Hex。
(5)标定结束后,将更新后的数据,一次性写入Flash。
(6)重启控制器,将新的标定数据映射值RAM中。
3.各操作具体流程命令接收消息CCP_CRO_ID: 0x100数据发送消息CCP_DTO_ID: 0x1013.1硬件初始化点击INCA中硬件初始化按钮,进行ECU初始化操作(1)联机(建立INCA与ECU的逻辑连接)无Seed&Key校验序号CMD 名称功能(2)将ECU Flash中数据映射到RAM中(3)INCA进行CHECKSUM操作计算ECU RAM中标定数据校验和,确认ECU与INCA中数据是否一致。
(4)选择当前标定页3.2存储页- DownLoad操作INCA存储页中DownLaod操作,数据流向:INCA : WP –> ECU: RAM序号CMD 名称功能INCA存储页中Copy操作,数据流向:INCA: RP –> INCA: WPECU: Flash –> ECU: RAMINCA存储页中Copy操作,数据流向:ECU: RAM –> INCA: WPECU: RAM –> INCA: RP序号CMD 名称功能3.5存储页– Flash Program 操作3.5.1仅标定数据刷写(Data)3.6实验环境– WP/RP 切换在INCA实验环境中实现对WP/RP的切换(1)PR -> WP序号CMD 名称功能(2)WR -> RP3.7实验环境–标定量/MAP数据更改在INCA实验环境中,WP操作模式下,进行标定量修改或者修改MAP数据。
ccp标定协议的daq详解CCP标定协议的DAQ详解CCP(CAN Calibration Protocol)标定协议是一种用于汽车电子控制单元(ECU)标定和诊断的通信协议。
CCP协议通过数据采集器(DAQ)与ECU进行通信,实现参数的标定和监测。
本文将详细解释CCP标定协议中的数据采集器(DAQ)的工作原理和功能。
一、数据采集器(DAQ)的概述数据采集器(DAQ)是CCP标定协议中的重要组成部分,它负责与ECU进行通信,并将数据传输给标定工具进行处理。
数据采集器通常由硬件和软件两部分组成,硬件部分负责与ECU进行物理连接,而软件部分则负责控制数据的采集和传输。
二、数据采集器(DAQ)的工作原理1. 连接与通信:数据采集器通过物理接口(如CAN总线)与ECU进行连接。
一旦建立连接,数据采集器将发送请求命令给ECU,并接收ECU返回的响应数据。
数据采集器和ECU之间的通信遵循CCP协议规定的通信流程和数据格式。
2. 数据采集和传输:数据采集器在与ECU通信的过程中,会周期性地采集ECU内部的参数值,并将其保存在缓冲区中。
采集的数据可以是传感器的实时数据、ECU内部寄存器的数值等。
数据采集器还可以根据标定工具的要求,对特定的参数进行单点采集或连续采集。
3. 数据处理和传输:数据采集器将采集到的数据传输给标定工具进行处理。
传输方式可以是通过USB、以太网等物理接口,也可以通过无线方式进行传输。
传输的数据格式通常是CCP协议规定的格式,标定工具可以解析这些数据,并进行相应的处理和显示。
三、数据采集器(DAQ)的功能1. 参数标定:数据采集器可以通过CCP协议与ECU进行双向通信,实现对ECU内部参数的标定。
标定过程中,数据采集器向ECU发送标定命令,ECU根据命令执行相应的操作,并将标定结果返回给数据采集器。
标定工具可以通过数据采集器显示和修改参数的值,以达到优化ECU性能的目的。
2. 参数监测:数据采集器可以实时采集ECU内部的参数数值,并将其显示在标定工具的界面上。
1 导言1.1 ASAPASAP规则(校准系统标准化规则)成立于Audi AG,BWM AG,Mercedes-Benz AG,Porsche AG 和V olkswagen AG 公司。
欧洲的汽车工业测试与改进系统的汽车制造商和电子控制制造商都已经加入了这个标准。
世界汽车技术已经进入了复杂电子系统结构来满足不断增加的排气限制、环境污染保护,安全系统,驾驶性能和车身设备选择的法律规定要求。
一些汽车制造商通过网络使用了车辆分配控制系统。
为了改进这个新的电子汽车时代,高新的复杂软件,标定、测量与诊断仪器已经被运用。
但此刻,对于这些设备几乎已经没有一个软件接口的标准了,每家公司都有自己独立的系统和接口来支持这些高新的构造。
因此,ASAP的任务是要实现共同的协议和标准在:♦所有用于测量,标定和诊断的设备的自动控制,模块化和兼容性。
♦管理一个消耗合理的,可预测的设备供应市场。
1.2 CAN标定协议(CCP)控制器局域网CAN 是Robert Bosch GmbH 与Intel公司的共同的成果。
CAN用于许多汽车控制系统如发动机控制,以及工业控制系统。
各半导体制造商都有能力提供CAN控制芯片。
CAN标定协议时ASAP标准的一部分。
它被Ingenieurburo Helmut Kleinknecht(一个标定系统的制作者)改进和引用。
它被用于汽车工业的一些应用程序之中。
ASAP工作组采纳CCP并扩展其可选的功能。
2、应用范围和领域这文件根据包含ASAP在内的工作小组的定义,详细说明CCP协议。
CCP定义了带有主设备的控制器的通信协议采用CAN2.0B(11-bit和29-bit标示符),它包含了2.0A(11-bit标示符),来进行:1.从控制器获得数据2.存储器转移和控制其用于标定的功能程序提供这些功能的CCP可以用于这些领域♦改进ECU♦ECU的功能和外围测试的系统♦控制设备的系统测试和持久性测试。
♦汽车在线测试和测量系统♦任何基于CAN的电子分配控制系统的非汽车应用程序3、相关文件Intel公司的说明文件和数据表82527系列的通信控制器数据(Intel #272250)82527系列的通信控制器构架概述(Intel #272410)控制器局域网协议导论(Intel #270962)5、定义和缩写CANController Area Network :Robert Bosch GmbH所改进和持有的通信协议(ISO/OSI模型等级1+2)。
leehuabo@CCP协议本文源于《CAN Calibration Protocol Version 2.1》,各章节与原文章节对应,部分内容直接翻译,前1到5章无关紧要的部分及12章对各命令的详细描述省略;第6和第7章为CCP协议的主体内容;6 Protocol definitionCCP是以一个或多个ECU为Slave,一个主控设备(host,通常为PC及工具软件)为Master 的主从模式连接在一个CAN总线上;主控设备Master可能为:标定工具、诊断工具、监控工具、测量工具ECU从设备则主要体现为两个功能集:标定(基本的内存传输),数据采集;这两个功能根据Slave的实现,可以同时使用,也可以不同时使用;根据需要,Master或者Slave可以只实现其需要的功能或全部功能。
6.1 Generic Control CommandsMaster负责发命令,Slave负责执行命令,在此之前Master和Slave要建立逻辑连接,Master 选择一个新的Slave或者明确通过命令都可以断开连接;逻辑连接建立后,从Master到Slave的数据,或者从Slave到Master的数据,都受Master所控制;所有由Master发出的命令都必须由被选定的Slave通过一个握手消息(命令返回码或错误码)来给出提示(反馈)6.2 Data Acquisition Commands这些命令用于Slave设备连续的数据采集;在此之前Master需要使用命令对Slave进行参数列表配置,这个列表给出了哪些参数是需要采集的。
然后Master启动数据传输;之后Slave 将根据固定的采集周期(也有可能是事件触发的)传输数据;7 Message Objects7.1 Organisation of Message Objects消息对象(MO)来源于CAN的定义,也就是一帧CAN消息;CCP需要至少2个MO分别用于2个方向的数据流(以ECU/Slave视角为基准):1)CRO: Command Receive Object2)DTO: Data Transmission ObjectCRO: 接收命令和参数DTO: 向Master返回:1)prompt/response of CRO,即Command Returen Message2)返回数据给MasterCommunication flow between CCP master and slave devices以上对象的消息ID的分配定义在Slave device description file中(比如ASAP2格式描述文件),这个文件用来配置Master设备;对象消息在总线上的优先级应该非常小心地确定,以免影响总线上其它的实时通信;因此CRO应该比DTO的优先级高;CCP协议本身不规定字节序,因为这个取决于ECU的CPU,也就是Master必须事先配置好Slave所使用的CPU的字节序(大小端),这个通常在ASAP2描述文件中;7.2 Description of Message Objects不作特别说明,默认一个object总共是8个字节(一个CAN帧)7.2.1 Command Receive Object CROCRO用于接收命令及参数,总共8个字节(一个CAN帧)CRO struct{UINT8 CMD; // byte 0, command codeUINT8 CTR; // byte 1, command counterUINT8 para_and_data[6]; // byte 2…7, command related parameter and data area }像一般的CAN数据一样,这里CRO的DLC(data length code)总是8, 不满8个填充即可;7.2.2 Data Transmission Object DTODTO指Slave 发到Master的消息和数据,总共8个字节(一个CAN帧),它可能是几种不同的消息,不同类型的消息(CRM, EventMessage, DataAcquisition)通过位于第0字节的PID来区别:1.CRM:Command Return Message, an answer to a CRODTO struct{UINT8 PID = 0xFF; // CRM, Command Return MessageUINT8 ERR; // Command Return/Error CodeUINT8 CTR; // Command Counter,最近一次收到的CRO的CTRUINT8 para_and_data[5]; // Parameter and Data Field}2.Event Message: DTO可能报告Slave/ECU内部状态的变化,以此调用错误恢复或其它服务,详见章节:Error HandlingDTO struct{UINT8 PID = 0xFE; // EventMessageUINT8 ERR; // Command Return/Error CodeUINT8 CTR; // don’t careUINT8 para_and_data[5]; // Parameter and Data Field}3.Data Acquisition Message,此时Packet ID指向相应的ODT(Object DescriptorTable),ODT描述了接下来的数据包含了哪些元素(变量等),ODT可以通过CCP命令设置修改;DTO struct{UINT8 PID = n; // ODTnUINT8 data[7]; // DAQ Data Field}这里DLC可以被设置为实际的大小7.3 Organisation of Data AcquisitionMaster可以发起对Slave设备数据采集的初始化,之后Slave会发送DAQ-DTOs中定义的数据;数据元素的组织如下:ECU内存中的数据元素由ODT指定,ODT表中含有地址,地址扩展以及数据长度,一个ODT 最多可以引用7个数据元素;ODT所指定的数据元素的内容应该放到一个DAQ Message类型的DTO中,然后发送给Master;为了节省ECU内存资源,地址扩展以及数据长度都只是可选项。
CCP 协议CAN 标定协议内容1介绍1.1 尽快地1.2 CAN 标定协议 (CCP)2范围与应用领域3相关的文件4校订历史记录5定义与缩写6协议定义6.1 一般的控制命令6.2 数据获取命令7消息对象7.1 消息对象的组织7.2 消息对象的描述7.2.1命令接收对象CRO7.2.2数据传输对象DTO(从到主)7.3 数据获取的组织8版本机制9版本相容性10命令码的表11命令返回码的表12命令描述12.1 连接12.2 交换站监别12.3 获得传播密匙12.4 开启保护12.5 设置存储器传递位址12.6 数据下载12.7 数据下载 6 个字节12.8 数据上传12.9 短上传12.10 选择标定数据页12.11 获得 DAQ(获取 ECU数据 ) 列表12.12 设置 DAQ(获取 ECU数据 )列表指标12.13 写 DAQ(获取 ECU数据 ) 列表项目12.14 开始 /停止数据传输12.15 分离12.16 设置期间状态12.17 得到期间状态12.18 建立核对和12.19 清除存储器12.20 规划12.21 规划 6 个字节12.22 移动存储器区块12.23 诊断的服务12.24 行动服务12.25 测试可用率12.26 启动 /停止同步化语数据传送12.27 现在激活标定页12.28 实现 CCP 的版本13出错处理14例子顺序14.1 期间航行日志 - 在14.2 区块下载14.3 区块上传14.4 标定数据初始化14.5 DAQ( 获取 ECU数据 )列表初始化14.6 码更新15预期的作业等级16附录16.1 错误码的矩阵16.2 广播传送的应用技术1 介绍1.1 ASAPASAP特别工作小组 ( 出自 Applikati在s systemen的Arbeitskreis zur Standardisierung; 英国人翻译 :应用/标定系统任务动力的标准化)是被公司Audi AG , BMW1 AG,宾士汽车 - 宾士汽车 AG 发现 , 保时捷 AG 与大众汽车AG。
/***************************************************************************** | Project Name: C C P - Driver| File Name: CCP.C|| Description:| Implements the CCP module .| used by the CANape CAN Calibration Tool.||-----------------------------------------------------------------------------| C O P Y R I G H T|-----------------------------------------------------------------------------| Copyright (c) 2001-2003 by Vector Informatik GmbH. All rights reserved.|-----------------------------------------------------------------------------| A U T H O R I D E N T I T Y|-----------------------------------------------------------------------------| Initials Name Company| -------- --------------------- -------------------------------------| Bus Sabine B點herl Vector Informatik GmbH| Ds Sven Deckardt Vector Informatik GmbH| Hp Armin Happel Vector Informatik GmbH| Tri Frank Triem Vector Informatik GmbH| Za Rainer Zaiser Vector Informatik GmbH|-----------------------------------------------------------------------------| R E V I S I O N H I S T O R Y|-----------------------------------------------------------------------------| Date Version Author Description| ---------- ------- ------ -----------------------------------------------| 2000-24-09 1.29.00 Za - New define CCP_CHECKSUM_BLOCKSIZE| 2000-29-11 1.30.00 Za - #ifndef CCP_EXTERNAL_STATION_ID| 2001-08-02 1.31.00 Za - new define CCP_DAQ_BASE_ADDR| - new function ccpGetDaqPointer| 2001-30-05 1.32.00 Za - Reserved word "data" in KEIL Compiler for C5x5| - Prefix CCP_ for all #defines| 2001-14-09 1.33.00 Za - #define CCP_ODT_ENTRY_SIZE| - #define CCP_INTEL,CCP_MOTOROLA| 2001-28-10 1.34.00 Za - ccpSend return value removed| - Transmission error handling should be done by the user | 2002-08-04 1.35.00 Za - #define CCP_CPUTYPE_32BIT| - Max checksum block size is DWORD on 32 bit CPUs| 2002-02-06 1.36.00 Za - #undef CCP_DAQ for drivers without DAQ fixed| - double - float conversion for SHORT_UPLOAD, DNLOAD and DAQ| 2002-17-07 1.37.00 Ds - Fixed the version nr. because the version was in| the comment 1.36 but 135 was define.| - Set #define CCP_DRIVER_VERSION to 137| 2002-14-11 1.37.01 Hp - define CCP_MAX_DAQ only if CCP_DAQ is defined| 2002-27-11 1.37.02 Ds - delete the query of extended id| 2003-05-28 1.37.02 Bus - added V_MEMROM0| 2003-08-11 1.37.03 Tri - implemented P_MEM_ROM and P_MEM_RAM to support M16C Mitsubishi.| 2003-10-14 1.38.00 Tri - version skipped due to special version for TMS320| 2003-10-14 1.39.00 Tri - version skipped due to special version for TMS320| 2003-10-14 1.40.00 Tri - merge of versions: 1.37.03, 1.37.02| 2003-10-16 1.41.00 Ds - minor bugfix set ROM to CCP_ROM| 2003-10-16 1.41.01 Ds - change the position of CCP_ROM| 2003-10-21 1.42.00 Tri - change the position of CCP_ROM|***************************************************************************//* CCP Definitions and Parameters */#include "ccp.h"#ifndef C_DISABLE_CCP/****************************************************************************** //* Version check */ /****************************************************************************** /#if( CCP_DRIVER_VERSION != 142)#error "Source and Header file of CCP-Module inconsistent!"#endif#if( CCP_DRIVER_BUGFIX_VERSION != 0)#error "Source and Header file of CCP-Module inconsistent!"#endif#if( CCP_DRIVER_VERSION > 255)#error "Version decreased in CCP-Module"#endif/*--------------------------------------------------------------------------*//* Performance measurements */#ifndef CCP_PROFILE#define SET_PORT_BIT(i)#define RST_PORT_BIT(i)#else/*t[0] - ccpCommandt[1] - ccpCallBackt[2] - ccpBackgroundt[3] - ccpDaq*/unsigned int t0[4],t[4];#define SET_PORT_BIT(i) t0[i-1]=ccpGetTimestamp();#define RST_PORT_BIT(i) t[i-1]=T3-t0[i-1];#endif/*--------------------------------------------------------------------------*//* Test */#ifdef CCP_TESTMODE#include <stdio.h>static void ccpPrintCANapeSettings( void );static void ccpPrintDaqList( CCP_BYTE daq );#endif/*--------------------------------------------------------------------------*//* ROM *//*--------------------------------------------------------------------------*//*IdentificationMust be 0 terminated !!This string is used by CANape as the ASAP2 database filenameThe extension .A2L or .DB is added by CANape*/#ifdef CCP_EXTERNAL_STATION_IDCCP_MEMROM0 extern CCP_ROM CCP_BYTE ccpStationId[];#elseCCP_MEMROM0 CCP_ROM CCP_BYTE ccpStationId[] = CCP_STATION_ID; #endif/*--------------------------------------------------------------------------*//* RAM *//*--------------------------------------------------------------------------*//*The following structure containes all RAM locations needed by the CCP driver It has to be word aligned on a C167 !!!*//* ##Hp - rename struct ccp */CCP_RAM struct ccp ccp;/*--------------------------------------------------------------------------*//* CODE *//*--------------------------------------------------------------------------*//*--------------------------------------------------------------------------*//* Transmit *//*--------------------------------------------------------------------------*//* Send a CRM, if no other message is pending */void ccpSendCrm( void ) {CCP_DISABLE_INTERRUPT;if (ccp.SendStatus&CCP_SEND_PENDING) {ccp.SendStatus |= CCP_CRM_REQUEST;} else {ccp.SendStatus |= CCP_CRM_PENDING;ccpSend(ccp.Crm);}CCP_ENABLE_INTERRUPT;}/* Send a DTM, if no other message is pending */#ifdef CCP_DAQ#ifndef CCP_SEND_QUEUEstatic void ccpSendDtm( void ) {CCP_DISABLE_INTERRUPT;if (ccp.SendStatus&CCP_SEND_PENDING) {ccp.SendStatus |= CCP_DTM_REQUEST;} else {ccp.SendStatus |= CCP_DTM_PENDING;ccpSend(ccp.Dtm);}CCP_ENABLE_INTERRUPT;}#endif#endif/*--------------------------------------------------------------------------*//* Transmit Queue *//*--------------------------------------------------------------------------*/#ifdef CCP_SEND_QUEUEvoid ccpQueueInit(void) {ccp.Queue.len = 0;ccp.Queue.rp = 0;}CCP_BYTE ccpQueueWrite(ccpMsg_t *msg) {if (ccp.Queue.len>=CCP_SEND_QUEUE_SIZE) return 0;ccp.Queue.msg[(ccp.Queue.rp+ccp.Queue.len)%CCP_SEND_QUEUE_SIZE] = *msg; ccp.Queue.len++;return 1;}#endif/*--------------------------------------------------------------------------*//* Handle MTAs (Memory-Transfer-Address) *//*--------------------------------------------------------------------------*//* Assign a pointer to a MTA */#define ccpSetMTA(n,p) ccp.MTA[n] = p;/* Write n bytes */static CCP_BYTE ccpWriteMTA( CCP_BYTE n, CCP_BYTE size, CCP_BYTEPTR d ) {/* EEPROM write access */#ifdef CCP_WRITE_EEPROMCCP_BYTE r = ccpCheckWriteEEPROM(ccp.MTA[n],size,d);if (r) { /* EEPROM write access */ccp.MTA[n] += size;return r;}#endif/* Checked ram memory write access */#ifdef CCP_WRITE_PROTECTIONif (!ccpCheckWriteAccess(ccp.MTA[n],size)) {ccp.MTA[n] += size;return CCP_WRITE_DENIED;}#endif/* double conversion */#ifdef CCP_DOUBLE_FLOATif (size==8) {*(double*)ccp.MTA[n] = *(float*)d;#ifdef CCP_TESTMODEif (gDebugLevel>=2) CCPPRINT("[ccpWriteMTA] conversion -> double %g\n",*(double*)ccp.MTA[n]);#endifccp.MTA[n] += 8;return CCP_WRITE_OK;}#endifwhile (size-->0) {/* COSMIC Compiler Bug: *(ccp.MTA[n]++) = *(d++); */*(ccp.MTA[n]) = *d;ccp.MTA[n]++;d++;}return CCP_WRITE_OK;}/* Read n bytes */static void ccpReadMTA( CCP_BYTE n, CCP_BYTE size, CCP_BYTEPTR d ) {/* EEPROM read access */#ifdef CCP_READ_EEPROMif (ccpCheckReadEEPROM(ccp.MTA[n],size,d)) {ccp.MTA[n] += size;return;}#endif/* double conversion */#ifdef CCP_DOUBLE_FLOATif (size==8) {*(float*)d = (float)(*(double*)(ccp.MTA[n]));#ifdef CCP_TESTMODEif (gDebugLevel>=2) CCPPRINT("[ccpReadMTA] conversion -> float %g\n",(double)(*(float*)d));#endifreturn;}#endifwhile (size-->0) {*d = *(ccp.MTA[n]);d++;ccp.MTA[n]++;}}/*--------------------------------------------------------------------------*//* Data Aquisition Setup *//*--------------------------------------------------------------------------*/#ifdef CCP_DAQ/* Clear DAQ list */static CCP_BYTE ccpClearDaqList( CCP_BYTE daq ) {CCP_BYTEPTR p;CCP_BYTEPTR pl;if (daq>=CCP_MAX_DAQ) return 0;/* Clear this daq list to zero */p = (CCP_BYTEPTR)&ccp.DaqList[daq];pl = p+sizeof(ccpDaqList_t);while (p<pl) *p++ = 0;/* @@@@ Not DAQ list specific */ccp.SessionStatus |= SS_DAQ;#ifdef CCP_SEND_SINGLEccp.CurrentDaq = 0;ccp.CurrentOdt = 0;#endif#ifdef CCP_SEND_QUEUEccpQueueInit();#endifreturn CCP_MAX_ODT;}/* Prepare DAQ */static CCP_BYTE ccpPrepareDaq( CCP_BYTE daq, CCP_BYTE last, CCP_BYTE eventChannel, CCP_WORD prescaler ) {if (daq>=CCP_MAX_DAQ) return 0;ccp.DaqList[daq].eventChannel = eventChannel;if (prescaler==0) prescaler = 1;ccp.DaqList[daq].prescaler = prescaler;ccp.DaqList[daq].cycle = 1;ccp.DaqList[daq].last = last;ccp.DaqList[daq].flags = DAQ_FLAG_PREPARED;return 1;}/* Start DAQ */static CCP_BYTE ccpStartDaq( CCP_BYTE daq ) {if (daq>=CCP_MAX_DAQ) return 0;ccp.DaqList[daq].flags = DAQ_FLAG_START;ccp.SessionStatus |= SS_RUN;#ifdef CCP_TIMESTAMPINGccpClearTimestamp();#endifreturn 1;}/* Start all prepared DAQs */static void ccpStartAllPreparedDaq(void) {CCP_BYTE q;for (q=0;q<CCP_MAX_DAQ;q++) {if (ccp.DaqList[q].flags==DAQ_FLAG_PREPARED) ccp.DaqList[q].flags = DAQ_FLAG_START; }ccp.SessionStatus |= SS_RUN;#ifdef CCP_TIMESTAMPINGccpClearTimestamp();#endif}/* Stop DAQ */static void ccpStopDaq ( CCP_BYTE daq ) {CCP_BYTE i;if (daq>=CCP_MAX_DAQ) return;ccp.DaqList[daq].flags = 0;/* check if all DAQ lists are stopped */for (i=0;i<CCP_MAX_DAQ;i++) {if (ccp.DaqList[i].flags&DAQ_FLAG_START) return;}ccp.SessionStatus &= ~SS_RUN;}/* Stop all DAQs */static void ccpStopAllDaq( void ) {CCP_BYTE q;for (q=0;q<CCP_MAX_DAQ;q++) ccp.DaqList[q].flags = 0;ccp.SessionStatus &= ~SS_RUN;}/*--------------------------------------------------------------------------*//* Data Aquisition Processor *//*--------------------------------------------------------------------------*/#ifndef CCP_SEND_SINGLE/* Sample and transmit a DTM */static int ccpSampleAndTransmitDtm( CCP_BYTE pid, CCP_BYTE daq, CCP_BYTE odt ) {#ifdef CCP_SEND_QUEUECCP_BYTE dtm[8];#else#define dtm ccp.Dtm#endif#ifdef CCP_DAQ_BASE_ADDRCCP_BYTEPTR p;#elseCCP_DAQBYTEPTR p;#endif#ifdef CCP_ODT_ENTRY_SIZECCP_BYTE s;CCP_BYTE *d,*dl;ccpOdtEntry_t *e,*el;#elseCCP_BYTE i;ccpOdtEntry_t *e;#endif/* PID */dtm[0] = pid;/* Assure data consistency */CCP_DISABLE_INTERRUPT;/* Sample */#ifdef CCP_ODT_ENTRY_SIZEe = &ccp.DaqList[daq].odt[odt][0];el = e+8;d = &dtm[1];dl = d+7;while (d<dl && e<el && e->ptr) {#ifdef CCP_DAQ_BASE_ADDRp = (CCP_BYTEPTR)( e->ptr ) + CCP_DAQ_BASE_ADDR;#elsep = e->ptr;#endifs = e->siz;#ifdef CCP_DOUBLE_FLOATif (s==8) {*(float*)d = (float)(*(double*)p);s = 4;#ifdef CCP_TESTMODEif (gDebugLevel>=2) CCPPRINT("[ccpSampleAndTransmitDtm] conversion -> float %g\n",*(float*)d);#endif} else#endifif (s==4) {*(CCP_DWORD*)d = *(CCP_DWORD*)p;} else if (s==2) {*(CCP_WORD*)d = *(CCP_WORD*)p;} else {*d = *p;}d += s;e++;}#elsee = &ccp.DaqList[daq].odt[odt][0];for (i=1;i<8;i++) {#ifdef CCP_DAQ_BASE_ADDRp = (CCP_BYTEPTR)( (e++)->ptr ) + CCP_DAQ_BASE_ADDR;#elsep = (e++)->ptr;#endifif (p) dtm[i] = *p;}#endif/* Optional for CANape: Put a timestamp in the first ODT (Byte6+7) of each DAQ */ #ifdef CCP_TIMESTAMPINGif (odt==0) {*(CCP_WORD*)&dtm[6] = ccpGetTimestamp();}#endif/* Queue or transmit the DTM */#ifdef CCP_SEND_QUEUEif (ccp.SendStatus&CCP_SEND_PENDING) {if (!ccpQueueWrite((ccpMsg_t*)dtm)) {/* Overun */CCP_ENABLE_INTERRUPT;return 0;}} else {ccp.SendStatus |= CCP_DTM_PENDING;ccpSend(dtm);}#elseif (ccp.SendStatus&CCP_DTM_REQUEST) {/* Overun */CCP_ENABLE_INTERRUPT;return 0;}if (ccp.SendStatus&CCP_SEND_PENDING) {ccp.SendStatus |= CCP_DTM_REQUEST;} else {ccp.SendStatus |= CCP_DTM_PENDING;ccpSend(dtm);}#endifCCP_ENABLE_INTERRUPT;return 1;}#else/* Sample and transmit the next DTM in SEND_SINGLE mode */ static void ccpSampleAndSendNextDtm( void ) {CCP_BYTE i,j;CCP_DAQBYTEPTR p;ccpOdtEntry_t *e;/* Request for DTM transmission pending */if (ccp.SendStatus&CCP_DTM_REQUEST) return;/* Find a DAQ list marked for transmission */for (i=0;i<CCP_MAX_DAQ;i++) {if (ccp.DaqList[ccp.CurrentDaq].flags&DAQ_FLAG_SEND) {/* PID */ccp.Dtm[0] = ccp.CurrentDaq*CCP_MAX_ODT+ccp.CurrentOdt;/* Sample */e = &ccp.DaqList[ccp.CurrentDaq].odt[ccp.CurrentOdt][0];for (j=1;j<8;j++) {p = (e++)->ptr;if (p) ccp.Dtm[j] = *p;}/* Send */ccpSendDtm();/* Increment ODT */if (++ccp.CurrentOdt>ccp.DaqList[ccp.CurrentDaq].last) {/* DAQ list done */ccp.CurrentOdt = 0;ccp.DaqList[ccp.CurrentDaq].flags &= ~DAQ_FLAG_SEND;/* Increment DAQ */if (++ccp.CurrentDaq>=CCP_MAX_DAQ) ccp.CurrentDaq = 0;}break;} else {/* Increment DAQ */if (++ccp.CurrentDaq>=CCP_MAX_DAQ) ccp.CurrentDaq = 0;}}}#endif/* Data aquisition */void ccpDaq( CCP_BYTE eventChannel ){CCP_BYTE q,o;#ifndef CCP_SEND_SINGLECCP_BYTE j;#endifif (!(ccp.SessionStatus&SS_RUN)) return;SET_PORT_BIT(4); /* Timingtest */for (o=0,q=0; q<CCP_MAX_DAQ; o+=CCP_MAX_ODT,q++) {if (!(ccp.DaqList[q].flags&DAQ_FLAG_START)) continue;if (ccp.DaqList[q].eventChannel!=eventChannel) continue;if (--ccp.DaqList[q].cycle!=0) continue;ccp.DaqList[q].cycle = ccp.DaqList[q].prescaler;#ifdef CCP_SEND_SINGLE/* Just mark DAQ for transmission */ccp.DaqList[q].flags |= DAQ_FLAG_SEND;#else/* Check that the current queue space fits a complete cycle */#if defined(CCP_SEND_QUEUE) && defined(CCP_SEND_QUEUE_OVERRUN_INDICATION)if (CCP_SEND_QUEUE_SIZE-ccp.Queue.len<=ccp.DaqList[q].last) {ccp.DaqList[q].flags |= DAQ_FLAG_OVERRUN;continue; /* Skip this DAQ list on overrun */}#endif/* Use BIT7 of PID to indicate overruns (CANape special feature) */#ifdef CCP_SEND_QUEUE_OVERRUN_INDICATIONfor (j=0;j<=ccp.DaqList[q].last;j++) {if(!ccpSampleAndTransmitDtm((o+j)|(ccp.DaqList[q].flags&DAQ_FLAG_OVERRUN),q,j)) { ccp.DaqList[q].flags |= DAQ_FLAG_OVERRUN;} else {ccp.DaqList[q].flags &= ~DAQ_FLAG_OVERRUN;}} /* j */#elsefor (j=0;j<=ccp.DaqList[q].last;j++) {ccpSampleAndTransmitDtm(o+j,q,j);} /* j */#endif#endif} /* q *//* Check for the next ODT to send */#ifdef CCP_SEND_SINGLEccpSampleAndSendNextDtm();#endifRST_PORT_BIT(4); /* Timingtest */}#endif /* CCP_DAQ *//*--------------------------------------------------------------------------*//* Background Processing *//* Used for Checksum Calculation *//*--------------------------------------------------------------------------*//* Table for CCITT checksum calculation */#ifdef CCP_CHECKSUM_CCITTCCP_MEMROM0 CCP_ROM CCP_WORD CRC16CCITTtab[256] = {0x0000,0x1189,0x2312,0x329B,0x4624,0x57AD,0x6536,0x74BF, 0x8C48,0x9DC1,0xAF5A,0xBED3,0xCA6C,0xDBE5,0xE97E,0xF8F7, 0x1081,0x0108,0x3393,0x221A,0x56A5,0x472C,0x75B7,0x643E, 0x9CC9,0x8D40,0xBFDB,0xAE52,0xDAED,0xCB64,0xF9FF,0xE876, 0x2102,0x308B,0x0210,0x1399,0x6726,0x76AF,0x4434,0x55BD, 0xAD4A,0xBCC3,0x8E58,0x9FD1,0xEB6E,0xFAE7,0xC87C,0xD9F5, 0x3183,0x200A,0x1291,0x0318,0x77A7,0x662E,0x54B5,0x453C, 0xBDCB,0xAC42,0x9ED9,0x8F50,0xFBEF,0xEA66,0xD8FD,0xC974, 0x4204,0x538D,0x6116,0x709F,0x0420,0x15A9,0x2732,0x36BB, 0xCE4C,0xDFC5,0xED5E,0xFCD7,0x8868,0x99E1,0xAB7A,0xBAF3, 0x5285,0x430C,0x7197,0x601E,0x14A1,0x0528,0x37B3,0x263A, 0xDECD,0xCF44,0xFDDF,0xEC56,0x98E9,0x8960,0xBBFB,0xAA72, 0x6306,0x728F,0x4014,0x519D,0x2522,0x34AB,0x0630,0x17B9, 0xEF4E,0xFEC7,0xCC5C,0xDDD5,0xA96A,0xB8E3,0x8A78,0x9BF1, 0x7387,0x620E,0x5095,0x411C,0x35A3,0x242A,0x16B1,0x0738, 0xFFCF,0xEE46,0xDCDD,0xCD54,0xB9EB,0xA862,0x9AF9,0x8B70, 0x8408,0x9581,0xA71A,0xB693,0xC22C,0xD3A5,0xE13E,0xF0B7, 0x0840,0x19C9,0x2B52,0x3ADB,0x4E64,0x5FED,0x6D76,0x7CFF, 0x9489,0x8500,0xB79B,0xA612,0xD2AD,0xC324,0xF1BF,0xE036, 0x18C1,0x0948,0x3BD3,0x2A5A,0x5EE5,0x4F6C,0x7DF7,0x6C7E, 0xA50A,0xB483,0x8618,0x9791,0xE32E,0xF2A7,0xC03C,0xD1B5, 0x2942,0x38CB,0x0A50,0x1BD9,0x6F66,0x7EEF,0x4C74,0x5DFD, 0xB58B,0xA402,0x9699,0x8710,0xF3AF,0xE226,0xD0BD,0xC134, 0x39C3,0x284A,0x1AD1,0x0B58,0x7FE7,0x6E6E,0x5CF5,0x4D7C, 0xC60C,0xD785,0xE51E,0xF497,0x8028,0x91A1,0xA33A,0xB2B3, 0x4A44,0x5BCD,0x6956,0x78DF,0x0C60,0x1DE9,0x2F72,0x3EFB, 0xD68D,0xC704,0xF59F,0xE416,0x90A9,0x8120,0xB3BB,0xA232, 0x5AC5,0x4B4C,0x79D7,0x685E,0x1CE1,0x0D68,0x3FF3,0x2E7A, 0xE70E,0xF687,0xC41C,0xD595,0xA12A,0xB0A3,0x8238,0x93B1, 0x6B46,0x7ACF,0x4854,0x59DD,0x2D62,0x3CEB,0x0E70,0x1FF9, 0xF78F,0xE606,0xD49D,0xC514,0xB1AB,0xA022,0x92B9,0x8330, 0x7BC7,0x6A4E,0x58D5,0x495C,0x3DE3,0x2C6A,0x1EF1,0x0F78 };#endif#ifndef CCP_CHECKSUM_BLOCKSIZE#define CCP_CHECKSUM_BLOCKSIZE 256#endifCCP_BYTE ccpBackground( void ) {SET_PORT_BIT(3); /* Timingtest *//* CCP command pending */#ifdef CCP_CMD_NOT_IN_INTERRUPTCCP_DISABLE_INTERRUPT;if (ccp.SendStatus&CCP_CMD_PENDING) {ccp.SendStatus &= ~CCP_CMD_PENDING;ccpCommand(CCP_RX_DATA_PTR);}CCP_ENABLE_INTERRUPT;#endif/* Call the user backgound function */ccpUserBackground();/* CCP checksum calculation */#ifdef CCP_CHECKSUM/*Checksum algorithm is not defined by the standardType is defined by CCP_CHECKSUM_TYPE, Maximum blocksize is 64K *//* Checksum calculation in progress */if (ccp.CheckSumSize) {register CCP_BYTE n;#ifndef CCP_CHECKSUM_CCITTregister CCP_BYTE b;#endifif (ccp.CheckSumSize<=(CCP_CHECKSUM_BLOCKSIZE-1)) {n = (CCP_BYTE)ccp.CheckSumSize;ccp.CheckSumSize = 0;} else {n = 0;ccp.CheckSumSize -= CCP_CHECKSUM_BLOCKSIZE;}do {#ifdef CCP_CHECKSUM_CCITT/* CRC */#ifdef CCP_MOTOROLA(*(CCP_WORD*)&ccp.Crm[4]) = CRC16CCITTtab[ccp.Crm[5] ^ *(ccp.MTA[CCP_INTERNAL_MTA]++)] ^ ccp.Crm[4];#else(*(CCP_WORD*)&ccp.Crm[4]) = CRC16CCITTtab[ccp.Crm[4] ^ *(ccp.MTA[CCP_INTERNAL_MTA]++)] ^ ccp.Crm[5];#endif#else/* Compiler Error BSO Tasking 16x *//* *(CCP_CHECKSUM_TYPE*)&ccp.Crm[4] += *(ccp.MTA[CCP_INTERNAL_MTA]++); does not work *//* Sum */b = *(ccp.MTA[CCP_INTERNAL_MTA]);*(CCP_CHECKSUM_TYPE*)&ccp.Crm[4] += b;ccp.MTA[CCP_INTERNAL_MTA]++;#endif} while (--n!=0);/* Checksum calculation finished ? */if (ccp.CheckSumSize) {RST_PORT_BIT(3); /* Timingtest */return 1; /* Still pending */}ccpSendCrm();} /* ccp.CheckSumSize */#endifRST_PORT_BIT(3); /* Timingtest */return 0;}/*--------------------------------------------------------------------------*//* Command Processor *//*--------------------------------------------------------------------------*/void ccpCommand( CCP_BYTEPTR com ) {SET_PORT_BIT(1); /* Timingtest */#define cmd com[0]#define ctr com[1]/* Handle CONNECT or TEST command */if (cmd==CC_CONNECT||cmd==CC_TEST) {#define stationAddr (*(CCP_WORD*)&com[2]) /* Has to be Intel-Format ! */#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("\n%u: %s addr=%u\n",ctr,cmd==CC_CONNECT?"CONNECT":"TEST",stationAddr);#endif/* This station */if (stationAddr==CCP_STATION_ADDR||stationAddr==CCP_BROADCAST_STATION_ADDR) { /* This station */if (cmd==CC_CONNECT) {#ifdef CCP_DAQif (!(ccp.SessionStatus&SS_TMP_DISCONNECTED)) {ccpStopAllDaq();ccp.SendStatus = 0; /* Clear all transmission flags */}#endifccp.SessionStatus |= SS_CONNECTED;ccp.SessionStatus &= ~SS_TMP_DISCONNECTED;#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("*** connected ***\n");#endif}/* Responce *//* Station addresses in Intel Format */ccp.Crm[0] = 0xFF;ccp.Crm[1] = CRC_OK;ccp.Crm[2] = ctr;ccp.Crm[3] = 0xFE;*(CCP_WORD*)&ccp.Crm[4] = CCP_STATION_ADDR;*(CCP_WORD*)&ccp.Crm[6] = CCP_BROADCAST_STATION_ADDR;/* responce *//* |||| */}/* Another station */else {/* If connected, temporary disconnect */if (ccp.SessionStatus&SS_CONNECTED) {ccp.SessionStatus &= ~SS_CONNECTED;ccp.SessionStatus |= SS_TMP_DISCONNECTED;#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("*** temporary disconnect ***\n");#endif}RST_PORT_BIT(1); /* Timingtest *//* no responce */return;}}/* Handle other commands only if connected */else if (ccp.SessionStatus&SS_CONNECTED) {/* prepare the responce */ccp.Crm[0] = 0xFF;ccp.Crm[1] = CRC_OK;ccp.Crm[2] = ctr;switch (cmd) {case CC_DISCONNECT:{#define disconnectCmd com[2]#define disconnectStationAddr (*(CCP_WORD*)&com[4])ccp.SessionStatus &= ~SS_CONNECTED;#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("%u: DISCONNECT cmd=%u\n",ctr,disconnectCmd);#endifif (disconnectCmd==0x00) { /* Temporary */ccp.SessionStatus |= SS_TMP_DISCONNECTED;#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("*** temporary disconnect ***\n");#endif} else { /* End of session */#ifdef CCP_DAQccpStopAllDaq();#endif#ifdef CCP_SEED_KEYccp.ProtectionStatus = 0; /* Clear Protection Status */#endif#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("*** end of session ***\n");#endif}}break;case CC_EXCHANGE_ID: /* Exchange Station Identifications */{CCP_BYTE i;#define masterId com[2]for(i=0;ccpStationId[i]!=0;i++) ;ccp.Crm[3] = i; /* Lenght of slave device identifier */ccp.Crm[4] = 0;/* Build the Resource Availability and Protection Mask */ccp.Crm[5] = PL_CAL; /* Default: Calibration available */ccp.Crm[6] = 0; /* Default: No Protection */#ifdef CCP_SEED_KEYccp.Crm[6] |= PL_CAL; /* Protected Calibration */#endif#ifdef CCP_DAQccp.Crm[5] |= PL_DAQ; /* Data Acquisition */#ifdef CCP_SEED_KEYccp.Crm[6] |= PL_DAQ; /* Protected Data Acquisition */#endif#endif#if defined(CCP_PROGRAM) || defined(CCP_BOOTLOADER_DOWNLOAD)ccp.Crm[5] |= PL_PGM; /* Flash Programming */#ifdef CCP_SEED_KEYccp.Crm[6] |= PL_PGM; /* Protected Flash Programming */#endif#endifccp.Crm[7] = CCP_DRIVER_VERSION; /* Driver version number */ccpSetMTA(0,(CCP_MTABYTEPTR)ccpStationId);#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("%u: EXCANGE_ID master_id=%u\n",ctr,masterId);#endif}break;#ifdef CCP_SEED_KEYcase CC_GET_SEED: /* Get Seed for Key */{#define privilegeLevel com[2]ccp.Crm[3] = 0; /* Protection Status: No key required */*(CCP_DWORD*)&ccp.Crm[4] = 0;#ifdef CCP_SEED_KEY/* Keys required for CAL or PGM */switch (privilegeLevel) {case PL_CAL:ccp.Crm[3] = (0==(ccp.ProtectionStatus&PL_CAL)); /* Protection Status */*(CCP_DWORD*)&ccp.Crm[4] = ccpGetSeed(PL_CAL);break;case PL_PGM:ccp.Crm[3] = (0==(ccp.ProtectionStatus&PL_PGM)); /* Protection Status */*(CCP_DWORD*)&ccp.Crm[4] = ccpGetSeed(PL_PGM);break;case PL_DAQ:ccp.Crm[3] = (0==(ccp.ProtectionStatus&PL_DAQ)); /* Protection Status */*(CCP_DWORD*)&ccp.Crm[4] = ccpGetSeed(PL_DAQ);break;default:ccp.Crm[1] = CRC_CMD_SYNTAX;/* Error */}#endif#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("%u: GET_SEED resource=%02X, protection_status=%u\n",ctr,privilegeLevel,ccp.Crm[3]);#endif}break;case CC_UNLOCK: /* Unlock Protection */{#define key com[2] /* Key may be up to 6 Bytes *//* Check key */ccp.ProtectionStatus |= ccpUnlock(&com[2]); /* Reset the appropriate resource protection mask bit */ccp.Crm[3] = ccp.ProtectionStatus; /* Current Protection Status */#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("%u: UNLOCK protection_status=%02X\n",ctr,ccp.ProtectionStatus);#endif}break;#endif /* CCP_SEED_KEY */case CC_SET_MTA: /* Set transfer address */{#define mta com[2]#define addrExt com[3]#define addr (*(CCP_DWORD*)&com[4])if (mta<CCP_MAX_MTA-1) {ccpSetMTA(mta,ccpGetPointer(addrExt,addr));} else {ccp.Crm[1] = CRC_OUT_OF_RANGE;}#ifdef CCP_TESTMODEif (gDebugLevel) CCPPRINT("%u: SET_MTA %u to %08lX,%u\n",ctr,mta,addr,addrExt);#endif#undef mta#undef addrExt#undef addr}break;case CC_DNLOAD: /* Download */{CCP_BYTE r;#define size com[2]#ifdef CCP_SEED_KEYif (!(ccp.ProtectionStatus&PL_CAL)) {ccp.Crm[1] = CRC_ACCESS_DENIED;r = 0;}else#endifr = ccpWriteMTA(0,size,&com[3]);#ifdef CCP_STANDARDccpGetMTA0((CCP_BYTE*)&ccp.Crm[3],(CCP_DWORD*)&ccp.Crm[4]);#endifif (r==CCP_WRITE_PENDING) return; /* EEPROM write pending */if (r==CCP_WRITE_DENIED||r==CCP_WRITE_ERROR) ccp.Crm[1] = CRC_ACCESS_DENIED; /* No write access */#ifdef CCP_TESTMODEif (gDebugLevel) {int i;CCPPRINT("%u: DNLOAD n=%u, ",ctr,size);for (i=3;i<3+size&&i<8;i++) CCPPRINT("%02X ",com[i]);CCPPRINT("\n");}#endif#undef size /* avoid compiler re-definition warning */}break;case CC_DNLOAD6: /* Download */{CCP_BYTE r;#ifdef CCP_SEED_KEYif (!(ccp.ProtectionStatus&PL_CAL)) {ccp.Crm[1] = CRC_ACCESS_DENIED;r = 0;}else#endifr = ccpWriteMTA(0,6,&com[2]);#ifdef CCP_STANDARDccpGetMTA0((CCP_BYTE*)&ccp.Crm[3],(CCP_DWORD*)&ccp.Crm[4]);#endifif (r==CCP_WRITE_PENDING) return; /* EEPROM write pending */if (r==CCP_WRITE_DENIED||r==CCP_WRITE_ERROR) ccp.Crm[1] =CRC_ACCESS_DENIED; /* No write access */#ifdef CCP_TESTMODEif (gDebugLevel) {int i;CCPPRINT("%u: DNLOAD6 ",ctr);for (i=2;i<8;i++) CCPPRINT("%02X ",com[i]);CCPPRINT("\n");}#endif}break;case CC_UPLOAD: /* Upload */{#define size com[2]ccpReadMTA(0,size,&ccp.Crm[3]);#ifdef CCP_TESTMODEif (gDebugLevel) {int i;CCPPRINT("%u: UPLOAD n=%u, ",ctr,size);for (i=3;i<3+size;i++) CCPPRINT("%02X ",ccp.Crm[i]);CCPPRINT("\n");}#endif#undef size /* avoid compiler re-definition warning */}break;case CC_SHORT_UPLOAD: /* Upload with Address */{#define size com[2]#define addrExt com[3]#define addr (*(CCP_DWORD*)&com[4])ccpSetMTA(CCP_INTERNAL_MTA,ccpGetPointer(addrExt,addr));ccpReadMTA(CCP_INTERNAL_MTA,size,&ccp.Crm[3]);#ifdef CCP_TESTMODEif (gDebugLevel) {int i;CCPPRINT("%u: SHORT_UPLOAD p=%08lX,%u,n=%u, ",ctr,addr,addrExt,size);for (i=3;i<3+size&&i<8;i++) CCPPRINT("%02X ",ccp.Crm[i]);CCPPRINT("\n");}#endif。
CCP协议标准一、协议概述CCP(Controller-to-Controller Protocol)协议是一种用于设备间通信的协议,主要应用于工业自动化领域。
它提供了一种可靠、高效的数据交换方式,使得设备能够相互协作,实现复杂的控制任务。
本协议标准将详细介绍CCP协议的各个方面。
二、CCP通信方式CCP协议支持两种通信方式:主从式和DAQ(数据采集命令)模式。
主从式通信方式中,主设备向从设备发送请求,从设备根据请求进行响应。
DAQ模式是一种更加灵活的通信方式,从设备可以在没有主设备干预的情况下主动发送数据。
三、CCP通信协议CCP通信协议规定了设备间通信的规则和流程。
它包括以下几个部分:1.物理层:定义了通信所需的物理接口,如串口、网口等。
2.数据链路层:定义了数据链路层的协议,如Modbus协议。
3.应用层:定义了应用程序的接口,包括数据类型、命令格式等。
四、主从式通信在主从式通信中,主设备向从设备发送请求,从设备根据请求进行响应。
主设备可以选择一个或多个从设备进行通信。
从设备必须能够接收和解析来自主设备的请求,并根据请求返回响应。
主设备可以发送各种类型的请求,如读取或写入数据、启动或停止任务等。
五、DAQ(数据采集命令)模式DAQ模式是一种更加灵活的通信方式,从设备可以在没有主设备干预的情况下主动发送数据。
在DAQ模式中,从设备可以在指定的时间间隔内自动采集数据,并将数据发送给主设备。
主设备可以配置从设备的采集参数,如采集频率、数据类型等。
六、查询(Polling)模式查询模式是一种常用的通信方式,主设备通过周期性地发送查询命令来获取从设备的状态或数据。
从设备在接收到查询命令后,会返回相应的状态或数据给主设备。
查询模式可以提高系统的实时性,但可能会增加主设备的负载和网络流量。
七、数据传递与接收在CCP协议中,数据传递与接收是通过消息来实现的。
消息包括请求和响应两种类型。
请求消息由主设备发送给从设备,包含请求的类型和参数等信息。
竭诚为您提供优质文档/双击可除ccp协议代码篇一:基于ccp协议的汽车标定系统daq模式的实现基于ccp协议的汽车标定系统daq模式的实现20xx-12-2623:56:00来源:中国自动化网ccp协议是一种基于can总线的匹配标定协议。
该协议具有通信可靠、传输速度快、通用性好等特点。
本文讨论了一种基于ccp协议的汽车ecu标定系统,并详细介绍了该系统的工作原理、数据采集机制以及实现方式。
前言随着汽车电子技术的发展,电子控制单元(ecu)的标定已成为汽车电子控制装置开发的一个重要环节。
大多数ecu都需要经过匹配标定的过程,从而确定其运行参数和控制参数。
目前国内还没有成熟的基于ccp的ecu标定系统,已有的一些系统主要是采用Vector提供的freeccpdriver,或者基于matlab的相关工具包,在此基础上作自己的应用软件,并没有独立的ccp驱动;国外的产品功能强大,但价格昂贵。
因此,研究、掌握ccp的核心技术,开发针对不同用户需求提供不同的定制功能,并能适应pci、usb等不同主机接口的ecu标定软件就具有非常重要的意义。
ccp协议简介ccp协议的通信方式基于ccp协议的ecu标定采用主-从通信方式,主设备通过can总线与多个从设备相连,如图1所示。
其中主设备测量标定系统mcs(measurementcalibrationsystem),从设备是需要标定的ecu。
根据ccp协议,主设备首先与其中一个从设备建立逻辑连接。
建立逻辑连接后,主、从机之间所有的数据传递均由主机控制,从机执行主机命令后返回包含命令响应值或错误代码等信息的报文。
任何一个从机都可以定时地根据由主机通过控制命令所设置的列表来传递内部的数据。
所以说数据的传递是由主机初始化,由从机来执行,并且是由固定的循环采样频率或事件触发的。
图1ccp通信结构图ccp协议定义了两种工作模式:一种是polling(查询)模式,另一种是daq(数据采集)模式。
在本文所设计的标定系统中,根据实际需求情况,采用了daq模式。
ccp协议的通信数据对象ccp协议只采用了两个can报文对象,且每个对象根据其数据流向,都有一个唯一的id标识符进行标识:(1)命令接收对象(主机一从机):简称cRo。
cRo用于传递指令代码和内部功能码或主、从机之间交换的存储区数据。
(2)数据传输对象(从机一主机):简称dto。
dto指由从设备反馈的报文。
根据报文pid的不同,dto又可以分为三种形式:·命令返回消息cRm(pid=255):由从设备发送,针对cRo 的反馈报文。
·事件消息(pid=254):当从设备检测到内部发生错误机制时,由从设备自行向主设备发送,报告其当前的运行状态,并请求主设备暂停当前工作进程以处理发生的错误。
·daq-dto(0≤pid≤254):用在daq模式中,由从设备组织,定期向主设备发送。
图2标定系统工作原理图基于ccp的ecu标定系统实现标定系统工作原理基于ccp的ecu标定系统工作原理如图2所示,对部分控制参数进行调整后,通过一个usb转can的驱动模块就可以将数据送到发动机ecu当中,ecu收到控制信号后,通过内部处理又会由驱动模块返回ecu内部重要的数据到平台上显示,标定软件与发动机ecu的通信符合ccp标定协议。
ccp 通信部分调用ccpdriver,为标定软件实现与ecu的通信,包括将用户指定的标定参数下载到ecu、接收ecu的测量数据供数据显示子窗口使用。
图3数据描述表标定系统的数据采集机制本文采用的是daq模式,从而可以实现从设备按照指定的周期将需要监视的数据上传。
daq传送的数据由一系列表来组织,这些表被称为odt(objectdescriptortables)。
每个odt表含7个元素,可描述7个ecu内部参数的相对地址及数据长度等属性。
这些被odt描述的参数,就是需要从设备用daq-dto帧周期发送给主设备的被监视数据;而这些属性被称为“参数描述”,它们可帮助从设备daq处理代码确定该参数的当前值,如图3所示。
odt中描述的参数,及各参数的“参数描述”由主设备通过cRo命令写入。
当从设备的daq机制被启动时,从设备按主设备要求的周期,将每个odt表描述的ecu参数当前值顺次放入相应的daq-dto帧中,并发送给主设备。
图4标定软件运行示意图标定系统daq模式的软件实现标定系统的软件设计主要分为两个部分:candrvier和ccpdriver。
本方案的ecu采用mc9s12dg128,因此可以直接应用芯片can模块提供的接口发送can数据。
ccpdriver是标定系统的核心部分,它主要通过调用candriver实现与上位机标定软件的通信,从而进行对ecu的在线标定。
标定系统的实现过程如下:1.上层标定软件部分定义list的数目、每个list中的odt数目、每个odt中的元素数目。
2.ecu按照上层的定义,确定自己的数据结构。
即上下层都定义一个三维的数组(list,odt,element),用来存放映射关系。
3.上层通过协议命令初始化odt。
首先,上层发送get_daq_size命令(参数为list号),得到指定的list大小(numberofodtinthislist),并得到该list中dto的第一个pid号。
然后,上层发送set_daq_ptR命令(参数为list号、odt号、odt中的元素号),指定需要初始化的参数单元。
最后,上层根据set_daq_ptR命令设置的具体元素,发送wRite_daq命令(参数为daq元素的byte大小,daq元素的地址),反复通过set_ptR和wRite_daq两条命令,初始化完一个具体的odt表,然后初始化完一个具体的list表,最后初始化完所有的list表格。
至此,初始化odt工作结束。
4.开始和停止daq数据的传输。
上层发送staRt_stop 命令,指定的odt数据开始上传。
odt将其中的每个元素复制到其对应的dto(8个字节,1个pid号,7个存放数据)中,然后以dataacquisitionmessage的形式返回给上层的标定系统。
daq模式到此为止。
结语ecu标定软件运行情况如图4所示,经过多次不断的调试,此标定系统运行稳定可靠,能够对汽车系统中的ecu进行在线标定,并可以针对不同用户需求提供不同的定制功能。
这个采用ccp协议的汽车发动机标定系统具有符合国际通用标准、通用性好、对不同硬件与不同需求适应性强的特点,因此有很好的开发应用前景。
篇二:基于ccp协议利用canape进行电控单元标定目前基于can(controllerareanetwork)总线的分布式系统在汽车电子领域得到广泛应用,电子控制单元的标定已成为汽车电子控制装置开发的一个重要环节。
ccp(cancalibrationprotocol)是一种基于can总线的ecu(electroniccontrolunit)标定协议[1],已经在许多欧美汽车厂商得到应用,采用ccp协议可以快速而有效地实现对汽车电控单元的标定。
然而基于ccp协议的标定,需要在ecu内部实现支持ccp 协议的驱动程序(ccpdriver)。
目前大多数应用都采用Vector提供的freeccpdriver[2]。
考虑到ecu底层程序与can驱动程序的实现各不相同,将ccp驱动程序结合到ecu中[3]并不是一件一蹴而就的事,这需要对ccp协议本身、标定工具及标定工具与ecu之间的通信有详细和深入的了解。
在整个标定系统的开发过程中,大量时间被耗费在前期ccp驱动程序与ecu结合上。
本文在简单介绍ccp协议的基础上,提供了一个通用的ecu与ccp驱动程序结合的实例,以帮助缩短整个标定开发周期。
canape[4]是一款ecu标定和测试工具。
与ccp协议相结合,不仅能完成对ecu的标定,同时还能在ecu运行期间直接访问内存并进行操作。
这使得canape不仅是一款功能强大的标定工具,也是一款电控单元开发的得力助手。
然而在使用方面,canape的前期配置比较繁琐,目前国内的相关资料较少。
本文将介绍canape,并着眼于如何基于ccp协议使用canape完成ecu的标定。
1ccp协议及工作原理ccp协议是asap(arbeitskreiszurstandardisierungvonapplikations systemen)标志的有机组成部分。
asap作为一个应用系统标准化工作小组,其目的在于提供通用软、硬件接口标准,以解决由于不同制造商提供的控制器存在的接口不匹配问题。
1.1ccp通信方式基于ccp协议的ecu标定采用主-从通信方式,如图1。
主设备通过can总线与多个从设备相连,其中主设备是测量标定系统mcs(measurementcalibrationsystem),从设备是需要标定的ecu,在汽车电子中即为车载控制器。
图1ccp通信方式根据ccp协议,主设备首先与其中一个从设备建立逻辑链接,然后通过主设备向从设备发送命令来起始两者间的数据通信。
当主设备要访问另一个从设备时,首先断开与当前从设备的逻辑连接,与下一个从设备建立新的逻辑连接后再开始通信。
1.2ccp协议的工作模式ccp定义了两种工作模式:polling(查询)模式及daq(dataacquisitioncommand)模式。
查询模式下,主设备与从设备间的每一次通信都由主设备发送命令来起始,从设备收到主设备的命令后,执行相应的操作并反馈一帧报文。
这种工作模式由于需要主机与从机之间进行“一问一答”的信息交互,工作效率不高,但实现简单,而且占用ecu内存资源较小。
daq模式使从设备可以脱离主设备的命令控制按一定周期自动向主设备上传数据。
daq模式下,主设备首先发送一条请求daq的命令,从设备收到后,按命令中的参数自行配置并组织需要上传的数据,然后按一定周期自主向主设备上传数据。
这种模式由于不需要主机通过命令逐步控制,工作效率高,但实现较复杂,如果需要上传的数据量很大,会占用大量ecu内存空间。
1.3ccp报文帧结构基于ccp协议的标定只占用两帧can报文,分别是命令接收对象cRo(commandReceiveobject)和数据传输对象dto(datatransmissionobject),如图2所示。
cRo由主设备发给从设备,dto是从设备反馈的报文。
两者分别通过一个自己的id标识符进行标识(cRo_id与dto_id)。
主、从设备通信图2ccp协议cRo与dto的id标识符由通信协议自行定义,ccp协议只对cRo 及dto的数据场做了详细定义。
按照ccp协议,cRo数据场的第1个字节为命令代码cmd(commandcode),ccp协议共规定了28条命令[1]。