介紹
LWIP(Lightweight IP)是一個(gè)輕量級(jí)的開源TCP/IP協(xié)議棧,它專為嵌入式系統(tǒng)和小型設(shè)備而設(shè)計(jì)。LWIP旨在提供TCP/IP網(wǎng)絡(luò)協(xié)議支持,使嵌入式系統(tǒng)能夠與其他設(shè)備通過(guò)網(wǎng)絡(luò)進(jìn)行通信
LWIP特點(diǎn):
- 輕量級(jí):LWIP被設(shè)計(jì)為占用較少的內(nèi)存和處理器資源,使其能夠在嵌入式系統(tǒng)中高效運(yùn)行。
- 可裁剪性:LWIP允許根據(jù)具體需求進(jìn)行裁剪,只包含必要的協(xié)議和功能,以減小存儲(chǔ)空間和處理器開銷。
- 高性能:LWIP使用了一些性能優(yōu)化技術(shù),如零拷貝和事件驅(qū)動(dòng)機(jī)制,以提高網(wǎng)絡(luò)通信的效率和吞吐量。
- 可移植性:LWIP具有良好的可移植性,可以在多種操作系統(tǒng)和硬件平臺(tái)上運(yùn)行。 支持多種應(yīng)用層協(xié)議:除了TCP/IP協(xié)議棧,LWIP還提供了一些常用的應(yīng)用層協(xié)議實(shí)現(xiàn),如HTTP、SNMP和MQTT。
以太網(wǎng)簡(jiǎn)介
STM32中可以通過(guò)以太網(wǎng)按照 IEEE 802.3-2002 標(biāo)準(zhǔn)發(fā)送和接收數(shù)據(jù)。以太網(wǎng)提供了可配置、靈活的外設(shè),用以滿足客戶的各種應(yīng)用需求。它支持與外部物理層(PHY) 相連的兩個(gè)工業(yè)標(biāo)準(zhǔn)接口:默認(rèn)情況下使用的介質(zhì)獨(dú)立接口 (MII)(在 IEEE 802.3 規(guī)范中定義)和簡(jiǎn)化介質(zhì)獨(dú)立接口 (RMII)。
stm32 以太網(wǎng)框圖
當(dāng)進(jìn)行發(fā)送數(shù)據(jù)的時(shí)候,首先系統(tǒng)存儲(chǔ)器以DMA的方式發(fā)送至發(fā)送FIFO(Tx FIFO)進(jìn)行緩沖,再通過(guò)MAC內(nèi)核進(jìn)行發(fā)送。同樣,接收 FIFO (Rx FIFO) 則存儲(chǔ)通過(guò)線路接收的以太網(wǎng)幀,直到這些幀通過(guò) DMA 傳送到系統(tǒng)存儲(chǔ)器。
以太網(wǎng)外設(shè)還包括用于與外部 PHY 通信的 SMI。通過(guò)一組配置寄存器,用戶可以為 MAC 控 制器和 DMA 控制器選擇所需模式和功能。
上面的主要需要分析的模式是:MAC內(nèi)核、RMII/MII介質(zhì)接口、外部的PHY.
MAC內(nèi)核
MAC內(nèi)核是以太網(wǎng)控制器的關(guān)鍵組件,負(fù)責(zé)處理以太網(wǎng)幀的發(fā)送、接收、解析、封裝、錯(cuò)誤檢測(cè)和流控制等功能。它與PHY層緊密協(xié)作,實(shí)現(xiàn)了STM32F4微控制器與以太網(wǎng)之間的可靠數(shù)據(jù)通信。
- 幀處理:MAC內(nèi)核負(fù)責(zé)處理以太網(wǎng)數(shù)據(jù)幀的發(fā)送和接收。它與PHY層進(jìn)行接口連接,將主機(jī)發(fā)送的數(shù)據(jù)封裝為以太網(wǎng)幀并發(fā)送到網(wǎng)絡(luò)上,同時(shí)從網(wǎng)絡(luò)接收數(shù)據(jù)幀并傳遞給主機(jī)進(jìn)行處理。
- 幀解析和封裝:MAC內(nèi)核負(fù)責(zé)解析接收到的以太網(wǎng)幀,提取其中的目標(biāo)MAC地址、源MAC地址、幀類型和數(shù)據(jù)等信息。同時(shí),它也負(fù)責(zé)封裝主機(jī)發(fā)送的數(shù)據(jù)為以太網(wǎng)幀,添加必要的控制信息。
- 錯(cuò)誤檢測(cè)和處理:MAC內(nèi)核執(zhí)行幀的校驗(yàn)和錯(cuò)誤檢測(cè)。它會(huì)驗(yàn)證接收到的幀的完整性和正確性,通過(guò)校驗(yàn)和字段檢查是否存在錯(cuò)誤。如果幀出現(xiàn)錯(cuò)誤或校驗(yàn)失敗,MAC內(nèi)核會(huì)丟棄或丟棄該幀,并通知主機(jī)。
- 幀的重傳和丟棄:MAC內(nèi)核負(fù)責(zé)處理發(fā)送失敗或接收錯(cuò)誤的情況。在發(fā)送時(shí),如果未收到幀的確認(rèn)響應(yīng)或檢測(cè)到?jīng)_突,MAC內(nèi)核會(huì)觸發(fā)重傳機(jī)制。在接收時(shí),如果幀出現(xiàn)錯(cuò)誤或無(wú)效,MAC內(nèi)核會(huì)丟棄該幀并通知主機(jī)。
- 幀流控制:MAC內(nèi)核支持流控制機(jī)制,用于控制數(shù)據(jù)幀的發(fā)送速率。它可以根據(jù)接收端的緩沖區(qū)狀態(tài)和網(wǎng)絡(luò)流量情況,自動(dòng)調(diào)整發(fā)送速率,以避免數(shù)據(jù)丟失或網(wǎng)絡(luò)擁塞。
上面是MAC內(nèi)核功能的描述,了解一下即可。我們主要是要關(guān)注Mac內(nèi)核與PHY的物理接口看MAC是如何管理PHY.
站管理接口:SMI
描述
站管理接口(Station Management Interface,SMI)是用于與物理層(PHY)設(shè)備進(jìn)行通信和配置的接口。SMI接口提供了主機(jī)(STM32)與PHY設(shè)備之間的通信通道,使得主機(jī)能夠控制和監(jiān)控PHY設(shè)備的操作。主要功能如下:
- 寄存器訪問(wèn):通過(guò)SMI接口,主機(jī)可以讀取和寫入PHY設(shè)備的寄存器。這些寄存器包含了控制PHY設(shè)備功能和配置參數(shù)的信息。主機(jī)可以通過(guò)讀取和寫入寄存器的值來(lái)配置PHY設(shè)備的工作模式、速度、雙工模式等。
- PHY設(shè)備配置:主機(jī)可以使用SMI接口來(lái)配置PHY設(shè)備的各種參數(shù)。通過(guò)讀取和寫入寄存器的值,主機(jī)可以設(shè)置PHY設(shè)備的工作模式、速度、自動(dòng)協(xié)商等。這樣可以適應(yīng)不同的網(wǎng)絡(luò)環(huán)境和需求。
- 狀態(tài)查詢:通過(guò)SMI接口,主機(jī)可以查詢PHY設(shè)備的狀態(tài)信息。主機(jī)可以讀取PHY設(shè)備的狀態(tài)寄存器,以獲取連接狀態(tài)、速度狀態(tài)、工作模式等信息。這些狀態(tài)信息可以幫助主機(jī)監(jiān)測(cè)網(wǎng)絡(luò)連接和PHY設(shè)備的工作狀態(tài)。
- 錯(cuò)誤處理:SMI接口還提供了錯(cuò)誤處理的能力。主機(jī)可以讀取PHY設(shè)備的狀態(tài)寄存器以檢測(cè)錯(cuò)誤標(biāo)志,并根據(jù)錯(cuò)誤類型采取適當(dāng)?shù)拇胧?。例如,重新配置PHY設(shè)備、進(jìn)行錯(cuò)誤恢復(fù)等,以確保網(wǎng)絡(luò)通信的可靠性。
主要是關(guān)注SMI對(duì)PHY設(shè)置:如工作模式、速度、雙工模式、自動(dòng)協(xié)商設(shè)置。
SMI 站管理接口
如上圖,SMI與PHY硬件接口由兩根組成:MDC[時(shí)鐘線]、MDIO[數(shù)據(jù)線]。通過(guò)這兩根線可以訪問(wèn)多達(dá)32個(gè)PHY。SMI可以從 32 個(gè) PHY 中選擇一個(gè) PHY 。PHY里面包含了一個(gè) 32 個(gè)寄存器。這個(gè)寄存器中主要是對(duì)發(fā)送數(shù)據(jù)進(jìn)行控制\\接收狀態(tài)信息。任意時(shí)間只能訪問(wèn)一個(gè)PHY。它的幀結(jié)構(gòu)如下。
幀格式
- 報(bào)頭:SMI幀以4個(gè)報(bào)頭字節(jié)(0xFFFFFFFF)開始,在發(fā)送\\寫入操作時(shí),用于主機(jī)與PHY設(shè)備的之間建立同步通信。
- 起始:幀起始由 [01] 模式定義,用于驗(yàn)證線路從默認(rèn)邏輯“1”狀態(tài)變?yōu)檫壿嫛?”狀 態(tài),然后再?gòu)倪壿嫛?”狀態(tài)變?yōu)檫壿嫛?”狀態(tài)。
- 操作:定義正在發(fā)生的事務(wù)(讀取[10]或?qū)懭隱01])的類型。
- PHY地址:PHY 地址有 5 位,可構(gòu)成 32 個(gè)唯一 PHY 地址。最先發(fā)送和接收地址的 MSB 位。
- 寄存器地址:寄存器地址有 5 位,從而可在所選 PHY 設(shè)備中對(duì) 32 個(gè)不同的寄存器進(jìn)行尋 址。最先發(fā)送和接收地址的 MSB 位。
- TA:周轉(zhuǎn)字段在 RADDR 和 DATA 字段間定義了一個(gè) 2 位模式,以避免在讀取事務(wù)期間 出現(xiàn)競(jìng)爭(zhēng)現(xiàn)象。讀取事務(wù)時(shí),MAC 控制器將 TA 的 2 個(gè)位驅(qū)動(dòng)為 MDIO 線上的高阻態(tài)。 PHY 設(shè)備必須將 TA 的第一位驅(qū)動(dòng)為高阻態(tài),將 TA 的第二位驅(qū)動(dòng)為“0”。 寫入事務(wù)時(shí),MAC 控制器針對(duì) TA 字段驅(qū)動(dòng) [10] 模式。PHY 設(shè)備必須將 TA 的 2 個(gè)位 驅(qū)動(dòng)為高阻態(tài)。
- 數(shù)據(jù):數(shù)據(jù)字段為 16 位。最先發(fā)送和接收的位必須為 ETH_MIID 寄存器的位 15。
- 空閑:MDIO 線驅(qū)動(dòng)為高阻態(tài)。三態(tài)驅(qū)動(dòng)器必須禁止,PHY 的上拉電阻使線路保持邏輯 “1”狀態(tài)。
寫操作
當(dāng)應(yīng)用程序?qū)?MII 寫入位和繁忙位置 1 時(shí),SMI 將通過(guò)傳輸 PHY 地址、PHY 中的寄存器地址以及寫入數(shù)據(jù)。來(lái)觸發(fā)對(duì) PHY 寄存器進(jìn)行寫操作。事務(wù)進(jìn)行期間, 應(yīng)用程序不能更改 MII 地址寄存器的內(nèi)容或 MII 數(shù)據(jù)寄存器。在此期間對(duì) MII 地址寄存器或 MII 數(shù)據(jù)寄存器執(zhí)行的寫操作將會(huì)忽略(繁忙位處于高電平狀態(tài)),事務(wù)將無(wú)錯(cuò)完成。寫操 作完成后,SMI 將通過(guò)復(fù)位繁忙位進(jìn)行指示。
寫操作
讀操作
當(dāng)用戶將以太網(wǎng) MAC MII 地址寄存器 (ETH_MACMIIAR) 中的 MII 繁忙位置 1、MII 寫入位清 零時(shí),SMI 將通過(guò)傳輸 PHY 地址和 PHY 中的寄存器地址在 PHY 寄存器中觸發(fā)讀操作。事 務(wù)進(jìn)行期間,應(yīng)用程序不應(yīng)更改 MII 地址寄存器的內(nèi)容或 MII 數(shù)據(jù)寄存器。在此期間對(duì) MII 地址寄存器或 MII 數(shù)據(jù)寄存器執(zhí)行的寫操作將會(huì)忽略(繁忙位處于高電平狀態(tài)),事務(wù)將無(wú) 錯(cuò)完成。讀操作完成后,SMI 將復(fù)位繁忙位,然后用從 PHY 中讀取的數(shù)據(jù)更新 MII 數(shù)據(jù)寄存器。
讀操作
時(shí)鐘選擇
MAC 啟動(dòng)管理寫/讀操作。SMI 時(shí)鐘是一個(gè)分頻時(shí)鐘,其時(shí)鐘源為應(yīng)用時(shí)鐘(AHB 時(shí)鐘)。 分頻系數(shù)取決于 MII 地址寄存器中設(shè)置的時(shí)鐘范圍。
時(shí)鐘選擇
介質(zhì)接口
上面我們提到過(guò)一個(gè)MII的概念。MII其實(shí)就是一種介質(zhì)接口。STM32除了MII介質(zhì)接口外還有RMII介質(zhì)接口。介質(zhì)接口是配合SMI對(duì)PHY進(jìn)行控制的。比如:SMI什么時(shí)候發(fā)數(shù)據(jù)、什么時(shí)候收數(shù)據(jù)、發(fā)寫操作幀還是發(fā)讀操作幀都是需要介質(zhì)接口上的寄存器的值進(jìn)行控制的。為此,MAC內(nèi)核與PHY的物理接口其實(shí)就是SMI+RMII/MII 組成,后面分析都是基于這兩者結(jié)合體。
介質(zhì)獨(dú)立接口:MII
介質(zhì)獨(dú)立接口 (MII) 定義了 10 Mbit/s 和 100 Mbit/s 的數(shù)據(jù)傳輸速率下 MAC 子層與 PHY 之間的互連。
介質(zhì)獨(dú)立接口信號(hào)
- TX_CLK:連續(xù)時(shí)鐘信號(hào)。該信號(hào)提供進(jìn)行 TX 數(shù)據(jù)傳輸時(shí)的參考時(shí)序。標(biāo)稱頻率為: 速率為 10 Mbit/s 時(shí)為 2.5 MHz;速率為 100 Mbit/s 時(shí)為 25 MHz。
- TXD(Transmit Data):TXD信號(hào)是主機(jī)向PHY設(shè)備發(fā)送數(shù)據(jù)的并行輸出信號(hào)。主機(jī)通過(guò)TXD線將以太網(wǎng)幀的數(shù)據(jù)發(fā)送給PHY設(shè)備。
- TX_EN:發(fā)送使能信號(hào)。該信號(hào)必 須與報(bào)頭的前半字節(jié)進(jìn)行同步 (MII_TX_CLK)
- RX_CLK:連續(xù)時(shí)鐘信號(hào)。該信號(hào)提供進(jìn)行 RX 數(shù)據(jù)傳輸時(shí)的參考時(shí)序。標(biāo)稱頻率 為:速率為 10 Mbit/s 時(shí)為 2.5 MHz;速率為 100 Mbit/s 時(shí)為 25 MHz。
- RXD[3:0]:數(shù)據(jù)接收信號(hào)。該信號(hào)是 4 個(gè)一組的數(shù)據(jù)信號(hào)。
- RX_ER:接收錯(cuò)誤信號(hào)。該信號(hào)必須保持一個(gè)或多個(gè)周期 (MII_RX_CLK),從而向 MAC 子層指示在幀的某處檢測(cè)到錯(cuò)誤。
- RX_DV:接收數(shù)據(jù)有效信號(hào)。該信號(hào)表示 PHY 當(dāng)前正針對(duì) MII 接收已恢復(fù)并解碼的半字節(jié)。
- CRS:載波偵聽(tīng)信號(hào)。當(dāng)發(fā)送或接收介質(zhì)處于非空閑狀態(tài)時(shí),由 PHY 使能該信號(hào)。
- COL:沖突檢測(cè)信號(hào)。檢測(cè)到介質(zhì)上存在沖突后,PHY 必須立即使能沖突檢測(cè)信號(hào), 并且只要存在沖突條件,沖突檢測(cè)信號(hào)必須保持有效狀態(tài)。該信號(hào)無(wú)需與 TX 和 RX 時(shí) 鐘保持同步。在全雙工模式下,該信號(hào)沒(méi)意義。
- MDIO(Management Data Input/Output):MDIO信號(hào)用于主機(jī)與PHY設(shè)備之間的管理數(shù)據(jù)的雙向傳輸。主機(jī)通過(guò)MDIO信號(hào)線向PHY設(shè)備發(fā)送配置和控制命令,并從PHY設(shè)備讀取狀態(tài)和配置信息。
- MDC(Management Data Clock):MDC信號(hào)是MDIO信號(hào)的時(shí)鐘信號(hào),用于同步MDIO數(shù)據(jù)的傳輸。MDC信號(hào)的頻率由主機(jī)控制,用于提供時(shí)序同步。
TX 接口信號(hào)編碼
RX 接口信號(hào)編碼
MII時(shí)鐘源
要生成 TX_CLK 和 RX_CLK 時(shí)鐘信號(hào),必須向外部 PHY 提供 25MHz 時(shí)鐘,如下圖示。除了使用外部 25 MHz 石英晶體提供該時(shí)鐘,還可以通過(guò) STM32F4xx 微控制器的 MCO 引腳輸出該信號(hào)。這種情況下,必須對(duì) PLL 倍頻進(jìn)行配置,以通過(guò) 25 MHz 外部石英晶體在 MCO 引腳上獲得所需頻率。
精簡(jiǎn)介質(zhì)獨(dú)立接口:RMII
精簡(jiǎn)介質(zhì)獨(dú)立接口 (RMII) 規(guī)范降低了 10/100 Mbit/s 下微控制器以太網(wǎng)外設(shè)與外部 PHY 間的 引腳數(shù)。根據(jù) IEEE 802.3u 標(biāo)準(zhǔn),MII 包括 16 個(gè)數(shù)據(jù)和控制信號(hào)的引腳。RMII 規(guī)范將引腳 數(shù)減少為 7 個(gè)(引腳數(shù)減少 62.5%)。
RMII 接口是 MAC 和 PHY 之間的實(shí)例化對(duì)象。這有助于將 MAC 的 MII 轉(zhuǎn)換為 RMII。RMII 具有以下特性:
- 支持 10-Mbit/s 和 100-Mbit/s 的運(yùn)行速率
- 參考時(shí)鐘必須是 50 MHz
- 相同的參考時(shí)鐘必須從外部提供給 MAC 和外部以太網(wǎng) PHY
- 它提供了獨(dú)立的 2 位寬(雙位)的發(fā)送和接收數(shù)據(jù)路徑
RMII時(shí)鐘源
時(shí)鐘源方案
MII與RMII除了在IO接口不同外,還存在著發(fā)送位寬的不同。介質(zhì)MII接口一個(gè)周期發(fā)送位寬位4位,RMII的是2位。但是由于他們發(fā)送周期不同。如果在相同的時(shí)間內(nèi),RMII發(fā)送了兩次而MII發(fā)送了一次。所以最終的速率是一樣的。
PHY
描述
上面分析的過(guò)程中,我們知道了。Mac內(nèi)核的數(shù)據(jù)最終,是通過(guò)PHY發(fā)送出去的。那么PHY是什么?這里主要是對(duì)LAN8720A這款PHY進(jìn)行分析。如下圖就是LAN8720A的內(nèi)部框圖
LAN8720A內(nèi)部框圖
PHY在計(jì)算機(jī)網(wǎng)絡(luò)中起著關(guān)鍵作用,負(fù)責(zé)將數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為物理信號(hào),并在物理介質(zhì)上進(jìn)行可靠的傳輸。它處理信號(hào)的編碼、調(diào)制、傳輸和解調(diào)過(guò)程,同時(shí)支持時(shí)鐘同步、錯(cuò)誤檢測(cè)和糾正,以及自動(dòng)協(xié)商功能。PHY的正確操作和配置對(duì)于實(shí)現(xiàn)高速、可靠的數(shù)據(jù)通信至關(guān)重要。
LAN8720A
PHY內(nèi)部包含了32個(gè)寄存器,都是通過(guò)MAC的SMI上的MDC與MDIO這兩根線進(jìn)行PHY的寄存器的讀寫。上面我們知道我們主要是通過(guò)這兩根線實(shí)現(xiàn)PHY的速度與雙工模式確定。
LAN8720A的32個(gè)內(nèi)部寄存器如下
LAN8720A內(nèi)部寄存器
而控制雙工模式以及速度的模式主要存在于第3 1個(gè)寄存器也稱為BCR寄存器,其寄存器設(shè)置如下。
雙工與模式設(shè)置寄存器
如下圖是前面提及的MDIO數(shù)據(jù)幀格式
對(duì)于2:4字段。最高位為1的時(shí)候表示是全雙工、0的時(shí)候表示半雙工。第二第三位代表的速度。01 表示10Mbit/s、10表示100Mbit/s如果我想把當(dāng)前的第一個(gè)PHY假如為0x00[有多個(gè)PHY]設(shè)置為100Mbit/s 與全雙工模式。該如何操作?
首先,確定時(shí)PHY的地址。那么PHY的地址就是0x00。接下來(lái)就是寄存器的地址,這里的寄存器是最后一個(gè)寄存器地址:0x1F.最后是數(shù)據(jù)位:100Mbit/s 全雙工。對(duì)應(yīng)上面表的110,所以數(shù)據(jù)位為0000000000011000.
MAC 802.3 幀格式
上面的分析其實(shí)都是在物理層于數(shù)據(jù)鏈路層的內(nèi)容。既然是在物理層那么就應(yīng)該有物理層的數(shù)據(jù)幀結(jié)構(gòu)標(biāo)準(zhǔn)。這個(gè)幀標(biāo)準(zhǔn)就是MAC 802.3 幀格式。這個(gè)幀結(jié)構(gòu)分為:有標(biāo)記MAC幀格式與無(wú)標(biāo)記MAC幀結(jié)構(gòu)
無(wú)標(biāo)記MAC幀格式
- 報(bào)頭:MAC幀以7個(gè)字節(jié)的報(bào)頭(10101010...)開始,用于同步接收方的時(shí)鐘。
- 幀起始定界符(Start Frame Delimiter,SFD):緊接著前導(dǎo)碼是一個(gè)字節(jié)的SFD(10101011),用于標(biāo)識(shí)幀的起始。
- 目標(biāo)MAC地址(Destination MAC Address):6個(gè)字節(jié),指示數(shù)據(jù)幀的目標(biāo)設(shè)備的MAC地址。該字段唯一標(biāo)識(shí)了數(shù)據(jù)幀的接收方。
- 源MAC地址(Source MAC Address):6個(gè)字節(jié),指示數(shù)據(jù)幀的發(fā)送設(shè)備的MAC地址。該字段唯一標(biāo)識(shí)了數(shù)據(jù)幀的發(fā)送方。
- 長(zhǎng)度/類型(Length/Type):2個(gè)字節(jié),指示數(shù)據(jù)字段的長(zhǎng)度或指示數(shù)據(jù)字段的類型。當(dāng)長(zhǎng)度小于等于1500時(shí),它指示了上層協(xié)議類型。
- 數(shù)據(jù)字段(Data):46-1500個(gè)字節(jié),包含了上層協(xié)議(如IP或ARP)傳輸?shù)臄?shù)據(jù)。
- 幀校驗(yàn)序列(Frame Check Sequence,F(xiàn)CS):4個(gè)字節(jié),用于檢測(cè)數(shù)據(jù)幀在傳輸過(guò)程中是否發(fā)生了錯(cuò)誤。FCS字段使用循環(huán)冗余校驗(yàn)(CRC)算法計(jì)算得出。
帶標(biāo)記的 MAC 幀格式
帶標(biāo)記的MAC幀格式和不帶標(biāo)識(shí)符的MAC幀之間的區(qū)別在于是否包含了標(biāo)識(shí)符字段。下面是它們的區(qū)別:
- 帶標(biāo)記的MAC幀格式(Tagged MAC Frame):帶標(biāo)記的MAC幀格式是在不同的網(wǎng)絡(luò)技術(shù)中使用的一種擴(kuò)展幀格式。它包含了一個(gè)額外的標(biāo)識(shí)符字段,用于標(biāo)記幀所屬的虛擬局域網(wǎng)(VLAN)。標(biāo)識(shí)符字段是一個(gè)特定的VLAN標(biāo)簽,用于將幀與相應(yīng)的VLAN關(guān)聯(lián)起來(lái)。帶標(biāo)記的MAC幀格式通常用于實(shí)現(xiàn)虛擬局域網(wǎng)的劃分和管理。
- 不帶標(biāo)識(shí)符的MAC幀格式(Untagged MAC Frame):不帶標(biāo)識(shí)符的MAC幀格式是最常見(jiàn)的以太網(wǎng)幀格式,也被稱為普通以太網(wǎng)幀格式。它不包含額外的標(biāo)識(shí)符字段,只包含了目標(biāo)MAC地址、源MAC地址、長(zhǎng)度/類型、數(shù)據(jù)字段和幀校驗(yàn)序列。不帶標(biāo)識(shí)符的MAC幀格式適用于普通的以太網(wǎng)通信,不涉及虛擬局域網(wǎng)的劃分和管理。
以太網(wǎng)DMA描述符
如下框圖,已經(jīng)分析了MAC內(nèi)核、PHY。而最后我們需要對(duì)以外網(wǎng)DMA與TxFiFo、RxFiFo 這部分進(jìn)行分析。
stm32 以太網(wǎng)框圖
以太網(wǎng)DMA控制器操作過(guò)程:
DMA 具有獨(dú)立的發(fā)送和接收引擎以及相應(yīng)的 CSR(控制和狀態(tài)寄存器)空間。發(fā)送引擎將 數(shù)據(jù)從系統(tǒng)存儲(chǔ)器傳送到 Tx FIFO,而接收引擎將數(shù)據(jù)從 Rx FIFO 傳送到系統(tǒng)存儲(chǔ)器。DMA 可以在 CPU 完全不干預(yù)的情況下,通過(guò)描述符有效地將數(shù)據(jù)從源傳送到目標(biāo)。DMA 專為面 向包的數(shù)據(jù)傳送(如以太網(wǎng)中的幀)而設(shè)計(jì)。該控制器經(jīng)過(guò)編程后,可在完成幀發(fā)送和接收 傳送操作時(shí)以及其它正常/錯(cuò)誤條件下產(chǎn)生 CPU 中斷。DMA 和 STM32通過(guò)以下兩種數(shù) 據(jù)結(jié)構(gòu)進(jìn)行通信:
- 控制和狀態(tài)寄存器 (CSR)
- 描述符列表和數(shù)據(jù)緩沖區(qū)。
什么是以太網(wǎng)DMA描述符
DMA 既可將接收到的數(shù)據(jù)幀傳送到 STM32F4xx 存儲(chǔ)器中的接收緩沖區(qū),也可以傳送 STM32 存儲(chǔ)器的發(fā)送緩沖區(qū)中的數(shù)據(jù)幀。位于 STM32F4xx 存儲(chǔ)器中的描述符用作指向這些緩沖區(qū)的指針。共有兩個(gè)描述符列表:一個(gè)用于接收,一個(gè)用于發(fā)送。兩個(gè)列表的基址分別寫入 DMA 寄存器 3 和寄存器 4。最后一個(gè)描述符會(huì)指回第一個(gè)描述符以構(gòu)成環(huán)形結(jié)構(gòu)。可通過(guò)配置接收和發(fā)送描述符 (RDES1[14] 和 TDES0[20])中鏈接的第二個(gè)地址來(lái)完成描述符的顯式鏈接。
簡(jiǎn)單來(lái)說(shuō)就是TxFiFo與RxFiFo緩沖區(qū)內(nèi)存的管理是通過(guò)鏈表實(shí)現(xiàn)。不然怎么叫FIFO先入先出不就是一個(gè)隊(duì)列數(shù)據(jù)結(jié)構(gòu)嘛。
DMA 既可將接收到的數(shù)據(jù)幀傳送到 STM32F4xx 存儲(chǔ)器中的接收緩沖區(qū),也可以傳送 STM32 存儲(chǔ)器的發(fā)送緩沖區(qū)中的數(shù)據(jù)幀。位于 STM32F4xx 存儲(chǔ)器中的描述符用作指向這些緩沖區(qū)的指針。
描述符
描述符主要分兩種:常規(guī)描述符、增強(qiáng)描述符
常規(guī)描述符:管理緩沖區(qū)常規(guī)描述符:在常規(guī)描述符基礎(chǔ)上開啟時(shí)間戳和 IPv4校驗(yàn)和減荷這里主要分析常規(guī)的描述符,其結(jié)構(gòu)框圖如下
常規(guī) Tx DMA 描述符
其中需要比較注意的位為
- TDES0[31]置0:CPU可將數(shù)據(jù)拷貝到描述符中,拷貝完成之后把該位置1,告訴DMA可以發(fā)送數(shù)據(jù)
- TDES0[20]置1:描述符中的第二個(gè)地址是下一個(gè)描述符地址
- TDES1[28:16]:如果TDES0[20] 位置1,則該字段無(wú)效
- TDES3[31:0]:取決于TDES0[20]的值,為1,則指向下一個(gè)描述符地址
常規(guī) Rx DMA 描述符結(jié)構(gòu)
- RDES0[31]置1:MAC將數(shù)據(jù)從RX FIFO傳輸?shù)絉X描述符中,拷貝完成之后該位置0,告訴CPU可以接收數(shù)據(jù)
- RDES0[14]置1:描述符中的第二個(gè)地址是下一個(gè)描述符地址
- RDES1[28:16]:如果RDES0[14]位置1,則該字段無(wú)效
- RDES3[31:0]:取決于RDES0[14]的值,為1,則指向下一個(gè)描述符地址
描述符結(jié)構(gòu)
其中根據(jù)RES3/TDES3字段來(lái)判斷是什么結(jié)構(gòu),如果是指向下一個(gè)緩沖區(qū)地址那么就是鏈接結(jié)構(gòu),如果是第二個(gè)緩沖區(qū)就是1環(huán)形結(jié)構(gòu)。
評(píng)論
查看更多