CANopen 是一種基于CAN的通信協議,已在工業領域得到了廣泛應用。
CAN提供可靠的底層數據傳輸,CANopen提供標準化的應用層協議。在CANopen協議中,每個CANopen設備都有一個對象字典。CANopen設備模型如下圖。對象字典描述了CANopen設備的所有行為和參數。
CanFestival是一套開源免費的CANopen協議棧。它功能強大,且提供圖像化的對象字典編輯工具。RT-Thread已經將CanFestival制作成軟件包。所以只需完善對應驅動就能實現CANopen。
本文將要介紹:在 ES32 平臺上,基于 RT-Thread bsp 實現 CANopen 從機的方法。
開啟本實驗前,讀者需要首先了解:
?本實驗基于RT-Thread 4.0.4版本,用戶可以從GitHub或Gitee獲?。?/p>
☆從GitHub下載RT-Thread 4.0.4:https://github.com/RT-Thread/rt-thread/tree/v4.0.4
☆從Gitee下載RT-Thread 4.0.4:https://gitee.com/rtthread/rt-thread/tree/v4.0.4
? 基礎的軟硬件環境配置和ES-CodeMaker使用方法。詳細請查看(點擊直接打開):工程師筆記 | ES-CodeMaker for RT-Thread (一)快速上手
? ES-CodeMaker for RT-Thread軟件的獲取方法,在文本的最后給出。
1. 硬件配置
本實驗使用ZLG的USBCAN-E-P做為主站,ES-PDS-ES32F3696LX開發板和ES-PDS-CAN模塊作為從機。
▲CANopen主站卡
將ES-PDS-CAN模塊插入開發板CAN接口上。CAN模塊與開發板的連接:
ES-PDS-CAN模塊接口 | ES-PDS-ES32F3696LX開發板管腳功能 |
---|---|
VCC | 電源VDD |
GND | 電源地GND |
RX | CAN0_RX(PB8) |
TX | CAN0_TX(PB9) |
USBCAN-E-P CANopen主站卡與ES-PDS-CAN模塊的連接:
CANopen主站卡接口 | ES-PDS-CAN模塊接口 |
---|---|
CAN_H | CAN_H |
CAN_L | CAN_L |
ES-PDS-ES32F3696LX開發板上的跳線接口:
2 . 閉合JP2、JP3:通過板載調試器將UART2轉為串口,方便調試程序。
2. 驅動配置
通過ES-CodeMaker可實現可視化的管腳功能配置
新建工程
選擇芯片ES32F3696LX,填寫工程名稱和路徑,選擇模板 pkg-example-canopen:
開啟 UART2 功能和對應的管腳作為RT-Thread的控制臺功能。
開啟 CAN0 的管腳: PB8,PB9 ,并選擇相應的CAN功能,可以設置can設備的名稱。設備配置為:波特率1000000,使能失敗自動重發,再同步跳轉寬度為4個時間片。
開啟 AD16C4T0 作為 HWTIMER ,并選擇相應的功能,可以設置hwtimer設備的名稱。設備配置為:遞增計數模式。
3. RT-Thread配置
使用RT-Thread env工具配置RT-Thread的內核、組件、軟件包和驅動。
1 . 在路徑rt-thread-v4.0.4spessemies32f369x中,打開ENV工具
2 . 輸入menuconfig配置工程
rt-thread 內核配置
RT-Thread Kernal -> Kernel Device Object 進行內核設備對象設置。將控制臺的設備名改為“uart2”。
rt-thread 軟件包 CanFestival 配置
RT-Thread online packages → miscellaneous packages開啟CanFestival 軟件包,選擇版本:v1.0.0。CanFestival是一個開源免費的 CANopen 協議棧。
RT-Thread online packages → miscellaneous packages → CanFestival: A free software CANopen framework 打開配置界面。選擇can和hwtimer的設備名,及線程的優先級。
UART 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> UART Drivers 開啟uart2,與RT-Thread控制臺通信。
CAN 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> CAN Drivers 開啟can0,為CanFestival提供CAN驅動。
TIMER 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> HWTIMER Drivers 開啟timer0,為CanFestival提供timer驅動。
開啟CANopen用例
Hardware Drivers Config -> Pkgs Support Example -> Canopen -> USBCAN_E_P_EXAMPLE_SLAVE開啟CANopen從機例程。
配置好之后保存退出。
3 . 輸入pkgs --update命令更新軟件包。然后根據 6. 軟件包程序修改說明 優化軟件包的部分接口。
4 . 輸入scons --target=mdk5命令生成keil5工程。(使用IAR等其他平臺指定--target=xxx即可)
5 . 使用Keil5打開工程,編譯并下載。
4. 實驗說明
1 . 安裝CANopen對象字典編輯工具
CANopen協議的核心是對象字典。由于CANopen的對象字典較為復雜,不建議手寫對象字典。CANopen對象字典編輯工具安裝方法如下:
? 首先獲取資源:
☆從官方獲取python2.7:
https://www.python.org/downloads/release/python-2715/
☆從官方獲取wxPython2.8:
https://sourceforge.net/projects/wxpython/files/wxPython/2.8.12.1/
☆2種獲取CANopen源碼的方式:
a . 從官方獲取CANopen源碼:
https://bitbucket.org/Mongo/canfestival-3-asc
b . 從百度網盤獲取CANopen源碼:
https://pan.baidu.com/s/1b9K0vIzu_EVWK1BLURJEPQ 提取碼為:j2w2
資源獲取成功后:
a . 安裝python2.7。
b . 安裝wxPython2.8。
c . 解壓CANopen源碼,獲得Mongo-canfestival-3-asc-1a25f5151a8d文件夾。
d . 解壓Mongo-canfestival-3-asc-1a25f5151a8dobjdictgenGnosis_Utils-current.tar.gz,獲得Gnosis_Utils-1.2.2.tar。
解壓Gnosis_Utils-1.2.2.tar后,獲得Gnosis_Utils-1.2.2文件夾。
e . 將 Gnosis_Utils-1.2.2gnosis文件夾,復制到 Mongo-canfestival-3-asc-1a25f5151a8dobjdictgen路徑下。如下圖所示:
f . 雙擊 Mongo-canfestival-...objdictgenobjdictedit.py。
如果安裝正常,則會出現以下的界面:
2 . CANopen對象字典編輯工具的使用方法如下:
a . 點擊左上角的按鈕“文件”,可新建或打開對象字典。
打開bsp中的對象字典。
打開對象字典成功后,如下圖所示:
b . 點擊選項后,可編輯字典,如下圖所示:
CANopen對象字典各索引范圍的描述如下圖。
對象字典索引0x2000~0x5FFF的制造商特定自協議區,常被用于存放應用數據。
如下圖所示:可以直接通過編輯工具修改對象字典索引0x2100的數據。
c . 將CANopen對象字典輸出的方法如下:
點擊【建立字典】后,會生成.c和.h對象字典文件。如果當前打開的是工程內的.od文件,則會更新工程中的對象字典。
點擊【導出成EDS文件】后,會生成eds文件。CANopen主機需要用eds文件解析從機。
4 . CANopen從機程序流程。
在CANopen中,PDO為過程數據對象協議,可用于在多節點之間交換即時數據。PDO被分為RPDO和TPDO。RPDO為從機接收數據。TPDO為從機發送數據。
在用例從機對象字典中,有4個RPDO,4個TPDO。在下圖中N的取值為1~4。
如上圖所示,應用層CANopen從機程序流程為:
a . 初始化底層驅動。初始化CANopen,并導入對象字典。
b . 從機進入預操作狀態后,不斷讀寫對象字典。
注意:因為雙方的時鐘相互獨立,存在誤差。所以加速了當前使用的硬件定時器,使從機能及時響應主機。
5 . CANopen主站卡環境安裝。
本實驗用 USBCAN-E-P CANopen主站卡作為CANopen主機,開發板作為CANopen從機。
? 從官網獲取 USBCAN-E-P 資料:
☆ 獲取USBCAN-E-P 的PC端上位機軟件安裝包:
https://www.zlg.cn/data/upload/software/Can/CANopen_Setup.rar
☆ 獲取USBCAN-E-P用戶手冊:
https://www.zlg.cn/data/upload/software/Can/USBCAN_E_P_CANOpen_um.pdf
☆獲取USBCAN-E-P驅動:
https://www.zlg.cn/data/upload/software/Can/USBCAN_E_P_drive.zip
PC端上位機軟件安裝完成后,獲得軟件 CANManager for CANopen :
然后根據用戶手冊,安裝USBCAN-E-P驅動。
5. 實驗現象
1 .將CANopen從機程序下載后,RT-Thead控制臺輸出如下信息:
2 . 然后打開CANManager for CANopen。
導入CANopen從機的eds。
選擇從機用例的eds文件。文件路徑為:driverspkg_support_examplecanopenUSBCAN-E-P-example-slaveapp_od.eds
點擊搜索,開始搜索從機,如下圖所示:
搜索到從機后,點擊右下角的關閉按鈕后,如下圖所示:
3 . 點擊左上角的啟動后,設置如圖:
啟動后,可觀察到現象:主機收到從機的TPDO中,紅色框中的數據在不斷循環。藍色框中的數據不變,為字典中的初始值。與程序流程圖邏輯一致。
點擊RPDO1的手動發送后。TPDO1的后4字節數據與RPDO1的后4字節數據一致。
修改RPDO2后4字節數據后,點擊RPDO2的手動發送后。TPDO2的后4字節數據與RPDO2的后4字節數據一致。
4 . 實驗完成后,RT-Thread控制臺輸出如下信息:
如果主機和從機幾乎同時往CAN總線發送數據,就會有 CAN通訊超載 的緊急報文。
receivedEMCYmessage.Node:08ErrorCode:8110ErrorRegister:11
CANopen緊急報文錯誤代碼說明如下:
6. 軟件包程序修改說明
1 . CanFestival 軟件包修改(版本:v1.0.0)
該軟件包有3處需要修改:
軟件包第1處修改
修改原因:can過濾器控制塊配置不正確。
a . 宏RT_CAN_FILTER_ITEM_INIT,會將過濾表號設置為-1。如果過濾表號為-1,則表示:不指定過濾表號,該過濾器控制塊不會被初始化。這會導致回調函數無效。所以需要修改過濾表號:將過濾表號修改為 0。
b . 適配rt-thread的驅動框架。將過濾表模式修改為0。
具體修改如下:(修改前的代碼 + 修改后的代碼)
將 packagesCanFestival-v1.0.0srccan_rtthread.c 進行更改。can_rtthread.c的部分內容如下:
修改前:
structrt_can_filter_itemfilter1item[1]= { RT_CAN_FILTER_ITEM_INIT(0x180,0,0,1,0,can1ind,&can_data.event) };
修改后:
structrt_can_filter_itemfilter1item[1]= { { .id=0x180, .ide=0, .rtr=0, .mode=0,/*過濾表模式*/ .mask=0, .hdr=0,/*過濾表號*/ .ind=can1ind, .args=&can_data.event } };
軟件包第2處修改
修改原因:部分符號定義沖突。在ES32底層庫中,TRUE 和 FALSE會被定義為枚舉。在軟件包中,TRUE 和 FALSE會被定義為宏。
具體修改如下:
在 packagesCanFestival-v1.0.0incdef.h 的#define __def_h__的下方加入頭文件:
#include"type.h"
軟件包第3處修改
修改原因:刪除非必要的文件。
具體修改如下:
packagesCanFestival-v1.0.0src imer_rtthread.c
#include
7. 如何獲取 ES-CodeMaker for RT-Thread?
審核編輯:湯梓紅
-
通信協議
+關注
關注
28文章
915瀏覽量
40440 -
CANopen
+關注
關注
8文章
270瀏覽量
43750 -
開發板
+關注
關注
25文章
5121瀏覽量
98195
原文標題:工程師筆記 | 使用ES32實現CANopen從機
文章出處:【微信號:東軟載波微電子,微信公眾號:東軟載波微電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
工程師筆記 | ES32 SDK 支持的 RTOS
![工程師筆記 | <b class='flag-5'>ES32</b> SDK 支持的 RTOS](https://file.elecfans.com/web2/M00/1B/14/pYYBAGGB8WiAdC_hAAJyALqI0mc817.png)
ES-LinkII 可以用于多款MCU開發的工具
基于STM32的CANopen通訊協議的實現
如何使用STM32單片機開發一款CANopen產品
基于STM32F103單片機的CANopen實現
工業通訊中CANOPEN轉EtherCAT的轉換
CANopen協議講座(4)之CANopen從站設備及其應用
CANopen協議講座(5)之CANopen從站模塊(XGa
CANopen協議講座(6)之CANopen從站模塊(Tin
基于CANopen協議從站設備快速實現方法
![基于<b class='flag-5'>CANopen</b>協議<b class='flag-5'>從</b>站設備快速<b class='flag-5'>實現</b>方法](https://file1.elecfans.com//web2/M00/A5/99/wKgZomUMOS2AOZM-AACDLjiMo0g215.jpg)
CANopen IO耦合器功能的實現
哪些設備屬于canopen 從站范疇?
【CANopen系列】CANopen從站為什么總不上傳PDO報文?
![【<b class='flag-5'>CANopen</b>系列】<b class='flag-5'>CANopen</b><b class='flag-5'>從</b>站為什么總不上傳PDO報文?](https://file.elecfans.com/web2/M00/50/DA/pYYBAGLH6TyAB71EAAAPQ7KgtYA038.png)
評論