打印
[应用相关]

CanFestival实现两个CANopen Master同时独立运行

[复制链接]
1090|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一. 前言
1.1 两路CANopen Master解决的问题
CAN的最大的缺点是通讯波特率最高只有1M,当某一路CAN总线上的从站数量多且通讯的数据量大的话,CAN总线负载率就会很高,从而导致一些通讯问题。如果控制器同时独立运行两个CANopen Master,同时带起两路CAN总线的话,总线负载率的问题就能得到一定的缓解。

1.2CanFestival库移植
CanFestival是实现CANopen协议的嵌入式库,支持ARM,STM32,AVR等平台。关于CanFestival的移植,可以直接参考硬石科技STM32H7开发板的教程。通过硬石科技STM32H7教程,移植CanFestival库应该没问题的。


1.3 STM32H743
STM32H743同时有两个FDCAN控制器,那么使用CanFestival库同时运行两个CANopen Master肯定是没有问题的,毕竟Canopen协议只是一个应用层代码。



使用特权

评论回复
沙发
八层楼|  楼主 | 2021-9-4 16:41 | 只看该作者
二. 两套对象字典

同时运行两个CANopen主站,需要建立两套对象字典。熟悉CANopen协议后,就知道通过对象字典可以控制CANopen主站的行为。比如通过修改对象字典,让主站按照一定的周期发送同步帧SYN等等。


使用特权

评论回复
板凳
八层楼|  楼主 | 2021-9-4 16:42 | 只看该作者
三. Master节点初始化
对象字典Master1.c与Master2.c文件最底下分别有一个变量名为Master1_Data与Master2_Data的结构体变量,接着使用它们对两个CANopen Master节点初始化。

初始化函数InitNodes()的内容如下,重点是Master1.Data与Master2.Data的结构体成员canHandle。它将决定到底是哪个CANopen Master调用了canSend()函数将CAN报文发出去。


使用特权

评论回复
地板
八层楼|  楼主 | 2021-9-4 16:43 | 只看该作者
四. CanFestival-接口函数canSend()
canSend()的代码如下:

函数canSend()的第一个入口参数是canHandle,之前的初始化函数InitNode()将Master1_Data的canHandle设为0x01,而Master2_Data的canHandle设为0x02。
函数canSend()的内容也很简单,根据canHandle去选择调用相应的FDCAN底层,将CAN报文发出去即可。

两个CANopen Master同时运行,重点是利用canSend( )的第一入口参数判断调用哪个一路FDCAN发送报文。



使用特权

评论回复
5
八层楼|  楼主 | 2021-9-4 16:44 | 只看该作者
五. CanFestival-接口函数canDispatch()

在中断回调函数里调用canDispatch( )将接收到的CAN报文放入对象字典里解析。这个跟只有一个CANopen Master的工程一样的,所以没什么好说的。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

3956

帖子

2

粉丝