1寫在前面
該系列教程上一篇文章《協(xié)議源碼移植(一)》算是對CANOpen移植的準(zhǔn)備工作,如果想要理解移植過程的知識(shí),其實(shí)還有許多內(nèi)容得了解。
本文挑一些重點(diǎn)來講述,從協(xié)議源碼添加到工程,源代碼理解,到最后輸出效果。
提示:該系列教程基于:CanFestival架構(gòu)、STM32F1芯片、FreeRTOS操作系統(tǒng)、Keil MDK-ARM開發(fā)環(huán)境。
2
添加源碼、路徑
本節(jié)內(nèi)容針對初學(xué)者做出簡要描述,相關(guān)內(nèi)容可參看文章《Keil系列教程02_新建基礎(chǔ)軟件工程》。
2.1 添加組、文件
簡單來說,就是在你已建好的工程中添加與CANOpen相關(guān)的組和文件,如下圖:
2.2 添加路徑
添加CANOpen源碼的inc頭文件等相關(guān)路徑,編譯的時(shí)候才能找到對應(yīng)文件。
3
添加代碼及分析
移植的重要過程就是添加、刪除和修改源代碼這一步驟。從教程上一篇文章下載,并看過源代碼的朋友就會(huì)發(fā)現(xiàn),其實(shí)我們需要添加的代碼并不多,主要就是需要實(shí)現(xiàn)幾個(gè)底層的驅(qū)動(dòng)函數(shù)。
下面將重要的幾點(diǎn)羅列出來。
1.修改canfestival.h文件
上文說了一下:添加三行語句,防止遞歸包含。
這里就是CANOpen定義的底層驅(qū)動(dòng)接口,接口函數(shù)具體代碼需要我們自己實(shí)現(xiàn)。
canSend這個(gè)函數(shù)被CANOpen源代碼調(diào)用的最多,我們最好不修改函數(shù)接口,同時(shí)需要我們實(shí)現(xiàn)(我在canopen_drv.c中實(shí)現(xiàn)的)。
其它initTimer、 canInit等函數(shù)接口,在源碼中沒有調(diào)用,我也沒有按照這套接口來實(shí)現(xiàn)(初始化我在bsp下實(shí)現(xiàn)的)。
2.底層驅(qū)動(dòng)初始化代碼
上面說的initTimer、 canInit初始化,我這邊為了與我代碼一致,使用TIM_Initializes、CAN_Initializes替代。
分別位于bsp_timer.c 和 bsp_can.c下面,實(shí)現(xiàn)的具體內(nèi)容這里不描述,具體可以下載源碼工程參看。
3.定時(shí)器調(diào)度相關(guān)接口
其中setTimer和getElapsedTime這兩個(gè)函數(shù)會(huì)被timer.c協(xié)議源文件調(diào)用。在timer.h里面有什么(如下圖),但函數(shù)體沒有實(shí)現(xiàn),需要我們自己實(shí)現(xiàn)。
同時(shí),TimeDispatch函數(shù)已經(jīng)實(shí)現(xiàn),定義在timer.c,但需要被定時(shí)調(diào)用(調(diào)度)。
4.CAN發(fā)送接口函數(shù)canSend
這個(gè)CAN發(fā)送函數(shù)相當(dāng)重要,接口最好不要自定義,因?yàn)閟cr下面多個(gè)源文件都調(diào)用了該函數(shù)。
同時(shí),發(fā)送函數(shù)會(huì)被定時(shí)調(diào)度。所以,如果你調(diào)度方式像我例程那樣,使用定時(shí)器中斷的方式實(shí)現(xiàn)。那么,你就要考慮在中斷函數(shù)里面發(fā)送的情況。
以上就是CANOpen移植,底層驅(qū)動(dòng)相關(guān)的一些接口實(shí)現(xiàn)和說明。這部分內(nèi)容,CanFestival框架提供源碼是定義在drivers下面,比如STM32F1的就是cm3下面的cm3.c:
我單獨(dú)提出來實(shí)現(xiàn)這些驅(qū)動(dòng)函數(shù)是因?yàn)槲遗芰艘粋€(gè)FreeRTOS系統(tǒng)。當(dāng)然,你的驅(qū)動(dòng)也可按照drivers下面那樣實(shí)現(xiàn)。
5.其它
A.發(fā)送和接收緩存
我這邊是通過隊(duì)列來實(shí)現(xiàn)發(fā)送和接收緩存,而cm3.c是通過MessBuf_Write和MessBuf_Read來實(shí)現(xiàn)緩存。
B.中斷接收
我使用CAN中斷接收數(shù)據(jù),和定時(shí)器中斷調(diào)度。
提示:我中斷入口函數(shù)是宏定義實(shí)現(xiàn)的,需要包含宏定義頭文件。
#define CAN_RX_IRQHandler USB_LP_CAN1_RX0_IRQHandler
#define CANOPEN_TIM_IRQ_Handler TIM2_IRQHandler
C.配置節(jié)點(diǎn)
配置節(jié)點(diǎn)ID,節(jié)點(diǎn)的狀態(tài),這里只是簡單的Demo,沒有添加應(yīng)用代碼。
4
工程下載及運(yùn)行效果
1.下載工程“CANOpen工程模板(含主、從站-心跳)”
https://pan.baidu.com/s/1LzD0Epc-Z8vlHsb-sD3WVw
提取碼:l2dc
2.運(yùn)行效果
我提供的例程是一個(gè)只有心跳(間隔時(shí)間我們配置為1000ms)Demo工程。所以,啟動(dòng)之后,你會(huì)發(fā)現(xiàn)總線上間隔1秒有一個(gè)心跳。
下圖是我通過CAN分析儀抓取的CAN總線數(shù)據(jù)(如果你沒有分析儀,可以用我《系列教程6》提供的例程,通過串口打印)
先啟動(dòng)一會(huì)兒主站,然后關(guān)閉,再啟動(dòng)從站的數(shù)據(jù),重要信息我都標(biāo)記出來了。
A.上線報(bào)文:ID:0x700 Data:0
B.網(wǎng)絡(luò)管理:ID:0x000 Data:00代表管理所有節(jié)點(diǎn) Data:80代表復(fù)位節(jié)點(diǎn)
C.心跳報(bào)文:ID:0x700 Data:05代表Operational操作狀態(tài)
提示:主站具有網(wǎng)絡(luò)管理,而從站沒有。同時(shí),數(shù)據(jù)值(如81、05)的含義可參看CiA 301手冊網(wǎng)絡(luò)管理的章節(jié)(后期進(jìn)行講述)。
-
CAN
+關(guān)注
關(guān)注
57文章
2917瀏覽量
467577 -
CANopen
+關(guān)注
關(guān)注
8文章
393瀏覽量
44819 -
STM32F
+關(guān)注
關(guān)注
1文章
40瀏覽量
18532
發(fā)布評論請先 登錄
CANopen轉(zhuǎn)EtherCAT協(xié)議轉(zhuǎn)換案例解析

協(xié)議大和解:ETHERCAT轉(zhuǎn)CANopen網(wǎng)關(guān)配置

面向高溫工業(yè)場景的EtherCAT/CANopen協(xié)議轉(zhuǎn)換系統(tǒng)設(shè)計(jì)與應(yīng)用

EtherCAT轉(zhuǎn)CANopen協(xié)議網(wǎng)關(guān)應(yīng)用詳解

Profinet轉(zhuǎn)CanOpen網(wǎng)關(guān),打破協(xié)議壁壘的關(guān)鍵技術(shù)

使用ES32實(shí)現(xiàn)CANopen從機(jī)

CANOPEN協(xié)議詳細(xì)介紹
顛覆想象!CanOpen轉(zhuǎn)ProfiNet網(wǎng)關(guān)重塑糾偏系統(tǒng)格局

2025必備知識(shí),CANopen轉(zhuǎn)EtherCAT協(xié)議允許配備啥協(xié)議的電氣設(shè)備

CANopen協(xié)議架構(gòu)和應(yīng)用原理
EtherNet/IP轉(zhuǎn)CANopen主站協(xié)議轉(zhuǎn)換網(wǎng)關(guān)

EtherNet/IP轉(zhuǎn)CANopen主站協(xié)議網(wǎng)關(guān)(JM-EIP-COP)

EtherCAT從站轉(zhuǎn)CANopen主站協(xié)議網(wǎng)關(guān)(JM-ECT-COP)

EtherNet轉(zhuǎn)CANopen協(xié)議轉(zhuǎn)化網(wǎng)關(guān)功能與配置詳解

Profinet轉(zhuǎn)CANopen協(xié)議轉(zhuǎn)化網(wǎng)關(guān)

評論