CANOpen移植记录

一、前言

最近项目要求使用CANOpen。在网上找了很多文章,跟着别人的指导进行移植,这里做个我自己的移植记录。
主要参考的是文章如下:
基于STM32F4的CANOpen移植教程(超级详细)
基于STM32F4的CANopen快速SDO通信(超级详细)
CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32
还有野火的CANOpen例程:
STM32模块例程介绍-CANOpen协议
感谢前辈的分享。

二、移植操作

在移植CANFestival的代码后,主要需要我们实现的是一个定时器,给CANOpen协议代码使用,还有就是CAN帧的收发。
我的代码移植参考工程主要是我上面列出的前两篇文章作者提供的例程!!!
在他的移植基础上做了一定的修改。这里特别记录一下:
第一,CAN接收
图一
图一 参考代码
图二
图二 修改后的代码
从上两幅图可以看出原作者在接收数据的处理上并不打算使用CANFestival的代码。我这里修改了一下,因为我后续在读取数据时,需要使用到CANFestival接收回调函数。

第二,CAN发送
图三
发送这里,相较于原作者的代码,我修改了返回值。在发送成功后,应该返回“0”,这样才符合移植的CANOpen代码的使用要求。

第三,定时器的修改
函数void setTimer(TIMEVAL value)主要被源码用来定时的,时间到了就需要调用一下函数TimeDispatch(),
函数TIMEVAL getElapsedTime(void)主要被源码用来查询距离下一个定时触发还有多少时间。
在这里插入图片描述
图四
原作者的定时器相关的实现代码看起来有点费劲,有点饶,我这里根据setTimer和getElapsedTime函数的功能要求做了修改。也不知道这样改对不对,目前的使用是没有出现问题的。有大佬看到了,麻烦指正一下,谢谢。

第四,关于从机上线的操作
在NMT网络管理中,需要主机管理从机上线。在原作者的移植例程中,主机对从机的上线请求是不会进行响应的。如果需要使用PDO,就需要主机对从机的上线请求进行响应,那么就需要修改lifegrd.c中的void _post_SlaveBootup(CO_Data* d, UNS8 SlaveID){(void)d;(void)SlaveID;},我在参考了一下野火的例程后,修改如下:
在这里插入图片描述
在未进行修改前,从机发送上线帧后,如果配置了发送心跳,那么就会看到从机的状态是预操作状态,如下图所示。
在这里插入图片描述
在进行修改后,我们可以看到从机进入到操作状态。如下图所示。
在这里插入图片描述

第五,关于SDO的读取操作
原作者是直接按照CANOpen协议进行组包发送的,没有使用我们移植的CANFestival的代码机制。我这里做了修改,采用了移植的CANFestival的代码。如下图所示。
在这里插入图片描述
在这里插入图片描述
readNetworkDictCallback函数是SDO读取函数,并且注册了回调函数。
SDO_ReadCallback_t函数就是我们注册的回调函数。当从机(服务端)响应了主机(客户端)的读取操作,返回读取的数据,主机进入到CAN接收中断,然后调用接收数据处理函数canDispatch后就会调用SDO_ReadCallback_t函数。在SDO_ReadCallback_t函数中,再使用getReadResultNetworkDict函数就可以读取到从机数据。
这里有个需要注意的地方:getReadResultNetworkDict函数的第四个输入参数,需要我们将读取数据缓冲区的长度大小变量地址给到该函数,在给入之前,我们需要将该变量赋值为我们开的数据缓冲区的大小,因为该函数中在copy读数据前会要判断缓冲区是否够大。然后在copy完后,又会修改该变量的值为copy的数据的长度。

第六,关于同步帧设置时间间隔
在这里插入图片描述
这里的时间单位是us。我这里测试设置的是1s的时间间隔。

第七,关于同步帧ID
基本所有的指导文档都会说,同步报文的CAN-ID一般选用0x80。但是在我们使用CANFestival配置同步报文的ID时,需要配置成0x40000080,这么配置的原因是:在调用startSYNC函数来启用主机发送同步帧的机制时,该函数会将设置的CAN-ID和0x40000000进行与操作,满足了才会启动同步机制。为什么要这样,我也不清楚。有知道的大佬麻烦评论区帮忙解释一下,谢谢。
在这里插入图片描述
在这里插入图片描述
第八,关于PDO操作
参考下面这篇文章即可。
canfestival之心跳和TPDO配置与实验和RPDO的配置与实验与回调函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值