目录
1.CCP代码实现
1.1CCP接口代码实现
首先,我们需要下载CCP的代码,在vector官网上下载一个即可,CSDN上也可以下载。下载之后点击exe我们会得到三个文件,分别是CCP.c,CCP.h,CCPPAR.h
下面是整个移植的文件:
ccp.c和ccp.h,ccppar.h这三个文件由官方提供,我们直接复制即可,我们需要编写的是CAN接口函数,即ccp_can_interface.c这个函数,首先把需要移植的函数放在ccp_can_interface.h中:
这些函数都是需要我们自己编写的,全局中断函数和CAN发送函数根据我们的底层实现,其它函数均可直接照抄vector给的例子。核心函数在于ccpSend(CCP_BYTEPTR msg)和CCP_recv(void)。ccpSend函数的数据类型和名称不可修改,因为我们这个函数要在ccp.c中调用。
ccp_can_interface.c文件内容如下图所示:
接收函数要注意,最后我会讲到这里要注意的地方:下面的接收函数是重点:
CCPPAR.h函数中我们需要修改数据类型和设置收发的ID:
1.2 CAN底层配置
CAN设置由SDK生成,将CAN组件添加进去即可,不需要做任何修改。
在CAN.c文件中,只放一个回调函数即可:
其他部分均在主函数中编写:
实际上,如果我们阅读CCP.c文件中的ccpSendcallback这个函数的话,我们会发现,实际上他就是判断下位机端收报文是否完成的一个函数。若收到报文,就会调用一次ccpSend这个函数,发送对应的报文,所以我们的核心是ccpSend这个函数,一定要确保我们的单片机能正常发送报文,CAN收发一定要调通。移植过程中有比较坑的地方,下面我会都列举出来:
2.注意事项
2.1 如何判断我们ccp协议是否移植成功?
在移植完成后,打开cantest,发送报文,报文指定ID是我们设置的ID。发送connect这条指令,若收到从机应答,则代表移植成功:
2.2 接收发送函数和接口函数编写时的要点
CAN收发的buff函数必须写在int main()函数内,不可做任何封装,笔者没搞懂为何要这样。如果用函数封装,或模块化编程写在另一个.c文件内再引用,就会整段丢失数据。
整段丢失数据:
ccpSend函数编写时要注意,此函数是定死的,固定写为void ccpSend(CCP_BYTEPTR msg),因为msg这个数组在ccp.c中也是这个名称,故不可修改。在while循环或者函数内部调用的时候要注意的是,ccpSend(CCP_BYTEPTR msg)这个函数写进去会报错,这是因为我们函数的格式不对,不能这么写。点开CCPPAR.h这个文件夹,我们会发现msg是个char类型的指针:我们要调用时,需将其写为ccpSend(&msg),这样就不会报错了。
2.3数据段明明设置的标准帧,但是自己变成远程帧而且ID总是0?
这还是由于我们的BUFF函数没有配置对,或者函数没有放进主函数内部造成的。若前两者都没有问题,那我们需要检查我们的CAN组件,把FD那个选项的勾去掉。