STM32H743+CubeIDE-CanFestival实现两个CANopen Master同时独立运行
文章目錄
- 一. 前言
- 1.1 兩路CANopen Master解決的問題
- 1.2CanFestival庫移植
- 1.3 STM32H743
- 二. 兩套對象字典
- 三. Master節點初始化
- 四. CanFestival-接口函數canSend()
- 五. CanFestival-接口函數canDispatch()
一. 前言
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協議只是一個應用層代碼。
二. 兩套對象字典
同時運行兩個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的工程一樣的,所以沒什么好說的。
總結
以上是生活随笔為你收集整理的STM32H743+CubeIDE-CanFestival实现两个CANopen Master同时独立运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: requirejs加载顺序_前端模块化之
- 下一篇: CANopen | 对象字典OD 01