CANOPEN协议栈的移植以及使用

2019-07-20 01:19发布

这是一篇入门帖,高手请指点一下,主要是记录我对CANOPEN协议的理解以及使用。图片还没研究好怎么上传,等后面研究好了补上。第一步;新建一个工程,配置好各种时钟之类的。当然你用的是原子的板子, 你也可以拿一个LED实验或者蜂鸣器实验的工程  直接来改,你把其他的注释掉就好了。
第二步;到网上下载CanFestival源码CanFestival-3-10,解压出来,并将文件夹名字改为CanFestival-3-10。移植需要用到的源文件在CanFestival-3-10src目录下,头文件在CanFestival-3-10include目录下。
第三部;开始移植。





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
whj467467274672
1楼-- · 2019-07-22 18:26
 精彩回答 2  元偷偷看……
NewGuard
2楼-- · 2019-07-22 20:47
whj467467274672 发表于 2019-1-3 08:54
这个就是对象字典文件了,要自己来实现。你需要一个canopen对象字典编辑器

谢谢我昨天偶然间搞定了,objdictedit.py把TestMaster.od生成词典TestMaster.c就可以了,我这边移植完后感觉没怎么用上canfestival的感觉,只用TimeDispatch()就行了吗?我是有点迷茫,可否指点下?
whj467467274672
3楼-- · 2019-07-22 21:14
NewGuard 发表于 2019-1-3 09:22
谢谢我昨天偶然间搞定了,objdictedit.py把TestMaster.od生成词典TestMaster.c就可以了,我这边移植完后 ...

canDispatch()和TimeDispatch()都要用上
NewGuard
4楼-- · 2019-07-23 01:19
 精彩回答 2  元偷偷看……
whj467467274672
5楼-- · 2019-07-23 03:47
NewGuard 发表于 2019-1-3 16:24
1.TimeDispatch()在ms定时器里调用就需要管理了吧
2.canDispatch()怎么用,怎么才能和固件CAN的发送 ...

canDispatch()需要放在CAN中断接收里面,通过这个函数把接收的数据发送给协议栈处理。
只有一个F1的板子肯定是不行的,你遵守了CANOPEN协议,那么你就应该把数据发送出来,通过USB_CAN来观察报文。
NewGuard
6楼-- · 2019-07-23 08:44
whj467467274672 发表于 2019-1-3 16:40
canDispatch()需要放在CAN中断接收里面,通过这个函数把接收的数据发送给协议栈处理。
只有一个F1的板 ...

//中断接收函数
//USB_LP_CAN1_RX0_IRQHandler->HAL_CAN_IRQHandler->CAN_Receive_IT->HAL_CAN_RxCpltCallback
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
        __HAL_CAN_CLEAR_FLAG(hcan,CAN_IT_FMP0); //清除标志位
        HAL_CAN_Receive_IT(hcan, CAN_FIFO0); //重新开启接收中断
        __HAL_CAN_ENABLE_IT(hcan,CAN_IT_FMP0); //使能中断       
       
        can_msg.cob_id = hcan->pRxMsg->StdId;
        can_msg.rtr = hcan->pRxMsg->RTR;
        can_msg.len = hcan->pRxMsg->DLC;
        for(uint8_t i =0; i < 8; i++)
                can_msg.data = hcan->pRxMsg->Data;
        canDispatch(&TestMaster_Data, &can_msg);    //处理消息
       
        //printf("HAL_CAN_RxCpltCallbackata[0]= 0x%X,Data[1]=0x%X ",hcan->pRxMsg->Data[0],hcan->pRxMsg->Data[1]);
        UART_Mixed_TxTrigger(&muart1,(char *)hcan->pRxMsg->Data,hcan->pRxMsg->DLC);       
}

我大概就这么调用的,回头买个USBCAN调试工具再看看情况吧

一周热门 更多>