工程師筆記 | 使用ES32實(shí)現(xiàn)CANopen從機(jī)
CANopen 是一種基于CAN的通信協(xié)議,已在工業(yè)領(lǐng)域得到了廣泛應(yīng)用。
CAN提供可靠的底層數(shù)據(jù)傳輸,CANopen提供標(biāo)準(zhǔn)化的應(yīng)用層協(xié)議。在CANopen協(xié)議中,每個(gè)CANopen設(shè)備都有一個(gè)對(duì)象字典。CANopen設(shè)備模型如下圖。對(duì)象字典描述了CANopen設(shè)備的所有行為和參數(shù)。
CanFestival是一套開源免費(fèi)的CANopen協(xié)議棧。它功能強(qiáng)大,且提供圖像化的對(duì)象字典編輯工具。RT-Thread已經(jīng)將CanFestival制作成軟件包。所以只需完善對(duì)應(yīng)驅(qū)動(dòng)就能實(shí)現(xiàn)CANopen。
本文將要介紹:在 ES32 平臺(tái)上,基于 RT-Thread bsp 實(shí)現(xiàn) CANopen 從機(jī)的方法。
開啟本實(shí)驗(yàn)前,讀者需要首先了解:
?本實(shí)驗(yàn)基于RT-Thread 4.0.4版本,用戶可以從GitHub或Gitee獲取:
☆從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
? 基礎(chǔ)的軟硬件環(huán)境配置和ES-CodeMaker使用方法。詳細(xì)請(qǐng)查看(點(diǎn)擊直接打開):工程師筆記 | ES-CodeMaker for RT-Thread (一)快速上手
? ES-CodeMaker for RT-Thread軟件的獲取方法,在文本的最后給出。
1. 硬件配置
本實(shí)驗(yàn)使用ZLG的USBCAN-E-P做為主站,ES-PDS-ES32F3696LX開發(fā)板和ES-PDS-CAN模塊作為從機(jī)。
▲CANopen主站卡
將ES-PDS-CAN模塊插入開發(fā)板CAN接口上。CAN模塊與開發(fā)板的連接:
ES-PDS-CAN模塊接口 | ES-PDS-ES32F3696LX開發(fā)板管腳功能 |
---|---|
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開發(fā)板上的跳線接口:
2 . 閉合JP2、JP3:通過板載調(diào)試器將UART2轉(zhuǎn)為串口,方便調(diào)試程序。
2. 驅(qū)動(dòng)配置
通過ES-CodeMaker可實(shí)現(xiàn)可視化的管腳功能配置
新建工程
選擇芯片ES32F3696LX,填寫工程名稱和路徑,選擇模板 pkg-example-canopen:
開啟 UART2 功能和對(duì)應(yīng)的管腳作為RT-Thread的控制臺(tái)功能。
開啟 CAN0 的管腳: PB8,PB9 ,并選擇相應(yīng)的CAN功能,可以設(shè)置can設(shè)備的名稱。設(shè)備配置為:波特率1000000,使能失敗自動(dòng)重發(fā),再同步跳轉(zhuǎn)寬度為4個(gè)時(shí)間片。
開啟 AD16C4T0 作為 HWTIMER ,并選擇相應(yīng)的功能,可以設(shè)置hwtimer設(shè)備的名稱。設(shè)備配置為:遞增計(jì)數(shù)模式。
3. RT-Thread配置
使用RT-Thread env工具配置RT-Thread的內(nèi)核、組件、軟件包和驅(qū)動(dòng)。
1 . 在路徑rt-thread-v4.0.4spessemies32f369x中,打開ENV工具
2 . 輸入menuconfig配置工程
rt-thread 內(nèi)核配置
RT-Thread Kernal -> Kernel Device Object 進(jìn)行內(nèi)核設(shè)備對(duì)象設(shè)置。將控制臺(tái)的設(shè)備名改為“uart2”。
rt-thread 軟件包 CanFestival 配置
RT-Thread online packages → miscellaneous packages開啟CanFestival 軟件包,選擇版本:v1.0.0。CanFestival是一個(gè)開源免費(fèi)的 CANopen 協(xié)議棧。
RT-Thread online packages → miscellaneous packages → CanFestival: A free software CANopen framework 打開配置界面。選擇can和hwtimer的設(shè)備名,及線程的優(yōu)先級(jí)。
UART 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> UART Drivers 開啟uart2,與RT-Thread控制臺(tái)通信。
CAN 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> CAN Drivers 開啟can0,為CanFestival提供CAN驅(qū)動(dòng)。
TIMER 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> HWTIMER Drivers 開啟timer0,為CanFestival提供timer驅(qū)動(dòng)。
開啟CANopen用例
Hardware Drivers Config -> Pkgs Support Example -> Canopen -> USBCAN_E_P_EXAMPLE_SLAVE開啟CANopen從機(jī)例程。
配置好之后保存退出。
3 . 輸入pkgs --update命令更新軟件包。然后根據(jù) 6. 軟件包程序修改說明 優(yōu)化軟件包的部分接口。
4 . 輸入scons --target=mdk5命令生成keil5工程。(使用IAR等其他平臺(tái)指定--target=xxx即可)
5 . 使用Keil5打開工程,編譯并下載。
4. 實(shí)驗(yàn)說明
1 . 安裝CANopen對(duì)象字典編輯工具
CANopen協(xié)議的核心是對(duì)象字典。由于CANopen的對(duì)象字典較為復(fù)雜,不建議手寫對(duì)象字典。CANopen對(duì)象字典編輯工具安裝方法如下:
? 首先獲取資源:
☆從官方獲取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 . 從百度網(wǎng)盤獲取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文件夾,復(fù)制到 Mongo-canfestival-3-asc-1a25f5151a8dobjdictgen路徑下。如下圖所示:
f . 雙擊 Mongo-canfestival-...objdictgenobjdictedit.py。
如果安裝正常,則會(huì)出現(xiàn)以下的界面:
2 . CANopen對(duì)象字典編輯工具的使用方法如下:
a . 點(diǎn)擊左上角的按鈕“文件”,可新建或打開對(duì)象字典。
打開bsp中的對(duì)象字典。
打開對(duì)象字典成功后,如下圖所示:
b . 點(diǎn)擊選項(xiàng)后,可編輯字典,如下圖所示:
CANopen對(duì)象字典各索引范圍的描述如下圖。
對(duì)象字典索引0x2000~0x5FFF的制造商特定自協(xié)議區(qū),常被用于存放應(yīng)用數(shù)據(jù)。
如下圖所示:可以直接通過編輯工具修改對(duì)象字典索引0x2100的數(shù)據(jù)。
c . 將CANopen對(duì)象字典輸出的方法如下:
點(diǎn)擊【建立字典】后,會(huì)生成.c和.h對(duì)象字典文件。如果當(dāng)前打開的是工程內(nèi)的.od文件,則會(huì)更新工程中的對(duì)象字典。
點(diǎn)擊【導(dǎo)出成EDS文件】后,會(huì)生成eds文件。CANopen主機(jī)需要用eds文件解析從機(jī)。
4 . CANopen從機(jī)程序流程。
在CANopen中,PDO為過程數(shù)據(jù)對(duì)象協(xié)議,可用于在多節(jié)點(diǎn)之間交換即時(shí)數(shù)據(jù)。PDO被分為RPDO和TPDO。RPDO為從機(jī)接收數(shù)據(jù)。TPDO為從機(jī)發(fā)送數(shù)據(jù)。
在用例從機(jī)對(duì)象字典中,有4個(gè)RPDO,4個(gè)TPDO。在下圖中N的取值為1~4。
如上圖所示,應(yīng)用層CANopen從機(jī)程序流程為:
a . 初始化底層驅(qū)動(dòng)。初始化CANopen,并導(dǎo)入對(duì)象字典。
b . 從機(jī)進(jìn)入預(yù)操作狀態(tài)后,不斷讀寫對(duì)象字典。
注意:因?yàn)殡p方的時(shí)鐘相互獨(dú)立,存在誤差。所以加速了當(dāng)前使用的硬件定時(shí)器,使從機(jī)能及時(shí)響應(yīng)主機(jī)。
5 . CANopen主站卡環(huán)境安裝。
本實(shí)驗(yàn)用 USBCAN-E-P CANopen主站卡作為CANopen主機(jī),開發(fā)板作為CANopen從機(jī)。
? 從官網(wǎng)獲取 USBCAN-E-P 資料:
☆ 獲取USBCAN-E-P 的PC端上位機(jī)軟件安裝包:
https://www.zlg.cn/data/upload/software/Can/CANopen_Setup.rar
☆ 獲取USBCAN-E-P用戶手冊(cè):
https://www.zlg.cn/data/upload/software/Can/USBCAN_E_P_CANOpen_um.pdf
☆獲取USBCAN-E-P驅(qū)動(dòng):
https://www.zlg.cn/data/upload/software/Can/USBCAN_E_P_drive.zip
PC端上位機(jī)軟件安裝完成后,獲得軟件 CANManager for CANopen :
然后根據(jù)用戶手冊(cè),安裝USBCAN-E-P驅(qū)動(dòng)。
5. 實(shí)驗(yàn)現(xiàn)象
1 .將CANopen從機(jī)程序下載后,RT-Thead控制臺(tái)輸出如下信息:
2 . 然后打開CANManager for CANopen。
導(dǎo)入CANopen從機(jī)的eds。
選擇從機(jī)用例的eds文件。文件路徑為:driverspkg_support_examplecanopenUSBCAN-E-P-example-slaveapp_od.eds
點(diǎn)擊搜索,開始搜索從機(jī),如下圖所示:
搜索到從機(jī)后,點(diǎn)擊右下角的關(guān)閉按鈕后,如下圖所示:
3 . 點(diǎn)擊左上角的啟動(dòng)后,設(shè)置如圖:
啟動(dòng)后,可觀察到現(xiàn)象:主機(jī)收到從機(jī)的TPDO中,紅色框中的數(shù)據(jù)在不斷循環(huán)。藍(lán)色框中的數(shù)據(jù)不變,為字典中的初始值。與程序流程圖邏輯一致。
點(diǎn)擊RPDO1的手動(dòng)發(fā)送后。TPDO1的后4字節(jié)數(shù)據(jù)與RPDO1的后4字節(jié)數(shù)據(jù)一致。
修改RPDO2后4字節(jié)數(shù)據(jù)后,點(diǎn)擊RPDO2的手動(dòng)發(fā)送后。TPDO2的后4字節(jié)數(shù)據(jù)與RPDO2的后4字節(jié)數(shù)據(jù)一致。
4 . 實(shí)驗(yàn)完成后,RT-Thread控制臺(tái)輸出如下信息:
如果主機(jī)和從機(jī)幾乎同時(shí)往CAN總線發(fā)送數(shù)據(jù),就會(huì)有 CAN通訊超載 的緊急報(bào)文。
receivedEMCYmessage.Node:08ErrorCode:8110ErrorRegister:11
CANopen緊急報(bào)文錯(cuò)誤代碼說明如下:
6. 軟件包程序修改說明
1 . CanFestival 軟件包修改(版本:v1.0.0)
該軟件包有3處需要修改:
軟件包第1處修改
修改原因:can過濾器控制塊配置不正確。
a . 宏RT_CAN_FILTER_ITEM_INIT,會(huì)將過濾表號(hào)設(shè)置為-1。如果過濾表號(hào)為-1,則表示:不指定過濾表號(hào),該過濾器控制塊不會(huì)被初始化。這會(huì)導(dǎo)致回調(diào)函數(shù)無效。所以需要修改過濾表號(hào):將過濾表號(hào)修改為 0。
b . 適配rt-thread的驅(qū)動(dòng)框架。將過濾表模式修改為0。
具體修改如下:(修改前的代碼 + 修改后的代碼)
將 packagesCanFestival-v1.0.0srccan_rtthread.c 進(jìn)行更改。can_rtthread.c的部分內(nèi)容如下:
修改前:
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,/*過濾表號(hào)*/ .ind=can1ind, .args=&can_data.event } };
軟件包第2處修改
修改原因:部分符號(hào)定義沖突。在ES32底層庫中,TRUE 和 FALSE會(huì)被定義為枚舉。在軟件包中,TRUE 和 FALSE會(huì)被定義為宏。
具體修改如下:
在 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?
審核編輯:湯梓紅
-
通信協(xié)議
+關(guān)注
關(guān)注
28文章
840瀏覽量
40215 -
CANopen
+關(guān)注
關(guān)注
8文章
243瀏覽量
43517 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4896瀏覽量
97058
原文標(biāo)題:工程師筆記 | 使用ES32實(shí)現(xiàn)CANopen從機(jī)
文章出處:【微信號(hào):東軟載波微電子,微信公眾號(hào):東軟載波微電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論