STM32H743+CubeIDE-CanFestival实现两个CANopen Master同时独立运行

一. 前言

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协议只是一个应用层代码。
stm32

二. 两套对象字典

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

三. Master节点初始化

对象字典Master1.c与Master2.c文件最底下分别有一个变量名为Master1_Data与Master2_Data的结构体变量,接着使用它们对两个CANopen Master节点初始化。
对象字典
初始化函数InitNodes()的内容如下,重点是Master1.Data与Master2.Data的结构体成员canHandle。它将决定到底是哪个CANopen Master调用了canSend()函数将CAN报文发出去。
在这里插入图片描述

四. CanFestival-接口函数canSend()

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

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

五. CanFestival-接口函数canDispatch()

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

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值