[应用相关] CanFestival实现两个CANopen Master同时独立运行

[复制链接]
2320|4
 楼主| 八层楼 发表于 2021-9-4 16:40 | 显示全部楼层 |阅读模式
一. 前言
1.1 两路CANopen Master解决的问题
CAN的最大的缺点是通讯波特率最高只有1M,当某一路CAN总线上的从站数量多且通讯的数据量大的话,CAN总线负载率就会很高,从而导致一些通讯问题。如果控制器同时独立运行两个CANopen Master,同时带起两路CAN总线的话,总线负载率的问题就能得到一定的缓解。

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

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

1019461333104147d3.png

 楼主| 八层楼 发表于 2021-9-4 16:41 | 显示全部楼层
二. 两套对象字典

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


 楼主| 八层楼 发表于 2021-9-4 16:42 | 显示全部楼层
三. Master节点初始化
对象字典Master1.c与Master2.c文件最底下分别有一个变量名为Master1_Data与Master2_Data的结构体变量,接着使用它们对两个CANopen Master节点初始化。
785396133315435fbb.png
初始化函数InitNodes()的内容如下,重点是Master1.Data与Master2.Data的结构体成员canHandle。它将决定到底是哪个CANopen Master调用了canSend()函数将CAN报文发出去。

657466133315a5d4fc.png
 楼主| 八层楼 发表于 2021-9-4 16:43 | 显示全部楼层
四. CanFestival-接口函数canSend()
canSend()的代码如下:
30285613331749c1c4.png
函数canSend()的第一个入口参数是canHandle,之前的初始化函数InitNode()将Master1_Data的canHandle设为0x01,而Master2_Data的canHandle设为0x02。
函数canSend()的内容也很简单,根据canHandle去选择调用相应的FDCAN底层,将CAN报文发出去即可。

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

944386133317b97a2b.png

 楼主| 八层楼 发表于 2021-9-4 16:44 | 显示全部楼层
五. CanFestival-接口函数canDispatch()

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


您需要登录后才可以回帖 登录 | 注册

本版积分规则

131

主题

4396

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部