这两周在验证移植到ECU的XCP模块是否正常运转,所以干脆开个专题,说说这个汽车业内常用的标定协议。
背景概述
众所周知,一辆汽车内部会有许许多多的ECU(Electronic Control Unit),通过CAN, LIN, Gateway 等互相连接通讯,分别或者一起协作控制不同的部件。因而标定工程师需要对不同ECU的参数进行测量获取和标定。尤其是在当下,汽车功能日益复杂,已经很少OEM选择完全独立完成车内的所有ECU软件设计开发,而是选择与多个Tier1进行协同开发。所以统一的量测和标定协议显得尤为重要。
上世纪九十年代,由Audi、BMW、Mercedes-Benz、Volkswagen等欧洲汽车企业成立了一个协会-ASAM(Association for Standardisation of Automation and Measuring Systems, 自动化及测量系统标准协会), 它是汽车工业中的标准协会,致力于数据模型,接口及语言规范等领域。最初,该协会发布的是CCP(CAN Calibration Protocol)协议,它是一种基于CAN总线的ECU标定协议,采用CCP协议可以快速而有效地实现对汽车电控单元的标定。即便是现在也仍然有许多欧美汽车厂商还在使用。
XCP协议
CCP协议限定了它的使用范围为CAN总线,然而汽车内部除了CAN通讯以外,还有LIN,USB,FlexRay等,所以后来ASAM组织又发布了XCP(Universal Measurement and Calibration Protocol)协议,用X打头表示该协议可以应用于不同的输出层:
需要注意的是,XCP虽然名为CCP协议的升级版本,然而XCP协议并不向下兼容CCP协议,有兴趣的可以详细去看看它们的命令码,用的区域已经完全不相干。
相比CCP, XCP还有以下几个不同之处:
原理解析
无论是CCP还是XCP,它们的量测,标定的原理都是类似的。
1. 采用一主多从的模式,单个主机可以同时与多个从机通讯;
2. 主机通过下发命令与从机建立连接,解锁,读取数据,修改参数等操作。
那么主机是怎么读取或者修改从机的数据的?我们知道,ECU程序使用的参数或者数据,要么在RAM中,要么在Flash中,要么在EEPROM中会有特定的地址,那我们可以通过一个文件(A2L格式文件),描述出某个参数的属性:包括参数显示名,长度,物理单位,转换关系以及映射到ECU的地址。那么主机通过该文件,就可以获取所有上述信息。以读取为例,例如想要读取起始地址A,长度为2byte的数据,那么主机通过设定MTA(Memory Transfer Address)为A,并指定长度为2,然后将命令下发给从机,从机收到命令后,从指定的MTA中读取2byte数据,然后回传给主机。同样的,主机改数据也是类似的。
以上的交互方式是CCP/XCP最基本的通讯方式,采用的是一问一答。为了提高通讯的效率和数据吞吐量,CCP/XCP还支持DAQ(Data AcQuisition)模式。基本原理为:主机一次性配置好所有要读取的变量,并关联ECU端的不同事件channel,一旦ECU对应的事件发生(例如每隔100ms),主动上传数据给主机。
如何快速将CCP/XCP协议移植到自己的ECU
CCP/XCP协议原理总体来说简单易懂,但是真正按照协议开发软件模组是相当庞大的工作。我采用的方法是直接前往Vector官网下载Vector提供的XCP Basic软件包,免费开源的。相比完整的协议,Vector提供的basic包在功能上有所阉割,不过即便对于主机厂也够用了。如果想要实现全部功能,可以购买Vector的professional包(我是不是该向Vector收广告费呐),或者基于basice包二次开发。
下载后解压的文件目录是这样的。里面有原版的CCP/XCP协议pdf,basic包源码和使用手册,应用实例。你要做的就是结合使用手册和实例,对照着移植到你的ECU。PS:移植过程需要格外注意DAQ模式相关的配置部分代码和发送Callback 函数,小编被其中的两个坑耗费了不少debug精力。有实际移植该软件包的童鞋,如果遇到问题可以留言交流。
另外建议购买Vector或者Vehicle SPY的相关软件和设备,进行A2L文件的编辑生成和实际测试使用。
转载是一种动力 分享是一种美德,欢迎关注本公众号,可以扫码或者微信搜索公众号:芯连心嵌入式设计交流 。