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是一套開(kāi)源免費(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ī)的方法。
開(kāi)啟本實(shí)驗(yàn)前,讀者需要首先了解:
?本實(shí)驗(yàn)基于RT-Thread 4.0.4版本,用戶(hù)可以從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)擊直接打開(kāi)):工程師筆記 | ES-CodeMaker for RT-Thread (一)快速上手
?ES-CodeMaker for RT-Thread軟件的獲取方法,在文本的最后給出。
1. 硬件配置
本實(shí)驗(yàn)使用ZLG的USBCAN-E-P作為主站,ES-PDS-ES32F3696LX開(kāi)發(fā)板和ES-PDS-CAN模塊作為從機(jī)。
▲CANopen主站卡
將ES-PDS-CAN模塊插入開(kāi)發(fā)板CAN接口上。CAN模塊與開(kāi)發(fā)板的連接:
ES-PDS-CAN模塊接口 | ES-PDS-ES32F3696LX開(kāi)發(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開(kāi)發(fā)板上的跳線接口:
1 . 閉合JP4:使開(kāi)發(fā)板為芯片供電。
2 . 閉合JP2、JP3:通過(guò)板載調(diào)試器將UART2轉(zhuǎn)為串口,方便調(diào)試程序。
2. 驅(qū)動(dòng)配置
通過(guò)ES-CodeMaker可實(shí)現(xiàn)可視化的管腳功能配置
新建工程
選擇芯片ES32F3696LX,填寫(xiě)工程名稱(chēng)和路徑,選擇模板 pkg-example-canopen:
開(kāi)啟 UART2 功能和對(duì)應(yīng)的管腳作為RT-Thread的控制臺(tái)功能。
開(kāi)啟 CAN0 的管腳: PB8,PB9 ,并選擇相應(yīng)的CAN功能,可以設(shè)置can設(shè)備的名稱(chēng)。設(shè)備配置為:波特率1000000,使能失敗自動(dòng)重發(fā),再同步跳轉(zhuǎn)寬度為4個(gè)時(shí)間片。
開(kāi)啟 AD16C4T0 作為 HWTIMER ,并選擇相應(yīng)的功能,可以設(shè)置hwtimer設(shè)備的名稱(chēng)。設(shè)備配置為:遞增計(jì)數(shù)模式。
3. RT-Thread配置
使用RT-Thread env工具配置RT-Thread的內(nèi)核、組件、軟件包和驅(qū)動(dòng)。
1 . 在路徑rt-thread-v4.0.4\bsp\essemi\es32f369x中,打開(kāi)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開(kāi)啟CanFestival 軟件包,選擇版本:v1.0.0。CanFestival是一個(gè)開(kāi)源免費(fèi)的 CANopen 協(xié)議棧。
RT-Thread online packages → miscellaneous packages → CanFestival: A free software CANopen framework打開(kāi)配置界面。選擇can和hwtimer的設(shè)備名,及線程的優(yōu)先級(jí)。
- UART 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> UART Drivers 開(kāi)啟uart2,與RT-Thread控制臺(tái)通信。
- CAN 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> CAN Drivers 開(kāi)啟can0,為CanFestival提供CAN驅(qū)動(dòng)。
- TIMER 配置
Hardware Drivers Config -> On-chip Peripheral Drivers -> HWTIMER Drivers 開(kāi)啟timer0,為CanFestival提供timer驅(qū)動(dòng)。
- 開(kāi)啟CANopen用例
Hardware Drivers Config -> Pkgs Support Example -> Canopen -> USBCAN_E_P_EXAMPLE_SLAVE開(kāi)啟CANopen從機(jī)例程。
配置好之后保存退出。
3 . 輸入pkgs --update命令更新軟件包。然后根據(jù)6. 軟件包程序修改說(shuō)明 優(yōu)化軟件包的部分接口。
4 . 輸入scons --target=mdk5命令生成keil5工程。(使用IAR等其他平臺(tái)指定--target=xxx即可)
5 . 使用Keil5打開(kāi)工程,編譯并下載。
4. 實(shí)驗(yàn)說(shuō)明
1 . 安裝CANopen對(duì)象字典編輯工具
CANopen協(xié)議的核心是對(duì)象字典。由于CANopen的對(duì)象字典較為復(fù)雜,不建議手寫(xiě)對(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)盤(pán)獲取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-1a25f5151a8d\objdictgen\Gnosis_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.2\gnosis文件夾,復(fù)制到Mongo-canfestival-3-asc-1a25f5151a8d\objdictgen路徑下。如下圖所示:
f . 雙擊Mongo-canfestival-...\objdictgen\objdictedit.py。
如果安裝正常,則會(huì)出現(xiàn)以下的界面:
2 . CANopen對(duì)象字典編輯工具的使用方法如下:
- a . 點(diǎn)擊左上角的按鈕“文件”,可新建或打開(kāi)對(duì)象字典。
打開(kāi)bsp中的對(duì)象字典。
打開(kāi)對(duì)象字典成功后,如下圖所示:
- b . 點(diǎn)擊選項(xiàng)后,可編輯字典,如下圖所示:
CANopen對(duì)象字典各索引范圍的描述如下圖。
對(duì)象字典索引0x2000~0x5FFF的制造商特定自協(xié)議區(qū),常被用于存放應(yīng)用數(shù)據(jù)。
如下圖所示:可以直接通過(guò)編輯工具修改對(duì)象字典索引0x2100的數(shù)據(jù)。
- c . 將CANopen對(duì)象字典輸出的方法如下:
點(diǎn)擊【建立字典】后,會(huì)生成.c和.h對(duì)象字典文件。如果當(dāng)前打開(kāi)的是工程內(nèi)的.od文件,則會(huì)更新工程中的對(duì)象字典。
點(diǎn)擊【導(dǎo)出成EDS文件】后,會(huì)生成eds文件。CANopen主機(jī)需要用eds文件解析從機(jī)。
4 . CANopen從機(jī)程序流程。
在CANopen中,PDO為過(guò)程數(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)后,不斷讀寫(xiě)對(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ī),開(kāi)發(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用戶(hù)手冊(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ù)用戶(hù)手冊(cè),安裝USBCAN-E-P驅(qū)動(dòng)。
5. 實(shí)驗(yàn)現(xiàn)象
1 .將CANopen從機(jī)程序下載后,RT-Thead控制臺(tái)輸出如下信息:
2 . 然后打開(kāi)CANManager for CANopen。
導(dǎo)入CANopen從機(jī)的eds。
選擇從機(jī)用例的eds文件。文件路徑為:drivers\pkg_support_example\canopen\USBCAN-E-P-example-slave\app_od.eds
點(diǎn)擊搜索,開(kāi)始搜索從機(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)文。
received EMCY message. Node: 08 ErrorCode: 8110 ErrorRegister: 11
CANopen緊急報(bào)文錯(cuò)誤代碼說(shuō)明如下:
6. 軟件包程序修改說(shuō)明
1 . CanFestival 軟件包修改(版本:v1.0.0)
該軟件包有3處需要修改:
軟件包第1處修改
修改原因:can過(guò)濾器控制塊配置不正確。
a . 宏RT_CAN_FILTER_ITEM_INIT,會(huì)將過(guò)濾表號(hào)設(shè)置為-1。如果過(guò)濾表號(hào)為-1,則表示:不指定過(guò)濾表號(hào),該過(guò)濾器控制塊不會(huì)被初始化。這會(huì)導(dǎo)致回調(diào)函數(shù)無(wú)效。所以需要修改過(guò)濾表號(hào):將過(guò)濾表號(hào)修改為 0。
b . 適配rt-thread的驅(qū)動(dòng)框架。將過(guò)濾表模式修改為0。
具體修改如下:(修改前的代碼 + 修改后的代碼)
將packages\CanFestival-v1.0.0\src\can_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,/*過(guò)濾表模式*/
.mask =0,
.hdr =0,/*過(guò)濾表號(hào)*/
.ind = can1ind,
.args = &can_data.event
}
};
軟件包第2處修改
修改原因:部分符號(hào)定義沖突。在ES32底層庫(kù)中,TRUE 和 FALSE會(huì)被定義為枚舉。在軟件包中,TRUE 和 FALSE會(huì)被定義為宏。
具體修改如下:
在packages\CanFestival-v1.0.0\inc\def.h的#define __def_h__的下方加入頭文件:
#include"type.h"
軟件包第3處修改
修改原因:刪除非必要的文件。
具體修改如下:
packages\CanFestival-v1.0.0\src\timer_rtthread.c
#include
-
CAN
+關(guān)注
關(guān)注
57文章
2903瀏覽量
467204 -
CANopen
+關(guān)注
關(guān)注
8文章
377瀏覽量
44678 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1385瀏覽量
41672
發(fā)布評(píng)論請(qǐng)先 登錄
工程師筆記 | ES32 SDK 支持的 RTOS

ES-LinkII 可以用于多款MCU開(kāi)發(fā)的工具
基于STM32的CANopen通訊協(xié)議的實(shí)現(xiàn)
如何使用STM32單片機(jī)開(kāi)發(fā)一款CANopen產(chǎn)品
基于STM32F103單片機(jī)的CANopen實(shí)現(xiàn)
工業(yè)通訊中CANOPEN轉(zhuǎn)EtherCAT的轉(zhuǎn)換
CANopen協(xié)議講座(4)之CANopen從站設(shè)備及其應(yīng)用
CANopen協(xié)議講座(5)之CANopen從站模塊(XGa
CANopen協(xié)議講座(6)之CANopen從站模塊(Tin
基于CANopen協(xié)議從站設(shè)備快速實(shí)現(xiàn)方法

ES32 USB協(xié)議棧用戶(hù)指南

ES32 USB協(xié)議棧例程用戶(hù)手冊(cè)

評(píng)論