强烈建议看看这个视频
下载CCP源码
- Vector官网应该有,是个exe文件,网址我找不到了,不行就在CSDN下载
阅读内部自带的两个关键文档
-
AN-IMC-1-001_Integration_of the_Vector_CCP_Driver_with_a_free_CAN_Driver.pdf 介绍了完整的移植过程
-
CCP21.pdf 介绍了2.1版本的CCP协议
CCP源码移植
- 首先将CCP三个文件移植到你的工程里,ccp.c/.h,ccppar.h
- 其次根据你所使用的单片机初始化CAN部分代码,设置好波特率,发送ID和接收ID,CCP_CRO_ID为接收ID,CCP_DTO_ID为发送ID
- 然后实现ccpGetPointer,ccpSend,disable_interrupt,enable_interrupt这四个函数
- ccpGetPointer我是从官方文件里can_cpp.c抄的
- ccpSend是要与你底层CAN发送结合起来,发送ID就是CCP_DTO_ID
- 两个中断就是开启和关闭总中断,根据你单片机进行实现
- 实现CAN接收函数,一般是通过中断接收CAN数据,将从CCP_CRO_ID接收的八个字节数据传入ccpCommand函数
- 初始化要有你底层CAN初始化和ccpInit函数
- while里要有ccpCommand和ccpSendCallBack函数,判断数据发送完成后调取ccpSendCallBack函数,一定记得调callback,否则就会发送一次就无法发送了
- 做完这些你可以通过CAN test发connect命令进行测试,看看移植是否有问题
我遇到的问题
- 忘记调callback
- CRO和DTO的CAN ID弄反了
INCA联动
- A2L文件一定不要着急,认真阅读慢慢修改,很多问题都是这里的问题
- INCA联动需要两个文件,一个是A2L文件,另一个是HEX文件,其中hex文件可以由MDK生成,A2L文件则需要自己进行获取和修改。在使用INCA进行IAP的时候,其中有一点需要注意,A2L文件会根据你在其内部定义的地址对HEX文件进行裁剪,例如你在4000-5000处有数据,但A2L里没有对4000-5000地址定义,那么INCA就会抛弃这段数据,从5000处开始往后延申
- 其中A2L文件我参考的以下大佬的博客:A2L文件解析
- 其次A2L文件有个官方文档,ASAP2文件,也需要参考这个文档进行查看
- 其中标定量是存储在FLASH中,运行在RAM里,需要在RAM和ROM里规定一块相同大小的区域,我用的是KEIL,如何将变量规定到指定的存储区域和运行区域,需要修改SCT分散加载文件
- 将标定量观测量添加到文件A2L末尾后,A2L文件里波特率,DTO和CRO的ID,FLASH地址,RAM地址等等设置完成后,就可以在INCA里添加A2L和hex文件进行连接和标定了
- 观测量格式
- 标定量格式
- INCA初始化的时候会传输大量报文,有很多都未使能宏定义,使能后很多函数都没有定义,但大部分都能在官方文档can_ccp.c里找到对应函数,CV过来后,有问题再读和修改
- matlab生成A2L,可以参考博客,Matlab生成标定量与替换a2l地址,axf和elf应该是一个东西,axf使用此方法替换也没问题
我遇到的问题
- 报文传输后,大小端弄反
- A2L标定区域地址设置错误
- 标定量区域未初始化,校验错误
- 观测量Daq上报,没有放进定时器
- A2L只给INCA,只与INCA发送的报文有关
- 0x09和0x11命令的函数可能要重写,can_ccp.c里的实现,我测试有点问题
- Received an unexpected PID 0(expected 11) on CanlD 0x07EA,这个问题困扰了我很久,这个需要你重新检查代码,大概就是发送顺序乱了