01
EtherCAT介紹
1
EtherCAT狀態(tài)機制
ESM (EtherCAT state machine)是用來在啟動或者工作時協(xié)調(diào)主站和從站關(guān)系用的,由應用層控制器將從站應用的狀態(tài)寫入AL狀態(tài)寄存器,主站通過寫AL控制寄存器進行狀態(tài)請求。因此從邏輯上說,ESM位于EtherCAT從站控制器與應用之間。
如下所示,它包含 EtherCAT狀態(tài)轉(zhuǎn)換的過程。
運行狀態(tài) | 描述 |
Initial | 初始化狀態(tài) |
Pre-Operational | 預運行狀態(tài) |
Safe-Operational | 安全運行狀態(tài) |
Operational | 運行狀態(tài) |
初始狀態(tài)(Init)
此時應用層無通信,沒有郵箱通信也沒有過程數(shù)據(jù)通信
轉(zhuǎn)換到預工作狀態(tài)(Init to Pre-Op)
主站配置地址和SM,用于進行郵箱通信;同時主站請求向Pre-Op模式轉(zhuǎn)換;接著從站檢查郵箱是否初始化正確
安全工作狀態(tài)(Safe-Op)
在這一階段,從站應用程序?qū)鬏攲嶋H輸入數(shù)據(jù),此時主站并不對從站輸出進行操作,并將輸出模式設(shè)為安全狀態(tài)
轉(zhuǎn)換到工作狀態(tài)(Safe Op to Op)
這一階段主站開始發(fā)送有效的輸出數(shù)據(jù),同時請求向工作模式轉(zhuǎn)換
工作狀態(tài)(Op)
此時主站的輸入和輸出均有效,可以進行過程數(shù)據(jù)的通信
Bootstrap狀態(tài)
此外還有個Bootstrap狀態(tài),該狀態(tài)作為可選項,一般是在固件更新時使用,該狀態(tài)只允許從初始狀態(tài)切換到該狀態(tài),在此狀態(tài)期間是沒有過程數(shù)據(jù)通信的,一般是用于FOE協(xié)議文件傳輸或固件升級的
下面是具體的一些狀態(tài)轉(zhuǎn)換,此處不再說明
狀態(tài)轉(zhuǎn)換 | 描述 |
IP | 啟動郵箱通訊 |
停止郵箱通訊 | |
PS | 啟動輸入更新 |
SP | 停止輸入更新 |
SO | 啟動輸出更新 |
OS | 停止輸出更新 |
OP | 停止輸入輸出更新 |
SI | 停止輸入更新,停止郵箱通訊 |
OI | 停止輸入輸出更新,停止郵箱通訊 |
IB | 啟動bootstrap模式 |
BI | 重啟節(jié)點 |
2
EtherCAT尋址
EtherCAT通信是指主設(shè)備從EtherCAT從設(shè)備的內(nèi)部閃存讀取和寫入數(shù)據(jù),通常來說有兩種尋址方式來控制內(nèi)部的ESC寄存器:
1)設(shè)備尋址
在設(shè)備尋址時,EtherCAT子報文頭內(nèi)的32位地址分為16位從站設(shè)備地址和16位從站設(shè)備內(nèi)部物理存儲空間地址。設(shè)備尋址時,每個報文只尋址唯一的一個從站設(shè)備,但對于尋址機制又分為兩種:
順序?qū)ぶ罚菏褂庙樞驅(qū)ぶ窌r,從站的地址由其在網(wǎng)段內(nèi)的連接位置確定,用一個負數(shù)來表示每個從站在網(wǎng)段內(nèi)由接線順序決定的位置。順序?qū)ぶ纷訄笪脑诮?jīng)過每個從站設(shè)備時,其順序地址加1,從站在接收報文時,順序地址位0的報文就是尋址到自己的報文,因此這種尋址機制也被稱為“自動增量尋址”;
例如:主站發(fā)起三個子報文分別去尋址三個從站,其中地址分別為0,-1,-2,如上圖中的數(shù)據(jù)幀1,數(shù)據(jù)幀在到達從站1時,從站1檢查到子報文1中的地址為0,從而得知子報文1就是尋址到自己的報文,數(shù)據(jù)幀經(jīng)過從站1后,所有的順序地址都增加1,稱為1,0,-1,以此類推...
在設(shè)置尋址時,從站的地址與其在網(wǎng)段內(nèi)的連接順序無關(guān),地址可以由主站在數(shù)據(jù)鏈路層啟動階段配置EtherCAT ID給從站;也可以由從站在上電初始化時從自身的EEPROM內(nèi)部讀取EtherCAT ID進而分配地址。
2)邏輯尋址
前面講的設(shè)備尋址一般來說只針對某一從站進行讀寫操作,并且是在掃描階段去使用的,相對與邏輯尋址來說并不常見。邏輯尋址面向過程數(shù)據(jù),可以實現(xiàn)多播,同一個子報文可以讀取多個從站設(shè)備。
在邏輯尋址時,從站地址并不是單獨定義的,而是使用了尋址段內(nèi)4G邏輯地址空間中的一段區(qū)域,報文內(nèi)的32位地址作為整體的數(shù)據(jù)邏輯地址完成對設(shè)備的邏輯尋址。
而談到邏輯尋址,需要了解FMMU(現(xiàn)場總線內(nèi)存管理單元),邏輯尋址由FMMU實現(xiàn),在ESC(從站控制器),主要負責邏輯地址與物理地址的映射,用于將過程數(shù)據(jù)映射到主站,從而減輕主站的存儲器管理負擔。
當從站設(shè)備收到一個數(shù)據(jù)邏輯尋址的EtherCAT子報文時,會檢查是否由FMMU單元地址匹配,如果有的話,就會將輸入類型數(shù)據(jù)插入至EtherCAT子報文數(shù)據(jù)區(qū)的對應位置。
3
EtherCAT從站同步模式
EtherCAT從站同步模式主要分為以下幾種:
(1)自由運行模式(Free Run Mode)
在此模式下,從站設(shè)備獨立于主站運行,內(nèi)部沒有同步到任何外部信號。設(shè)備的周期性操作由內(nèi)部時鐘或定時器控制,通常用于非實時要求的應用場景。
(2)分布式時鐘模式(Distributed Clocks,DC)
分布式時鐘是 EtherCAT 的關(guān)鍵同步機制之一,廣泛用于需要高精度同步的場景。在 DC 模式下,所有 EtherCAT 從站通過一個參考時鐘(通常由主站或某個從站提供)實現(xiàn)時間同步。每個從站都會調(diào)整其內(nèi)部時鐘,使所有設(shè)備在微秒級別內(nèi)同步。此模式適用于需要精確協(xié)調(diào)多個設(shè)備動作的應用,例如運動控制。
(3)同步管理器事件模式(SyncManager Event Mode)
前面我們說了,F(xiàn)MMU主要用于地址映射,尋找對應的地址(尋址),那SyncManager就是用于交換數(shù)據(jù),將數(shù)據(jù)同步進去。
在此模式下,從站設(shè)備通過 SyncManager 同步數(shù)據(jù)傳輸。每當主站寫入或讀取 SyncManager 寄存器時,從站的同步管理器事件會觸發(fā)中斷,從而引發(fā)應用程序的執(zhí)行。這個模式下的同步精度不如 DC 模式高,通常用于不需要嚴格時間同步的應用場合。
SyncManager主要有兩種模式:
1)郵箱(單緩存模式)
使用單個緩存區(qū),通過握手的機制完成數(shù)據(jù)交換,一般情況下,一端在完成數(shù)據(jù)的讀寫后,另一端才能訪問該緩存區(qū),這樣可以保證數(shù)據(jù)不被丟失。
一般來說,數(shù)據(jù)發(fā)送方首先將數(shù)據(jù)寫入緩存區(qū),此時緩存區(qū)被鎖定為只讀狀態(tài),一直等到數(shù)據(jù)接收方將數(shù)據(jù)讀走。
該模式通常使用在非周期性的數(shù)據(jù)交換,分配的緩存區(qū)也叫郵箱。
郵箱模式通常使用兩個SM通道,一般情況下主站到從站通信使用SM0,從站到主站通信使用SM1。
對于郵箱模式來說,分析其主從站的通信模式:
主站到從站的通信:主站必須檢查從站郵箱命令中的應答工作計數(shù)器(Working counter),如果工作計數(shù)器沒有增加(通常是因為從站沒有完全讀取上一條命令),或者在規(guī)定時間期限內(nèi)沒有響應,主站必須重發(fā)該郵箱命令。
從站到主站到通信:主站必須確定從站是否用郵箱命令填滿了SM,并且盡快地發(fā)送適當?shù)淖x命令
2)緩存
使用三個緩存區(qū),允許EtherCAT主站的控制權(quán)和從站控制器在做任何時候都訪問數(shù)據(jù)交換緩存區(qū)。
接收數(shù)據(jù)的那一方隨時可以得到最新的數(shù)據(jù),數(shù)據(jù)發(fā)送那一方也可以隨時更新緩存區(qū)里的內(nèi)容。
假如寫緩存區(qū)的速度比讀緩存區(qū)的速度快,則舊數(shù)據(jù)就會被覆蓋。
02
軟件開發(fā)環(huán)境說明
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è)窗口中右鍵點擊“msys-base-bin”,選擇“Mark for Installation”。
在左側(cè)窗口中選擇“All Packages”,在右側(cè)窗口中右鍵單擊“msys-patch-bin”,并選擇“標記為安裝”。
在上面的菜單欄中的安裝中選擇“Apply Changes”
顯示“Schedule of Pending Actions”窗口,單擊“應用”按鈕。
如果顯示“All changes were applied successfully; you may now clone this dialogue”,則表示安裝 patch.exe 成功。
將安裝的 patch.exe 的路徑注冊到系統(tǒng)環(huán)境變量中。注冊后,重新啟動電腦。
啟動命令提示符,輸入“where patch”。如果顯示了安裝的patch.exe的路徑,則沒有問題。
04
EtherCAT EOE 從站代碼生成
從 renesas 官網(wǎng)下載 EtherCAT 示例包(https://www.renesas.cn/cn/zh/document/scd/rzt2m-group-ethercat-sample-program-package?r=1574901),解壓后打開 common\ecat_EoE_lwIP\SSCconfig 目錄下的 RZT2 EtherCAT EoE.esp 文件,點擊上方導航欄的 Project-> Create_new_Slaver_Files,依次配置 Source Folder(生成文件位置需向下延伸一級目錄 Src) 和 ESI File。
回到目錄 common\ecat_EoE_lwIP\Patch ,執(zhí)行腳本 apply_patch_ewarm_xSPI0.bat 將生成的從站代碼移動到工程目錄下。
05
EOE Ethernet配置
首先使用FSP打開工程下的 configuration.xml 文件,添加EtherCAT SSC Port Stack,并進行配置:
使能網(wǎng)卡類型、配置網(wǎng)卡設(shè)備參數(shù),這里我們添加兩個phy(phy0和phy1):
ETHER_ETH配置
ETHER_ESC配置
ETHER_GMAC配置
為ethercat_ssc_port添加cmt定時器并配置中斷優(yōu)先級
添加Ethernet
ethernet中斷觸發(fā)回調(diào)設(shè)置為:vEtherISRCallback
到這里,F(xiàn)SP的配置就告一段落了。
06
EOE工程簡述
移植后的RT-Thread EtherCAT EOE工程目錄層次如下所示:
其中EOE功能的主要部分位于 board/port/ethercat 目錄下,對于各個文件夾的解釋如下:
application:初始化并配置以太網(wǎng)接口及LWIP TCP/IP協(xié)議棧,同時實現(xiàn)一個lwip的TCP服務(wù)器;
beckhoff:EtherCAT協(xié)議棧從站代碼,由SSC生成;
module:設(shè)計了一套實例管理器模式,根據(jù)ethernet netif及l(fā)wip port返回的事件進行階段性處理。
ether_netif:分別創(chuàng)建三個ethernet線程,負責以太網(wǎng)的讀(eth_reader)、寫(eth_writer)及以太網(wǎng)事件監(jiān)測回調(diào)處理(eth_monitor);
lwip_port:創(chuàng)建兩個lwip port線程,一個負責接收以太網(wǎng)Link回調(diào)并將其廣播給netif,另外一個負責接收以太網(wǎng)回調(diào)并將參數(shù)映射到實例管理器管理的所有接口中;為lwip注冊網(wǎng)絡(luò)接口的同時,處理Link事件及回調(diào)
renesas:主要包括EtherCAT數(shù)據(jù)幀的校驗和處理,并根據(jù)AL狀態(tài)碼處理不同的運行狀態(tài),此外還包括對輸入輸出數(shù)據(jù)的映射生成和處理等等。
此外在main線程中,會靜態(tài)初始化兩個線程:
main_thread:EtherCAT SSC端口及PHY初始化,EtherCAT從站初始化,運行EtherCAT從站主循環(huán),處理主站的通信請求、更新AL狀態(tài)機等等。
ecat_thread:初始化并啟動LWIP內(nèi)核
07
以太網(wǎng)PHY初始化配置
這部分的初始化配置在ecat_thread中,進入RM_ETHERCAT_SSC_PORT_Open(), 這個EtherCAT 接口配置函數(shù)之后,可以看到EtherCAT Slave Controller 的一些初始化配置,其中就包括了PHY 的初始化:
這里初始化的一個PHY 實例是:p_ether_phy_instance,它是一個 ether_phy_instance_t 類型的變量,這個PHY 的實例是在調(diào)用RM_ETHERCAT_SSC_PORT_Open函數(shù)的時候形參傳遞進來的,也就是 gp_ethercat_ssc_port。這種設(shè)計方式在下面的ether_netif及l(fā)wip port中的定義也有體現(xiàn)。
typedef struct st_ether_phy_instance
{
ether_phy_ctrl_t * p_ctrl; /// 指向PHY實例的控制結(jié)構(gòu)體
ether_phy_cfg_t const * p_cfg; /// 指向?qū)嵗渲玫慕Y(jié)構(gòu)體指針
ether_phy_api_t const * p_api; /// 配置過程中用到的API操作方式所組成的結(jié)構(gòu)體指針
} ether_phy_instance_t;
也就是說其實此處其實打開的是 g_ethercat_ssc_port0:
可以看到 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ū)動是ethercat_ssc_port0 外設(shè)驅(qū)動的子模塊,同樣我們來看下PHY的初始化:
通過調(diào)用 ether_phy_targets_initialize 根據(jù)配置的PHY型號執(zhí)行對應的初始化配置:
08
LWIP協(xié)議棧初始化
1
tcpip_init()
lwip協(xié)議棧的初始化是通過um_lwip_port_core_open()函數(shù)去實現(xiàn)的,在該函數(shù)中會調(diào)用tcpip_init()函數(shù)進行l(wèi)wip協(xié)議棧的初始化,主要會創(chuàng)建一個tcpip_mbox郵箱,用于接收底層或者上層傳遞過來的消息,此外還會創(chuàng)建一個tcpip_thread線程,所有需要處理的數(shù)據(jù)都會通過這個函數(shù)去處理。
在tcpip_mbox郵箱中會接收來自tcpip_input的數(shù)據(jù)包,并由該郵箱將其傳遞給tcpip_thread線程進行處理。
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)用。
這里我們需要關(guān)注兩個回調(diào)函數(shù):
_netif_add_callback
tcpip_input
tcpip_input內(nèi)部具體調(diào)用的就是tcpip_inpkt(),調(diào)用該函數(shù)會將ethernet_input()函數(shù)作為結(jié)構(gòu)體的一部分傳遞給內(nèi)核,當內(nèi)核接收到數(shù)據(jù)包時就會調(diào)用這個函數(shù)。
而在_netif_add_callback()函數(shù)中,我們關(guān)注三個接口函數(shù):
etharp_output
_link_output
_status_changed
第一個 p_netif->output = etharp_output 是以太網(wǎng)接口的輸出回調(diào)函數(shù),用于處理IP數(shù)據(jù)包,主要負責將IP數(shù)據(jù)包通過以太網(wǎng)發(fā)送出去,并處理ARP協(xié)議以解析IP到MAC地址的映射關(guān)系。
第二個 p_netif->linkoutput 是鏈路層的輸出回調(diào)函數(shù),該函數(shù)被用來實際發(fā)送以太網(wǎng)幀到網(wǎng)絡(luò)驅(qū)動程序,etharp_output 等高層協(xié)議函數(shù)會處理好數(shù)據(jù)包內(nèi)容,最終調(diào)用 linkoutput 將數(shù)據(jù)幀發(fā)送到硬件。
第三個是當網(wǎng)絡(luò)接口狀態(tài)發(fā)生變化時調(diào)用的回調(diào)函數(shù)。比如,網(wǎng)絡(luò)接口的鏈路狀態(tài)(link up/down)發(fā)生變化時,lwIP就會調(diào)用這個回調(diào)函數(shù),如果說netif已經(jīng)up并且IP地址被設(shè)置時,他就會發(fā)送一個Event:LWIP_PORT_LAUNCHER_EVENT_IP_UP
09
網(wǎng)卡數(shù)據(jù)傳入LWIP內(nèi)核流程
當eth接收完數(shù)據(jù)后會產(chǎn)生一個中斷,在中斷中會釋放一個信號量
此時在ether_reader線程中收到此信號量,會從以太網(wǎng)驅(qū)動緩沖區(qū)中讀取接收到的以太網(wǎng)幀,并通過um_ether_netif_callback_request執(zhí)行回調(diào)p_func
此時event為ETHER_NETIF_CALLBACK_EVENT_RECEIVE_ETHER_FRAME,執(zhí)行 um_lwip_port_thread_receiver_request();
此時lwip_recv線程收到該Frame,執(zhí)行_netif_frame_input(p_callback),在此函數(shù)中通過um_lwip_port_netif_input()將以太網(wǎng)幀傳入到lwip netif中;
緊接著調(diào)用tcpip_input回調(diào),將封裝的消息傳遞給tcpip_mbox郵箱中,同時由tcpip_thread對該消息進行解析。
10
EOE從站接收以太網(wǎng)數(shù)據(jù)幀流程(使用ping指令)
1
初始化前提
首先系統(tǒng)需要以此完成兩部分初始化:
ethernet網(wǎng)絡(luò)接口初始化
ether_monitor Thread: 檢查netif link狀態(tài),同時將收到的狀態(tài)發(fā)送給回調(diào)更新event
ether_reader Thread: 接收來自ethernet的通知并接收數(shù)據(jù)幀,由ethernet中斷觸發(fā)
ether_writer Thread: 接收來自消息隊列的數(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: 接收來自ethernet link回調(diào)的通知,以此判斷請求的event
lwip_recv Thread: 接收來自ether link回調(diào)的通知,并廣播給netif
在此期間以此通過幾個Event來完成網(wǎng)絡(luò)的初始化
ETHER_NETIF_CALLBACK_EVENT_LINK_DOWN:此時的所有網(wǎng)絡(luò)端口處于初始狀態(tài),還未初始化
ETHER_NETIF_CALLBACK_EVENT_LINK_UP:存在端口link up,執(zhí)行um_lwip_port_task_launcher_request,將event狀態(tài)設(shè)置為LWIP_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修改為LWIP_PORT_CALLBACK_EVENT_NETIF_UP
LWIP_PORT_CALLBACK_EVENT_NETIF_UP:network interface link up,檢查IP地址是否有效,并創(chuàng)建sock監(jiān)聽
只有當這么幾個Event依次觸發(fā),才能完成對EtherCAT從站網(wǎng)絡(luò)的初始化,主從站之間才能正常收發(fā)數(shù)據(jù):
2
ICMP簡要介紹
ICMP一般被認為是IP協(xié)議層的一部分,但在結(jié)構(gòu)上位于IP協(xié)議層之上。主要用于確認網(wǎng)絡(luò)狀態(tài)或者鏈路不同等場景,當數(shù)據(jù)報文無法正常到達目標主機時,ICMP就會返回一個差錯報文,讓源主機知道數(shù)據(jù)到達情況,常見的ping命令就是屬于ICMP 查詢報文功能的一部分,當ping成功,也就代表網(wǎng)卡、IP層、ICMP層都能正常通信,也可以證明LWIP移植成功。
下面是使用Wireshark抓包抓取回顯應答報文的示例:
3
ARP簡要介紹
ARP:地址解析協(xié)議,主要是通過解析IP地址得到數(shù)據(jù)鏈路層的MAC地址(網(wǎng)卡標識符),在以太網(wǎng)中,一個主機想要與另一個主機直接通信,必須知道目標主機的MAC地址,這時候就需要ARP進行地址解析。
ARP緩存表:在每臺主機的內(nèi)存中都有一個ARP緩存表,記錄了IP地址到MAC地址的映射關(guān)系,通過arp -a可獲取信息
其主要的運作流程是:
1.如果主機A想要發(fā)送數(shù)據(jù)給主機B,那么主機A會先檢查自己的ARP緩存中是否有主機B的IP地址及MAC地址的映射,如果有的話才會將主機B的MAC地址作為源地址封裝到數(shù)據(jù)幀中;如果沒有,那主機A就會向局域網(wǎng)中廣播ARP請求(包括發(fā)送方的IP地址、MAC地址,接收方的IP地址),每臺其他主機在收到ARP請求后都會檢查自己的IP地址是否與ARP請求中接收方的IP地址相同,如不相同,就會丟棄ARP請求包。
2.當交換機接收到此數(shù)據(jù)幀后,發(fā)現(xiàn)此數(shù)據(jù)幀為廣播幀,因此會將此數(shù)據(jù)幀從非接收的所有接口中發(fā)送出去。
3.當主機B接收到此數(shù)據(jù)幀后,會核對IP地址是否是自己的,并將主機A的IP地址和MAC地址的對應關(guān)系記錄到自己的ARP緩存表中,同時發(fā)送一個ARP響應,其中就包括自己的MAC地址。
4.當主機A接收到這個主機B回應的數(shù)據(jù)幀后,就會在自己的ARP緩存表中記錄主機B的IP地址和MAC映射關(guān)系。
具體流程可見下圖:
下面這個是EtherCAT EOE工程測試ping命令時ARP緩存表的變化情況
那這里LWIP是怎么處理ARP請求并且獲取到從站的IP及MAC地址的呢,我們接著往下看
4
ARP接收數(shù)據(jù)包流程
先來了解兩個API:
LWIP從網(wǎng)卡中接收數(shù)據(jù)包的函數(shù)是:ethernet_input()
ARP數(shù)據(jù)包的處理函數(shù)是:etharp_input(),其主要內(nèi)容為:
(1)檢查ARP報文。
(2)ARP請求報文:如果是請求報文的目標IP和本地的匹配,就組裝ARP響應報文并發(fā)送出去。
(3)ARP響應報文:
1)更新ARP緩存表。
2)把阻塞在arp entry緩存隊列的IP數(shù)據(jù)報發(fā)送出去。
3)釋放pbuf。因為ARP報文到此已經(jīng)處理完畢。
對于ARP處理數(shù)據(jù)包來說,有這么兩種情況:
(1)收到APR應答包:此時說明之前發(fā)送的APR請求包得到了回應,那么就根據(jù)應答包去更新自身的ARP緩存表;
(2)收到ARP請求包:首先會判斷包中的目標是否與主機IP匹配,匹配上的話就記錄下源主機的IP及MAC地址,接著在更新自身的ARP表外,還要向源主機發(fā)送一個ARP應答包;如果說包中的目標IP與主機IP并不匹配,那么根據(jù)ARP表的空余情況選擇記錄源主機的IP及MAC地址(如果沒有空余的表項,則不會記錄),并丟棄該請求包。
這里對應我們EtherCAT EOE工程來說,ethernet調(diào)用流程為:
ethernet_input(收到ARP數(shù)據(jù)包) ->etharp_input()-> etharp_raw(發(fā)送應答包) ->ethernet_output()-> _link_output -> um_lwip_port_ether_netif_send -> UM_ETHER_NETIF_Send()
5
ARP發(fā)送數(shù)據(jù)包流程
前面我們了解了一個數(shù)據(jù)包的接收流程,如果收到的是ARP數(shù)據(jù)包,那么就會交給ARP處理,如果是IP數(shù)據(jù)包就會調(diào)用ip4_input()函數(shù)將其傳遞給上層.
arp通過 etharp_output() 函數(shù)接收到IP數(shù)據(jù)包后,判斷該數(shù)據(jù)包是單播,多播還是廣播,對于其處理方式:
對于多播或者廣播數(shù)據(jù)包,直接交給網(wǎng)卡處理(調(diào)用ethernet_output)
對于單播,arp需要根據(jù)IP找到對應的MAC地址,如果找不到MAC地址,還要延遲發(fā)送數(shù)據(jù)包。ARP首先會創(chuàng)建一個ARP表項,再將數(shù)據(jù)包掛載到ARP表項上對應的緩存隊列上,同時會發(fā)出一個ARP請求包,等待目標主機的回應后再發(fā)送IP數(shù)據(jù)包
那么對應netif->linkoutput()其實就是在初始化lwip網(wǎng)卡接口設(shè)備時綁定的 _link_output()
11
EtherCAT EOE測試
編譯并啟動下載調(diào)試,終端出現(xiàn)RT-Thread LOGO即為啟動成功
將瑞薩EtherCAT EOE例程下的ESI文件(RZT2M_EtherCAT_RSK_rev0200\common\ecat_EoE_lwIP\ESI\Renesas EtherCAT RZT2 EoE.xml)復制到TwinCAT安裝目錄下(C:\TwinCAT\3.1\Config\Io\EtherCAT)
啟動TwinCAT,并燒入EEPROM的EOE固件
使用ping命令測試EOE協(xié)議是否運行成功
使用TCPIP測試工具測試TCP通信回顯功能
12
其他說明:三網(wǎng)口使用配置說明
打開RZSC,配置ethercat_ssc_port的phy2
設(shè)置第三個網(wǎng)口的PHY
設(shè)置ETHER_ETH2
設(shè)置ETHER_ESC的phy2配置,修改ESC_LINKACT2為P21_0,ESC_PHYLINK2為P00_5
生成RZSC源碼,回到IAR工程重新編譯下載
EEPROM固件更新
此時T2M的三個網(wǎng)口都可以進行EtherCAT EOE通信,具體測試方法參考如上
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
ESM
+關(guān)注
關(guān)注
0文章
9瀏覽量
9051 -
ethercat
+關(guān)注
關(guān)注
18文章
686瀏覽量
38673
發(fā)布評論請先 登錄
相關(guān)推薦
評論