一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

EtherCAT EOE移植及上手說(shuō)明

RT-Thread官方賬號(hào) ? 2024-09-12 08:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

01

EtherCAT介紹

1

EtherCAT狀態(tài)機(jī)制

ESM (EtherCAT state machine)是用來(lái)在啟動(dòng)或者工作時(shí)協(xié)調(diào)主站和從站關(guān)系用的,由應(yīng)用層控制器將從站應(yīng)用的狀態(tài)寫(xiě)入AL狀態(tài)寄存器,主站通過(guò)寫(xiě)AL控制寄存器進(jìn)行狀態(tài)請(qǐng)求。因此從邏輯上說(shuō),ESM位于EtherCAT從站控制器與應(yīng)用之間。

78dcef68-709b-11ef-bb4b-92fbcf53809c.png

如下所示,它包含 EtherCAT狀態(tài)轉(zhuǎn)換的過(guò)程。

運(yùn)行狀態(tài)

描述

Initial

初始化狀態(tài)

Pre-Operational

預(yù)運(yùn)行狀態(tài)

Safe-Operational

安全運(yùn)行狀態(tài)

Operational

運(yùn)行狀態(tài)

初始狀態(tài)(Init)

此時(shí)應(yīng)用層無(wú)通信,沒(méi)有郵箱通信也沒(méi)有過(guò)程數(shù)據(jù)通信

轉(zhuǎn)換到預(yù)工作狀態(tài)(Init to Pre-Op)

主站配置地址和SM,用于進(jìn)行郵箱通信;同時(shí)主站請(qǐng)求向Pre-Op模式轉(zhuǎn)換;接著從站檢查郵箱是否初始化正確

安全工作狀態(tài)(Safe-Op)

在這一階段,從站應(yīng)用程序?qū)鬏攲?shí)際輸入數(shù)據(jù),此時(shí)主站并不對(duì)從站輸出進(jìn)行操作,并將輸出模式設(shè)為安全狀態(tài)

轉(zhuǎn)換到工作狀態(tài)(Safe Op to Op)

這一階段主站開(kāi)始發(fā)送有效的輸出數(shù)據(jù),同時(shí)請(qǐng)求向工作模式轉(zhuǎn)換

工作狀態(tài)(Op)

此時(shí)主站的輸入和輸出均有效,可以進(jìn)行過(guò)程數(shù)據(jù)的通信

Bootstrap狀態(tài)

此外還有個(gè)Bootstrap狀態(tài),該狀態(tài)作為可選項(xiàng),一般是在固件更新時(shí)使用,該狀態(tài)只允許從初始狀態(tài)切換到該狀態(tài),在此狀態(tài)期間是沒(méi)有過(guò)程數(shù)據(jù)通信的,一般是用于FOE協(xié)議文件傳輸或固件升級(jí)的

下面是具體的一些狀態(tài)轉(zhuǎn)換,此處不再說(shuō)明

狀態(tài)轉(zhuǎn)換

描述

IP

啟動(dòng)郵箱通訊

PI

停止郵箱通訊

PS

啟動(dòng)輸入更新

SP

停止輸入更新

SO

啟動(dòng)輸出更新

OS

停止輸出更新

OP

停止輸入輸出更新

SI

停止輸入更新,停止郵箱通訊

OI

停止輸入輸出更新,停止郵箱通訊

IB

啟動(dòng)bootstrap模式

BI

重啟節(jié)點(diǎn)

2

EtherCAT尋址

EtherCAT通信是指主設(shè)備從EtherCAT從設(shè)備的內(nèi)部閃存讀取和寫(xiě)入數(shù)據(jù),通常來(lái)說(shuō)有兩種尋址方式來(lái)控制內(nèi)部的ESC寄存器:

1)設(shè)備尋址

在設(shè)備尋址時(shí),EtherCAT子報(bào)文頭內(nèi)的32位地址分為16位從站設(shè)備地址和16位從站設(shè)備內(nèi)部物理存儲(chǔ)空間地址。設(shè)備尋址時(shí),每個(gè)報(bào)文只尋址唯一的一個(gè)從站設(shè)備,但對(duì)于尋址機(jī)制又分為兩種:

順序?qū)ぶ罚菏褂庙樞驅(qū)ぶ窌r(shí),從站的地址由其在網(wǎng)段內(nèi)的連接位置確定,用一個(gè)負(fù)數(shù)來(lái)表示每個(gè)從站在網(wǎng)段內(nèi)由接線順序決定的位置。順序?qū)ぶ纷訄?bào)文在經(jīng)過(guò)每個(gè)從站設(shè)備時(shí),其順序地址加1,從站在接收?qǐng)?bào)文時(shí),順序地址位0的報(bào)文就是尋址到自己的報(bào)文,因此這種尋址機(jī)制也被稱為“自動(dòng)增量尋址”;

78e64a86-709b-11ef-bb4b-92fbcf53809c.png

例如:主站發(fā)起三個(gè)子報(bào)文分別去尋址三個(gè)從站,其中地址分別為0,-1,-2,如上圖中的數(shù)據(jù)幀1,數(shù)據(jù)幀在到達(dá)從站1時(shí),從站1檢查到子報(bào)文1中的地址為0,從而得知子報(bào)文1就是尋址到自己的報(bào)文,數(shù)據(jù)幀經(jīng)過(guò)從站1后,所有的順序地址都增加1,稱為1,0,-1,以此類推...

在設(shè)置尋址時(shí),從站的地址與其在網(wǎng)段內(nèi)的連接順序無(wú)關(guān),地址可以由主站在數(shù)據(jù)鏈路層啟動(dòng)階段配置EtherCAT ID給從站;也可以由從站在上電初始化時(shí)從自身的EEPROM內(nèi)部讀取EtherCAT ID進(jìn)而分配地址。

2)邏輯尋址

前面講的設(shè)備尋址一般來(lái)說(shuō)只針對(duì)某一從站進(jìn)行讀寫(xiě)操作,并且是在掃描階段去使用的,相對(duì)與邏輯尋址來(lái)說(shuō)并不常見(jiàn)。邏輯尋址面向過(guò)程數(shù)據(jù),可以實(shí)現(xiàn)多播,同一個(gè)子報(bào)文可以讀取多個(gè)從站設(shè)備。

在邏輯尋址時(shí),從站地址并不是單獨(dú)定義的,而是使用了尋址段內(nèi)4G邏輯地址空間中的一段區(qū)域,報(bào)文內(nèi)的32位地址作為整體的數(shù)據(jù)邏輯地址完成對(duì)設(shè)備的邏輯尋址。

而談到邏輯尋址,需要了解FMMU(現(xiàn)場(chǎng)總線內(nèi)存管理單元),邏輯尋址由FMMU實(shí)現(xiàn),在ESC(從站控制器),主要負(fù)責(zé)邏輯地址與物理地址的映射,用于將過(guò)程數(shù)據(jù)映射到主站,從而減輕主站的存儲(chǔ)器管理負(fù)擔(dān)。

當(dāng)從站設(shè)備收到一個(gè)數(shù)據(jù)邏輯尋址的EtherCAT子報(bào)文時(shí),會(huì)檢查是否由FMMU單元地址匹配,如果有的話,就會(huì)將輸入類型數(shù)據(jù)插入至EtherCAT子報(bào)文數(shù)據(jù)區(qū)的對(duì)應(yīng)位置。


3

EtherCAT從站同步模式

EtherCAT從站同步模式主要分為以下幾種:

(1)自由運(yùn)行模式(Free Run Mode)

在此模式下,從站設(shè)備獨(dú)立于主站運(yùn)行,內(nèi)部沒(méi)有同步到任何外部信號(hào)。設(shè)備的周期性操作由內(nèi)部時(shí)鐘定時(shí)器控制,通常用于非實(shí)時(shí)要求的應(yīng)用場(chǎng)景。

(2)分布式時(shí)鐘模式(Distributed Clocks,DC

分布式時(shí)鐘是 EtherCAT 的關(guān)鍵同步機(jī)制之一,廣泛用于需要高精度同步的場(chǎng)景。在 DC 模式下,所有 EtherCAT 從站通過(guò)一個(gè)參考時(shí)鐘(通常由主站或某個(gè)從站提供)實(shí)現(xiàn)時(shí)間同步。每個(gè)從站都會(huì)調(diào)整其內(nèi)部時(shí)鐘,使所有設(shè)備在微秒級(jí)別內(nèi)同步。此模式適用于需要精確協(xié)調(diào)多個(gè)設(shè)備動(dòng)作的應(yīng)用,例如運(yùn)動(dòng)控制。

(3)同步管理器事件模式(SyncManager Event Mode)

前面我們說(shuō)了,F(xiàn)MMU主要用于地址映射,尋找對(duì)應(yīng)的地址(尋址),那SyncManager就是用于交換數(shù)據(jù),將數(shù)據(jù)同步進(jìn)去。

在此模式下,從站設(shè)備通過(guò) SyncManager 同步數(shù)據(jù)傳輸。每當(dāng)主站寫(xiě)入或讀取 SyncManager 寄存器時(shí),從站的同步管理器事件會(huì)觸發(fā)中斷,從而引發(fā)應(yīng)用程序的執(zhí)行。這個(gè)模式下的同步精度不如 DC 模式高,通常用于不需要嚴(yán)格時(shí)間同步的應(yīng)用場(chǎng)合。

SyncManager主要有兩種模式:

1)郵箱(單緩存模式)

78ec901c-709b-11ef-bb4b-92fbcf53809c.png

使用單個(gè)緩存區(qū),通過(guò)握手的機(jī)制完成數(shù)據(jù)交換,一般情況下,一端在完成數(shù)據(jù)的讀寫(xiě)后,另一端才能訪問(wèn)該緩存區(qū),這樣可以保證數(shù)據(jù)不被丟失。

一般來(lái)說(shuō),數(shù)據(jù)發(fā)送方首先將數(shù)據(jù)寫(xiě)入緩存區(qū),此時(shí)緩存區(qū)被鎖定為只讀狀態(tài),一直等到數(shù)據(jù)接收方將數(shù)據(jù)讀走。

該模式通常使用在非周期性的數(shù)據(jù)交換,分配的緩存區(qū)也叫郵箱。

郵箱模式通常使用兩個(gè)SM通道,一般情況下主站到從站通信使用SM0,從站到主站通信使用SM1。

對(duì)于郵箱模式來(lái)說(shuō),分析其主從站的通信模式:

主站到從站的通信:主站必須檢查從站郵箱命令中的應(yīng)答工作計(jì)數(shù)器(Working counter),如果工作計(jì)數(shù)器沒(méi)有增加(通常是因?yàn)閺恼緵](méi)有完全讀取上一條命令),或者在規(guī)定時(shí)間期限內(nèi)沒(méi)有響應(yīng),主站必須重發(fā)該郵箱命令。

從站到主站到通信:主站必須確定從站是否用郵箱命令填滿了SM,并且盡快地發(fā)送適當(dāng)?shù)淖x命令

2)緩存

78fdb09a-709b-11ef-bb4b-92fbcf53809c.png

使用三個(gè)緩存區(qū),允許EtherCAT主站的控制權(quán)和從站控制器在做任何時(shí)候都訪問(wèn)數(shù)據(jù)交換緩存區(qū)。

接收數(shù)據(jù)的那一方隨時(shí)可以得到最新的數(shù)據(jù),數(shù)據(jù)發(fā)送那一方也可以隨時(shí)更新緩存區(qū)里的內(nèi)容。

假如寫(xiě)緩存區(qū)的速度比讀緩存區(qū)的速度快,則舊數(shù)據(jù)就會(huì)被覆蓋。


02

軟件開(kāi)發(fā)環(huán)境說(shuō)明

IAR 9.50.2

RZSC v2.0.0

Slave Stack Code (SSC) Tool Version 5.13

Beckhoff Automation TwinCAT3

03

安裝Patch軟件

下載 mingw-get-setup.exe 并根據(jù)提示安裝“Mingw-installation-manager”,若安裝完成,出現(xiàn)“Mingw-installation-manager”窗口,在左側(cè)窗口中選擇“Basic Setup”,在右側(cè)窗口中右鍵點(diǎn)擊“msys-base-bin”,選擇“Mark for Installation”。

79249426-709b-11ef-bb4b-92fbcf53809c.png

在左側(cè)窗口中選擇“All Packages”,在右側(cè)窗口中右鍵單擊“msys-patch-bin”,并選擇“標(biāo)記為安裝”。

7934b14e-709b-11ef-bb4b-92fbcf53809c.png

在上面的菜單欄中的安裝中選擇“Apply Changes”

79452254-709b-11ef-bb4b-92fbcf53809c.png

顯示“Schedule of Pending Actions”窗口,單擊“應(yīng)用”按鈕。

如果顯示“All changes were applied successfully; you may now clone this dialogue”,則表示安裝 patch.exe 成功。

將安裝的 patch.exe 的路徑注冊(cè)到系統(tǒng)環(huán)境變量中。注冊(cè)后,重新啟動(dòng)電腦。

795667d0-709b-11ef-bb4b-92fbcf53809c.png

啟動(dòng)命令提示符,輸入“where patch”。如果顯示了安裝的patch.exe的路徑,則沒(méi)有問(wèn)題。

7963db86-709b-11ef-bb4b-92fbcf53809c.png

04

EtherCAT EOE 從站代碼生成

從 renesas 官網(wǎng)下載 EtherCAT 示例包(https://www.renesas.cn/cn/zh/document/scd/rzt2m-group-ethercat-sample-program-package?r=1574901),解壓后打開(kāi) common\ecat_EoE_lwIP\SSCconfig 目錄下的 RZT2 EtherCAT EoE.esp 文件,點(diǎn)擊上方導(dǎo)航欄的 Project-> Create_new_Slaver_Files,依次配置 Source Folder(生成文件位置需向下延伸一級(jí)目錄 Src) 和 ESI File。

7979ffb0-709b-11ef-bb4b-92fbcf53809c.png

798d4520-709b-11ef-bb4b-92fbcf53809c.png

回到目錄 common\ecat_EoE_lwIP\Patch ,執(zhí)行腳本 apply_patch_ewarm_xSPI0.bat 將生成的從站代碼移動(dòng)到工程目錄下。


05

EOE Ethernet配置

首先使用FSP打開(kāi)工程下的 configuration.xml 文件,添加EtherCAT SSC Port Stack,并進(jìn)行配置:

79ac0140-709b-11ef-bb4b-92fbcf53809c.png

使能網(wǎng)卡類型、配置網(wǎng)卡設(shè)備參數(shù),這里我們添加兩個(gè)phy(phy0和phy1):

79cf1720-709b-11ef-bb4b-92fbcf53809c.png

ETHER_ETH配置

79d4cb34-709b-11ef-bb4b-92fbcf53809c.png

ETHER_ESC配置

79fba5c4-709b-11ef-bb4b-92fbcf53809c.png

ETHER_GMAC配置

7a005f38-709b-11ef-bb4b-92fbcf53809c.png

為ethercat_ssc_port添加cmt定時(shí)器并配置中斷優(yōu)先級(jí)

7a1d91e8-709b-11ef-bb4b-92fbcf53809c.png

添加Ethernet

7a2bd320-709b-11ef-bb4b-92fbcf53809c.png

ethernet中斷觸發(fā)回調(diào)設(shè)置為:vEtherISRCallback

7a364328-709b-11ef-bb4b-92fbcf53809c.png

到這里,F(xiàn)SP的配置就告一段落了。


06

EOE工程簡(jiǎn)述

移植后的RT-Thread EtherCAT EOE工程目錄層次如下所示:

7a5f0826-709b-11ef-bb4b-92fbcf53809c.png

其中EOE功能的主要部分位于 board/port/ethercat 目錄下,對(duì)于各個(gè)文件夾的解釋如下:

application:初始化并配置以太網(wǎng)接口及LWIP TCP/IP協(xié)議棧,同時(shí)實(shí)現(xiàn)一個(gè)lwip的TCP服務(wù)器;

beckhoff:EtherCAT協(xié)議棧從站代碼,由SSC生成;

module:設(shè)計(jì)了一套實(shí)例管理器模式,根據(jù)ethernet netif及l(fā)wip port返回的事件進(jìn)行階段性處理。

ether_netif:分別創(chuàng)建三個(gè)ethernet線程,負(fù)責(zé)以太網(wǎng)的讀(eth_reader)、寫(xiě)(eth_writer)及以太網(wǎng)事件監(jiān)測(cè)回調(diào)處理(eth_monitor);

lwip_port:創(chuàng)建兩個(gè)lwip port線程,一個(gè)負(fù)責(zé)接收以太網(wǎng)Link回調(diào)并將其廣播給netif,另外一個(gè)負(fù)責(zé)接收以太網(wǎng)回調(diào)并將參數(shù)映射到實(shí)例管理器管理的所有接口中;為lwip注冊(cè)網(wǎng)絡(luò)接口的同時(shí),處理Link事件及回調(diào)

renesas:主要包括EtherCAT數(shù)據(jù)幀的校驗(yàn)和處理,并根據(jù)AL狀態(tài)碼處理不同的運(yùn)行狀態(tài),此外還包括對(duì)輸入輸出數(shù)據(jù)的映射生成和處理等等。

此外在main線程中,會(huì)靜態(tài)初始化兩個(gè)線程:

main_thread:EtherCAT SSC端口及PHY初始化,EtherCAT從站初始化,運(yùn)行EtherCAT從站主循環(huán),處理主站的通信請(qǐng)求、更新AL狀態(tài)機(jī)等等。

ecat_thread:初始化并啟動(dòng)LWIP內(nèi)核

07

以太網(wǎng)PHY初始化配置

這部分的初始化配置在ecat_thread中,進(jìn)入RM_ETHERCAT_SSC_PORT_Open(), 這個(gè)EtherCAT 接口配置函數(shù)之后,可以看到EtherCAT Slave Controller 的一些初始化配置,其中就包括了PHY 的初始化:

7a746072-709b-11ef-bb4b-92fbcf53809c.png

7a9bf880-709b-11ef-bb4b-92fbcf53809c.png這里初始化的一個(gè)PHY 實(shí)例是:p_ether_phy_instance,它是一個(gè) ether_phy_instance_t 類型的變量,這個(gè)PHY 的實(shí)例是在調(diào)用RM_ETHERCAT_SSC_PORT_Open函數(shù)的時(shí)候形參傳遞進(jìn)來(lái)的,也就是 gp_ethercat_ssc_port。這種設(shè)計(jì)方式在下面的ether_netif及l(fā)wip port中的定義也有體現(xiàn)。

typedef struct st_ether_phy_instance
{
ether_phy_ctrl_t * p_ctrl; /// 指向PHY實(shí)例的控制結(jié)構(gòu)體
ether_phy_cfg_t const * p_cfg; /// 指向?qū)嵗渲玫慕Y(jié)構(gòu)體指針
ether_phy_api_t const * p_api; /// 配置過(guò)程中用到的API操作方式所組成的結(jié)構(gòu)體指針
} ether_phy_instance_t;

也就是說(shuō)其實(shí)此處其實(shí)打開(kāi)的是 g_ethercat_ssc_port0:

7ab74144-709b-11ef-bb4b-92fbcf53809c.png

7acbe7c0-709b-11ef-bb4b-92fbcf53809c.png可以看到 g_ethercat_ssc_port0_ctrl 指向的是 g_ethercat_ssc_port0 的控制結(jié)構(gòu)體指針:

const ethercat_ssc_port_instance_t g_ethercat_ssc_port0 =
{
.p_ctrl = &g_ethercat_ssc_port0_ctrl, // 指向g_ethercat_ssc_port0的控制結(jié)構(gòu)體指針
.p_cfg = &g_ethercat_ssc_port0_cfg, // 指向g_ethercat_ssc_port0的配置結(jié)構(gòu)體指針
.p_api = &g_ethercat_ssc_port_on_ethercat_ssc_port // 指向g_ethercat_ssc_port0配置方法的結(jié)構(gòu)指針
};

PHY 的驅(qū)動(dòng)是ethercat_ssc_port0 外設(shè)驅(qū)動(dòng)的子模塊,同樣我們來(lái)看下PHY的初始化:

7aee5ada-709b-11ef-bb4b-92fbcf53809c.png

通過(guò)調(diào)用 ether_phy_targets_initialize 根據(jù)配置的PHY型號(hào)執(zhí)行對(duì)應(yīng)的初始化配置:

7b0cade6-709b-11ef-bb4b-92fbcf53809c.png

08

LWIP協(xié)議棧初始化

1

tcpip_init()

lwip協(xié)議棧的初始化是通過(guò)um_lwip_port_core_open()函數(shù)去實(shí)現(xiàn)的,在該函數(shù)中會(huì)調(diào)用tcpip_init()函數(shù)進(jìn)行l(wèi)wip協(xié)議棧的初始化,主要會(huì)創(chuàng)建一個(gè)tcpip_mbox郵箱,用于接收底層或者上層傳遞過(guò)來(lái)的消息,此外還會(huì)創(chuàng)建一個(gè)tcpip_thread線程,所有需要處理的數(shù)據(jù)都會(huì)通過(guò)這個(gè)函數(shù)去處理。

7b4e9c24-709b-11ef-bb4b-92fbcf53809c.png

在tcpip_mbox郵箱中會(huì)接收來(lái)自tcpip_input的數(shù)據(jù)包,并由該郵箱將其傳遞給tcpip_thread線程進(jìn)行處理。


2

netifapi_netif_add()

netifapi_netif_add()由 lwip port open中的um_lwip_port_netif_open()函數(shù)調(diào)用,該函數(shù)主要功能為:將網(wǎng)絡(luò)接口添加到 lwIP 網(wǎng)絡(luò)堆棧的調(diào)用。

7b645514-709b-11ef-bb4b-92fbcf53809c.png

這里我們需要關(guān)注兩個(gè)回調(diào)函數(shù):

_netif_add_callback

tcpip_input

tcpip_input內(nèi)部具體調(diào)用的就是tcpip_inpkt(),調(diào)用該函數(shù)會(huì)將ethernet_input()函數(shù)作為結(jié)構(gòu)體的一部分傳遞給內(nèi)核,當(dāng)內(nèi)核接收到數(shù)據(jù)包時(shí)就會(huì)調(diào)用這個(gè)函數(shù)。

而在_netif_add_callback()函數(shù)中,我們關(guān)注三個(gè)接口函數(shù):

etharp_output

_link_output

_status_changed

第一個(gè) p_netif->output = etharp_output 是以太網(wǎng)接口的輸出回調(diào)函數(shù),用于處理IP數(shù)據(jù)包,主要負(fù)責(zé)將IP數(shù)據(jù)包通過(guò)以太網(wǎng)發(fā)送出去,并處理ARP協(xié)議以解析IP到MAC地址的映射關(guān)系。

第二個(gè) p_netif->linkoutput 是鏈路層的輸出回調(diào)函數(shù),該函數(shù)被用來(lái)實(shí)際發(fā)送以太網(wǎng)幀到網(wǎng)絡(luò)驅(qū)動(dòng)程序,etharp_output 等高層協(xié)議函數(shù)會(huì)處理好數(shù)據(jù)包內(nèi)容,最終調(diào)用 linkoutput 將數(shù)據(jù)幀發(fā)送到硬件。

第三個(gè)是當(dāng)網(wǎng)絡(luò)接口狀態(tài)發(fā)生變化時(shí)調(diào)用的回調(diào)函數(shù)。比如,網(wǎng)絡(luò)接口的鏈路狀態(tài)(link up/down)發(fā)生變化時(shí),lwIP就會(huì)調(diào)用這個(gè)回調(diào)函數(shù),如果說(shuō)netif已經(jīng)up并且IP地址被設(shè)置時(shí),他就會(huì)發(fā)送一個(gè)Event:LWIP_PORT_LAUNCHER_EVENT_IP_UP


09

網(wǎng)卡數(shù)據(jù)傳入LWIP內(nèi)核流程

當(dāng)eth接收完數(shù)據(jù)后會(huì)產(chǎn)生一個(gè)中斷,在中斷中會(huì)釋放一個(gè)信號(hào)量

7b6b28b2-709b-11ef-bb4b-92fbcf53809c.png

此時(shí)在ether_reader線程中收到此信號(hào)量,會(huì)從以太網(wǎng)驅(qū)動(dòng)緩沖區(qū)中讀取接收到的以太網(wǎng)幀,并通過(guò)um_ether_netif_callback_request執(zhí)行回調(diào)p_func

7b98e612-709b-11ef-bb4b-92fbcf53809c.png

此時(shí)event為ETHER_NETIF_CALLBACK_EVENT_RECEIVE_ETHER_FRAME,執(zhí)行 um_lwip_port_thread_receiver_request();

7b9dcaf6-709b-11ef-bb4b-92fbcf53809c.png

此時(shí)lwip_recv線程收到該Frame,執(zhí)行_netif_frame_input(p_callback),在此函數(shù)中通過(guò)um_lwip_port_netif_input()將以太網(wǎng)幀傳入到lwip netif中;

緊接著調(diào)用tcpip_input回調(diào),將封裝的消息傳遞給tcpip_mbox郵箱中,同時(shí)由tcpip_thread對(duì)該消息進(jìn)行解析。


10

EOE從站接收以太網(wǎng)數(shù)據(jù)幀流程(使用ping指令)

1

初始化前提

首先系統(tǒng)需要以此完成兩部分初始化:

ethernet網(wǎng)絡(luò)接口初始化

ether_monitor Thread: 檢查netif link狀態(tài),同時(shí)將收到的狀態(tài)發(fā)送給回調(diào)更新event

ether_reader Thread: 接收來(lái)自ethernet的通知并接收數(shù)據(jù)幀,由ethernet中斷觸發(fā)

ether_writer Thread: 接收來(lái)自消息隊(duì)列的數(shù)據(jù)幀

tcp/ip網(wǎng)絡(luò)協(xié)議棧初始化

LWIP_PORT_LAUNCHER_EVENT_LINK_UP -> _netif_link_on

LWIP_PORT_LAUNCHER_EVENT_LINK_DOWN -> _netif_link_off

LWIP_PORT_LAUNCHER_EVENT_IP_UP -> um_lwip_port_netif_set_netif_state(LWIP_PORT_NETIF_STATE_UP);

LWIP_PORT_LAUNCHER_EVENT_IP_DOWN -> um_lwip_port_netif_set_netif_state(LWIP_PORT_NETIF_STATE_DOWN);

lwip_launch Thread: 接收來(lái)自ethernet link回調(diào)的通知,以此判斷請(qǐng)求的event

lwip_recv Thread: 接收來(lái)自ether link回調(diào)的通知,并廣播給netif

在此期間以此通過(guò)幾個(gè)Event來(lái)完成網(wǎng)絡(luò)的初始化

ETHER_NETIF_CALLBACK_EVENT_LINK_DOWN:此時(shí)的所有網(wǎng)絡(luò)端口處于初始狀態(tài),還未初始化

ETHER_NETIF_CALLBACK_EVENT_LINK_UP:存在端口link up,執(zhí)行um_lwip_port_task_launcher_request,將event狀態(tài)設(shè)置為L(zhǎng)WIP_PORT_LAUNCHER_EVENT_LINK_UP

LWIP_PORT_LAUNCHER_EVENT_LINK_UP:netif鏈路link up,執(zhí)行 netif_link_on ,并設(shè)置 network interface up(um_lwip_port_netif_set_up),最終執(zhí)行到status_changed,并執(zhí)行 um_lwip_port_task_launcher_request 修改 event 為 LWIP_PORT_LAUNCHER_EVENT_IP_UP

LWIP_PORT_LAUNCHER_EVENT_IP_UP:IP is up,執(zhí)行um_lwip_port_netif_set_netif_state設(shè)置netif狀態(tài)并設(shè)置通知回調(diào),將event修改為L(zhǎng)WIP_PORT_CALLBACK_EVENT_NETIF_UP

LWIP_PORT_CALLBACK_EVENT_NETIF_UP:network interface link up,檢查IP地址是否有效,并創(chuàng)建sock監(jiān)聽(tīng)

只有當(dāng)這么幾個(gè)Event依次觸發(fā),才能完成對(duì)EtherCAT從站網(wǎng)絡(luò)的初始化,主從站之間才能正常收發(fā)數(shù)據(jù):

7bab8024-709b-11ef-bb4b-92fbcf53809c.png

2

ICMP簡(jiǎn)要介紹

ICMP一般被認(rèn)為是IP協(xié)議層的一部分,但在結(jié)構(gòu)上位于IP協(xié)議層之上。主要用于確認(rèn)網(wǎng)絡(luò)狀態(tài)或者鏈路不同等場(chǎng)景,當(dāng)數(shù)據(jù)報(bào)文無(wú)法正常到達(dá)目標(biāo)主機(jī)時(shí),ICMP就會(huì)返回一個(gè)差錯(cuò)報(bào)文,讓源主機(jī)知道數(shù)據(jù)到達(dá)情況,常見(jiàn)的ping命令就是屬于ICMP 查詢報(bào)文功能的一部分,當(dāng)ping成功,也就代表網(wǎng)卡、IP層、ICMP層都能正常通信,也可以證明LWIP移植成功。

下面是使用Wireshark抓包抓取回顯應(yīng)答報(bào)文的示例:

7bb42ac6-709b-11ef-bb4b-92fbcf53809c.png

3

ARP簡(jiǎn)要介紹

ARP:地址解析協(xié)議,主要是通過(guò)解析IP地址得到數(shù)據(jù)鏈路層的MAC地址(網(wǎng)卡標(biāo)識(shí)符),在以太網(wǎng)中,一個(gè)主機(jī)想要與另一個(gè)主機(jī)直接通信,必須知道目標(biāo)主機(jī)的MAC地址,這時(shí)候就需要ARP進(jìn)行地址解析。

ARP緩存表:在每臺(tái)主機(jī)的內(nèi)存中都有一個(gè)ARP緩存表,記錄了IP地址到MAC地址的映射關(guān)系,通過(guò)arp -a可獲取信息

7bc743a4-709b-11ef-bb4b-92fbcf53809c.png

其主要的運(yùn)作流程是:

1.如果主機(jī)A想要發(fā)送數(shù)據(jù)給主機(jī)B,那么主機(jī)A會(huì)先檢查自己的ARP緩存中是否有主機(jī)B的IP地址及MAC地址的映射,如果有的話才會(huì)將主機(jī)B的MAC地址作為源地址封裝到數(shù)據(jù)幀中;如果沒(méi)有,那主機(jī)A就會(huì)向局域網(wǎng)中廣播ARP請(qǐng)求(包括發(fā)送方的IP地址、MAC地址,接收方的IP地址),每臺(tái)其他主機(jī)在收到ARP請(qǐng)求后都會(huì)檢查自己的IP地址是否與ARP請(qǐng)求中接收方的IP地址相同,如不相同,就會(huì)丟棄ARP請(qǐng)求包。

2.當(dāng)交換機(jī)接收到此數(shù)據(jù)幀后,發(fā)現(xiàn)此數(shù)據(jù)幀為廣播幀,因此會(huì)將此數(shù)據(jù)幀從非接收的所有接口中發(fā)送出去。

3.當(dāng)主機(jī)B接收到此數(shù)據(jù)幀后,會(huì)核對(duì)IP地址是否是自己的,并將主機(jī)A的IP地址和MAC地址的對(duì)應(yīng)關(guān)系記錄到自己的ARP緩存表中,同時(shí)發(fā)送一個(gè)ARP響應(yīng),其中就包括自己的MAC地址。

4.當(dāng)主機(jī)A接收到這個(gè)主機(jī)B回應(yīng)的數(shù)據(jù)幀后,就會(huì)在自己的ARP緩存表中記錄主機(jī)B的IP地址和MAC映射關(guān)系。

具體流程可見(jiàn)下圖:

7bdb8c56-709b-11ef-bb4b-92fbcf53809c.png

下面這個(gè)是EtherCAT EOE工程測(cè)試ping命令時(shí)ARP緩存表的變化情況

7bf6b2c4-709b-11ef-bb4b-92fbcf53809c.png

那這里L(fēng)WIP是怎么處理ARP請(qǐng)求并且獲取到從站的IP及MAC地址的呢,我們接著往下看

4

ARP接收數(shù)據(jù)包流程

先來(lái)了解兩個(gè)API:

LWIP從網(wǎng)卡中接收數(shù)據(jù)包的函數(shù)是:ethernet_input()

ARP數(shù)據(jù)包的處理函數(shù)是:etharp_input(),其主要內(nèi)容為:

(1)檢查ARP報(bào)文。

(2)ARP請(qǐng)求報(bào)文:如果是請(qǐng)求報(bào)文的目標(biāo)IP和本地的匹配,就組裝ARP響應(yīng)報(bào)文并發(fā)送出去。

(3)ARP響應(yīng)報(bào)文:

1)更新ARP緩存表。

2)把阻塞在arp entry緩存隊(duì)列的IP數(shù)據(jù)報(bào)發(fā)送出去。

3)釋放pbuf。因?yàn)锳RP報(bào)文到此已經(jīng)處理完畢。

對(duì)于ARP處理數(shù)據(jù)包來(lái)說(shuō),有這么兩種情況:

(1)收到APR應(yīng)答包:此時(shí)說(shuō)明之前發(fā)送的APR請(qǐng)求包得到了回應(yīng),那么就根據(jù)應(yīng)答包去更新自身的ARP緩存表;

(2)收到ARP請(qǐng)求包:首先會(huì)判斷包中的目標(biāo)是否與主機(jī)IP匹配,匹配上的話就記錄下源主機(jī)的IP及MAC地址,接著在更新自身的ARP表外,還要向源主機(jī)發(fā)送一個(gè)ARP應(yīng)答包;如果說(shuō)包中的目標(biāo)IP與主機(jī)IP并不匹配,那么根據(jù)ARP表的空余情況選擇記錄源主機(jī)的IP及MAC地址(如果沒(méi)有空余的表項(xiàng),則不會(huì)記錄),并丟棄該請(qǐng)求包。

7c09fd20-709b-11ef-bb4b-92fbcf53809c.png

這里對(duì)應(yīng)我們EtherCAT EOE工程來(lái)說(shuō),ethernet調(diào)用流程為:

ethernet_input(收到ARP數(shù)據(jù)包) ->etharp_input()-> etharp_raw(發(fā)送應(yīng)答包) ->ethernet_output()-> _link_output -> um_lwip_port_ether_netif_send -> UM_ETHER_NETIF_Send()

5

ARP發(fā)送數(shù)據(jù)包流程

前面我們了解了一個(gè)數(shù)據(jù)包的接收流程,如果收到的是ARP數(shù)據(jù)包,那么就會(huì)交給ARP處理,如果是IP數(shù)據(jù)包就會(huì)調(diào)用ip4_input()函數(shù)將其傳遞給上層.

arp通過(guò) etharp_output() 函數(shù)接收到IP數(shù)據(jù)包后,判斷該數(shù)據(jù)包是單播,多播還是廣播,對(duì)于其處理方式:

對(duì)于多播或者廣播數(shù)據(jù)包,直接交給網(wǎng)卡處理(調(diào)用ethernet_output)

對(duì)于單播,arp需要根據(jù)IP找到對(duì)應(yīng)的MAC地址,如果找不到MAC地址,還要延遲發(fā)送數(shù)據(jù)包。ARP首先會(huì)創(chuàng)建一個(gè)ARP表項(xiàng),再將數(shù)據(jù)包掛載到ARP表項(xiàng)上對(duì)應(yīng)的緩存隊(duì)列上,同時(shí)會(huì)發(fā)出一個(gè)ARP請(qǐng)求包,等待目標(biāo)主機(jī)的回應(yīng)后再發(fā)送IP數(shù)據(jù)包

7c247574-709b-11ef-bb4b-92fbcf53809c.png

那么對(duì)應(yīng)netif->linkoutput()其實(shí)就是在初始化lwip網(wǎng)卡接口設(shè)備時(shí)綁定的 _link_output()

7c3a44da-709b-11ef-bb4b-92fbcf53809c.png

11

EtherCAT EOE測(cè)試

編譯并啟動(dòng)下載調(diào)試,終端出現(xiàn)RT-Thread LOGO即為啟動(dòng)成功

7c60c92a-709b-11ef-bb4b-92fbcf53809c.png

瑞薩EtherCAT EOE例程下的ESI文件(RZT2M_EtherCAT_RSK_rev0200\common\ecat_EoE_lwIP\ESI\Renesas EtherCAT RZT2 EoE.xml)復(fù)制到TwinCAT安裝目錄下(C:\TwinCAT\3.1\Config\Io\EtherCAT)

啟動(dòng)TwinCAT,并燒入EEPROM的EOE固件


使用ping命令測(cè)試EOE協(xié)議是否運(yùn)行成功


使用TCPIP測(cè)試工具測(cè)試TCP通信回顯功能


12

其他說(shuō)明:三網(wǎng)口使用配置說(shuō)明

打開(kāi)RZSC,配置ethercat_ssc_port的phy2

7c723f16-709b-11ef-bb4b-92fbcf53809c.png

設(shè)置第三個(gè)網(wǎng)口的PHY

7c98a110-709b-11ef-bb4b-92fbcf53809c.png

設(shè)置ETHER_ETH2

7cbaeaf4-709b-11ef-bb4b-92fbcf53809c.png

設(shè)置ETHER_ESC的phy2配置,修改ESC_LINKACT2為P21_0,ESC_PHYLINK2為P00_5

7cbf0bf2-709b-11ef-bb4b-92fbcf53809c.png

生成RZSC源碼,回到IAR工程重新編譯下載

EEPROM固件更新

7ce3071e-709b-11ef-bb4b-92fbcf53809c.png

此時(shí)T2M的三個(gè)網(wǎng)口都可以進(jìn)行EtherCAT EOE通信,具體測(cè)試方法參考如上


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124524
  • ESM
    ESM
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    9197
  • ethercat
    +關(guān)注

    關(guān)注

    19

    文章

    1124

    瀏覽量

    40042
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    瑞米派實(shí)時(shí)系統(tǒng)與EtherCAT移植-米爾Remi Pi

    136us表3-1.數(shù)據(jù)信息 4.EtherCAT IGH移植4.1. 下載EtherCAT IGH源碼到官網(wǎng)下載1.5版本的EtherCAT源碼,如圖4-1:https://git
    發(fā)表于 04-30 18:14

    【米爾-瑞米派兼容樹(shù)莓派擴(kuò)展模塊-試用體驗(yàn)】EtherCAT移植

    output.tar.bz2 output.tar.bz2 至此IGH交叉編譯完成,下面是在對(duì)應(yīng)arm目標(biāo)板上的操作。 4.5. 移植EtherCAT相關(guān)庫(kù)到開(kāi)發(fā)板 將上面制作好的output.tar.bz2
    發(fā)表于 06-19 17:07

    【分享】工業(yè)級(jí)開(kāi)發(fā)板IMX6Q移植ethercat通訊協(xié)議

    (點(diǎn)此了解板載資源),Linux-4.1.4+Ubuntu16.04系統(tǒng),以下具體說(shuō)明ethercat移植:1.解壓IGH源碼進(jìn)入目錄#tar xjf
    發(fā)表于 06-25 09:15

    EtherCAT的原理是什么?EtherCAT有哪些應(yīng)用實(shí)例?

    EtherCAT的原理是什么?EtherCAT有哪些功能?怎樣去實(shí)現(xiàn)EtherCAT的應(yīng)用層?EtherCAT有哪些應(yīng)用實(shí)例?
    發(fā)表于 07-02 06:52

    DIY一個(gè)EtherCAT控制器

    3.1 RT-Thread 下載本次移植基于最新發(fā)布的release4.1.0, 這個(gè)可以到github下載,最近Gitee也更新了。移植EtherCAT之前,首先把Nuvoton的BSP跑起來(lái)。這個(gè)
    發(fā)表于 06-09 11:12

    EtherCAT從站開(kāi)發(fā)板及源程序說(shuō)明

    EtherCAT從站開(kāi)發(fā)板及源程序說(shuō)明:簡(jiǎn)化XML生成,簡(jiǎn)化編程,10分鐘快速入門(mén)
    發(fā)表于 02-18 12:03

    【沁恒 CH32V208 開(kāi)發(fā)板免費(fèi)試用】2.EtherCat主站移植前準(zhǔn)備(一)

    本次EtherCat主站移植是基于SOEM源碼進(jìn)行移植,收集并整理部分資料作為學(xué)習(xí)EtherCat通訊參考內(nèi)容。一 、T EtherCAT
    發(fā)表于 04-17 10:29

    【沁恒 CH32V208 開(kāi)發(fā)板免費(fèi)試用】7.EtherCat開(kāi)始移植(一)

    首先本次移植以TcpClint作為模板進(jìn)行移植。 先準(zhǔn)備ethercat的基于SOEM的移植庫(kù)文件 總共22個(gè)文件 把這些文件加入到工程后,根據(jù)不同的錯(cuò)誤對(duì)其進(jìn)行調(diào)整,使得整個(gè)工程
    發(fā)表于 04-22 17:37

    工業(yè)通訊中CANOPEN轉(zhuǎn)EtherCAT的轉(zhuǎn)換

    EtherCAT主PLC/控制器。 從CANopen移植EtherCAT的優(yōu)缺點(diǎn)包括: 優(yōu)點(diǎn): 適合軸間高度耦合的集中式控制; 更長(zhǎng)的通信距離(100m); 標(biāo)準(zhǔn)以太網(wǎng)接口,無(wú)需CAN卡。 缺點(diǎn): 增加了
    發(fā)表于 12-12 11:31

    lwip移植說(shuō)明及心得

    lwip是一套用于嵌入式系統(tǒng)的開(kāi)放源代碼TCP/IP協(xié)議棧。Lwip既可以移植到操作系統(tǒng)上,又可以在無(wú)操作系統(tǒng)的情況下獨(dú)立運(yùn)行。下面我們來(lái)看看lwip移植說(shuō)明及心得。
    發(fā)表于 12-11 16:06 ?2.1w次閱讀
    lwip<b class='flag-5'>移植</b><b class='flag-5'>說(shuō)明</b>及心得

    Boa服務(wù)器的移植說(shuō)明分析

    Boa服務(wù)器的移植,內(nèi)含說(shuō)明文檔,原理分析和源碼
    發(fā)表于 01-18 14:13 ?0次下載

    KPA EtherCAT主站軟件如何做移植測(cè)試

    虹科KPA EtherCAT主站是一款協(xié)議棧產(chǎn)品,能夠使用戶快速利用EtherCAT技術(shù)的所有好處,例如實(shí)時(shí)操作、極短的循環(huán)時(shí)間、以及最低成本的最高性能。該協(xié)議棧的先進(jìn)架構(gòu)專注于可移植
    的頭像 發(fā)表于 05-18 15:54 ?4485次閱讀

    EtherCAT FP介紹系列文章—EoE

    EoE(Ethernet over EtherCAT)是允許在EtherCAT網(wǎng)絡(luò)中傳輸標(biāo)準(zhǔn)以太網(wǎng)數(shù)據(jù)使用標(biāo)準(zhǔn)以太網(wǎng)設(shè)備,如打印機(jī)、相機(jī)或PC的技術(shù)。EoE從第三方設(shè)備傳輸?shù)?/div>
    的頭像 發(fā)表于 06-16 14:48 ?1934次閱讀
    <b class='flag-5'>EtherCAT</b> FP介紹系列文章—<b class='flag-5'>EoE</b>

    Ubuntu系統(tǒng)快速上手

    Ubuntu系統(tǒng)快速上手概述和操作說(shuō)明
    的頭像 發(fā)表于 04-12 16:25 ?941次閱讀
    Ubuntu系統(tǒng)快速<b class='flag-5'>上手</b>

    CC2500和CC1101移植說(shuō)明

    主要通過(guò)如何移植、移植注意、關(guān)于芯片配置、如何生成導(dǎo)出配置四大步驟來(lái)說(shuō)明CC2500和CC1101移植
    的頭像 發(fā)表于 06-15 14:32 ?1133次閱讀
    CC2500和CC1101<b class='flag-5'>移植</b><b class='flag-5'>說(shuō)明</b>