互聯網模型
通信至少是兩個設備的事,需要相互兼容的硬件和軟件支持,我們稱之為通信協議。以太網通信在結構比較復雜,國際標准組織將整個以太網通信結構制定了 OSI 模型,總共分層七個層,分別為應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層以及物理層,每個層功能不同,通信中各司其職,整個模型包括硬件和軟件定義。 OSI 模型是理想分層,一般的網絡系統只是涉及其中幾層。
TCP/IP 是互聯網最基本的協議,是互聯網通信使用的網絡協議,由網絡層的 IP 協議和傳輸層的 TCP 協議組成。 TCP/IP 只有四個分層,分別為應用層、傳輸層、網絡層以及網絡訪問層。雖然 TCP/IP 分層少了,但與 OSI 模型是不沖突的,它把 OSI 模型一些層次整合一起的,本質上可以實現相同功能。
實際上,還有一個 TCP/IP 混合模型,分為五個層,參考圖 42-1,它實際與 TCP/IP 四層模型是相通的,只是把網絡訪問層拆成數據鏈路層和物理層。這種分層方法對我們學習理解更容易。
設計網絡時,為了降低網絡設計的復雜性,對組成網絡的硬件、軟件進行封裝、分層,這些分層即構成了網絡體系模型。在兩個設備相同層之間的對話、通信約定,構成了層級協議。設備中使用的所有協議加起來統稱協議棧。 在這個網絡模型中,每一層完成不同的任務,都提供接口供上一層訪問。而在每層的內部,可以使用不同的方式來實現接口,因而內部的改變不會影響其它層。
在 TCP/IP 混合參考模型中,數據鏈路層又被分為 LLC 層(邏輯鏈路層)和 MAC 層(媒體介質訪問層)。目前,對於普通的接入網絡終端的設備, LLC 層和 MAC 層是軟、硬件的分界線。如 PC 的網卡主要負責實現參考模型中的 MAC 子層和物理層,在 PC 的軟件系統中則有一套龐大程序實現了 LLC 層及以上的所有網絡層次的協議。
由硬件實現的物理層和 MAC 子層在不同的網絡形式有很大的區別,如以太網和 Wi-Fi,這是由物理傳輸方式決定的。但由軟件實現的其它網絡層次通常不會有太大區別,在 PC上也許能實現完整的功能, 一般支持所有協議,而在嵌入式領域則按需要進行裁剪。
以太網
以太網(Ethernet)是互聯網技術的一種,由於它是在組網技術中占的比例最高,很多人直接把以太網理解為互聯網。
以太網是指遵守 IEEE 802.3 標准組成的局域網,由 IEEE 802.3 標准規定的主要是位於參考模型的物理層(PHY)和數據鏈路層中的介質訪問控制子層(MAC)。在家庭、企業和學校所組建的 PC 局域網形式一般也是以太網,其標志是使用水晶頭網線來連接(當然還有其它形式)。 IEEE 還有其它局域網標准,如 IEEE 802.11 是無線局域網,俗稱 Wi-Fi。 IEEE802.15 是個人域網,即藍牙技術,其中的 802.15.4 標准則是 ZigBee 技術。
現階段,工業控制、環境監測、智能家居的嵌入式設備產生了接入互聯網的需求,利用以太網技術,嵌入式設備可以非常容易地接入到現有的計算機網絡中。
PHY層
在物理層,由IEEE 802.3標准規定了以太網使用的傳輸介質、傳輸速度、數據編碼方式和沖突檢測機制,物理層一般是通過一個 PHY 芯片實現其功能的。
- 傳輸介質
傳輸介質包括同軸電纜、雙絞線(水晶頭網線是一種雙絞線)、光纖。根據不同的傳輸速度和距離要求,基於這三類介質的信號線又衍生出很多不同的種類。最常用的是“五類線”適用於 100BASE-T 和 10BASE-T 的網絡,它們的網絡速率分別為 100Mbps 和 10Mbps。
- 編碼
為了讓接收方在沒有外部時鍾參考的情況也能確定每一位的起始、結束和中間位置,在傳輸信號時不直接采用二進制編碼。在 10BASE-T 的傳輸方式中采用曼徹斯特編碼,在100BASE-T 中則采用 4B/5B 編碼。
曼徹斯特編碼把每一個二進制位的周期分為兩個間隔,在表示“1”時,以前半個周期為高電平,后半個周期為低電平。表示“0”時則相反,見圖 42-2
采用曼徹斯特碼在每個位周期都有電壓變化,便於同步。但這樣的編碼方式效率太低,只有 50%。
在 100BASE-T 采用的 4B/5B 編碼是把待發送數據位流的每 4 位分為一組,以特定的 5位編碼來表示,這些特定的 5 位編碼能使數據流有足夠多的跳變,達到同步的目的,而且效率也從曼徹斯特編碼的 50%提高到了 80%。
- CSMA/CD 沖突檢測
早期的以太網大多是多個節點連接到同一條網絡總線上(總線型網絡),存在信道競爭問題,因而每個連接到以太網上的節點都必須具備沖突檢測功能。以太網具備 CSMA/CD沖突檢測機制,如果多個節點同時利用同一條總線發送數據,則會產生沖突,總線上的節點可通過接收到的信號與原始發送的信號的比較檢測是否存在沖突,若存在沖突則停止發送數據,隨機等待一段時間再重傳。
現在大多數局域網組建的時候很少采用總線型網絡,大多是一個設備接入到一個獨立的路由或交換機接口,組成星型網絡,不會產生沖突。但為了兼容,新出的產品還是帶有沖突檢測機制。
MAC子層
- MAC 的功能
MAC 子層是屬於數據鏈路層的下半部分,它主要負責與物理層進行數據交接,如是否可以發送數據,發送的數據是否正確,對數據流進行控制等。它自動對來自上層的數據包加上一些控制信號,交給物理層。接收方得到正常數據時,自動去除 MAC 控制信號,把該數據包交給上層。
- MAC 數據包
IEEE 對以太網上傳輸的數據包格式也進行了統一規定,見圖 42-3。該數據包被稱為MAC 數據包。
MAC 數據包由前導字段、幀起始定界符、目標地址、源地址、數據包類型、數據域、填充域、校驗和域組成。
- 前導字段,也稱報頭,這是一段方波,用於使收發節點的時鍾同步。內容為連續 7 個字節的 0x55。字段和幀起始定界符在 MAC 收到數據包后會自動過濾掉。
- 幀起始定界符(SFD): 用於區分前導段與數據段的,內容為 0xD5。
- MAC 地址: MAC 地址由 48 位數字組成,它是網卡的物理地址,在以太網傳輸的最底層,就是根據 MAC 地址來收發數據的。部分 MAC 地址用於廣播和多播,在同一個網絡里不能有兩個相同的 MAC 地址。 PC 的網卡在出廠時已經設置好了 MAC 地址,但也可以通過一些軟件來進行修改,在嵌入式的以太網控制器中可由程序進行配置。數據包中的 DA 是目標地址, SA 是源地址。
- 數據包類型: 本區域可以用來描述本 MAC 數據包是屬於 TCP/IP 協議層的 IP 包、 ARP包還是 SNMP 包,也可以用來描述本 MAC 數據包數據段的長度。 如果該值被設置大於 0x0600,不用於長度描述,而是用於類型描述功能,表示與以太網幀相關的 MAC客戶端協議的種類。
- 數據段: 數據段是 MAC 包的核心內容,它包含的數據來自 MAC 的上層。其長度可以從 0~1500 字節間變化。
- 填充域:由於協議要求整個 MAC 數據包的長度至少為 64 字節(接收到的數據包如果少於 64 字節會被認為發生沖突,數據包被自動丟棄),當數據段的字節少於 46 字節時,在填充域會自動填上無效數據,以使數據包符合長度要求。
- 校驗和域: MAC 數據包的尾部是校驗和域,它保存了 CRC 校驗序列,用於檢錯。
以上是標准的 MAC 數據包, IEEE 802.3 同時還規定了擴展的 MAC 數據包,它是在標准的 MAC 數據包的 SA 和數據包類型之間添加 4 個字節的 QTag 前綴字段,用於獲取標志的 MAC 幀。前 2 個字節固定為 0x8100,用於識別 QTag 前綴的存在;后兩個字節內容分別為 3 個位的用戶優先級、 1 個位的標准格式指示符(CFI)和一個 12 位的 VLAN 標識符。
TCP/IP協議棧
標准 TCP/IP 協議是用於計算機通信的一組協議,通常稱為 TCP/IP 協議棧,通俗講就是符合以太網通信要求的代碼集合,一般要求它可以實現圖 42-1 中每個層對應的協議,比如應用層的 HTTP、 FTP、 DNS、 SMTP 協議,傳輸層的 TCP、 UDP 協議、網絡層的 IP、ICMP 協議等等。關於 TCP/IP 協議詳細內容推薦閱讀《TCP-IP 詳解》和《用 TCP/IP 進行網際互連》理解。
Windows 操作系統、 UNIX 類操作系統都有自己的一套方法來實現 TCP/IP 通信協議,它們都提供非常完整的 TCP/IP 協議。對於一般的嵌入式設備,受制於硬件條件沒辦法支持使用在 Window 或 UNIX 類操作系統的運行的 TCP/IP 協議棧,一般只能使用簡化版本的TCP/IP 協議棧,目前開源的適合嵌入式的有 uIP、 TinyTCP、 uC/TCP-IP、 LwIP 等等。其中LwIP 是目前在嵌入式網絡領域被討論和使用廣泛的協議棧。本章內容其中一個目的就是移植 LwIP 到開發板上運行。
為什么需要協議棧
物理層主要定義物理介質性質, MAC 子層負責與物理層進行數據交接,這兩部分是與硬件緊密聯系的,就嵌入式控制芯片來說,很多都內部集成了 MAC 控制器,完成 MAC 子層功能,所以依靠這部分功能是可以實現兩個設備數據交換,而實際傳輸的數據就是 MAC數據包,發送端封裝好數據包,接收端則解封數據包得到可用數據,這樣的一個模型與使用 USART 控制器實現數據傳輸是非常類似的。但如果將以太網運用在如此基礎的功能上,完全是大材小用,因為以太網具有傳輸速度快、可傳輸距離遠、支持星型拓撲設備連接等等強大功能。功能強大的東西一般都會用高級的應用,這也是設計者的初衷。
使用以太網接口的目的就是為了方便與其它設備互聯,如果所有設備都約定使用一種互聯方式,在軟件上加一些層次來封裝,這樣不同系統、不同的設備通訊就變得相對容易了。而且只要新加入的設備也使用同一種方式,就可以直接與之前存在於網絡上的其它設備通訊。這就是為什么產生了在 MAC 之上的其它層次的網絡協議及為什么要使用協議棧的原因。又由於在各種協議棧中 TCP/IP 協議棧得到了最廣泛使用, 所有接入互聯網的設備都遵守 TCP/IP 協議。 所以,想方便地與其它設備互聯通信,需要提供對 TCP/IP 協議的支持。
各網絡層的功能
用以太網和 Wi-Fi 作例子,它們的 MAC 子層和物理層有較大的區別,但在 MAC 之上的 LLC 層、網絡層、傳輸層和應用層的協議,是基本上同的,這幾層協議由軟件實現,並對各層進行封裝。根據 TCP/IP 協議,各層的要實現的功能如下:
LLC 層: 處理傳輸錯誤;調節數據流,協調收發數據雙方速度,防止發送方發送得太快而接收方丟失數據。主要使用數據鏈路協議。
網絡層: 本層也被稱為 IP 層。 LLC 層負責把數據從線的一端傳輸到另一端,但很多時候不同的設備位於不同的網絡中(並不是簡單的網線的兩頭)。此時就需要網絡層來解決子網路由拓撲問題、路徑選擇問題。在這一層主要有 IP 協議、 ICMP 協議。
傳輸層: 由網絡層處理好了網絡傳輸的路徑問題后,端到端的路徑就建立起來了。傳輸層就負責處理端到端的通訊。在這一層中主要有 TCP、 UDP 協議
應用層: 經過前面三層的處理,通訊完全建立。應用層可以通過調用傳輸層的接口來編寫特定的應用程序。而 TCP/IP 協議一般也會包含一些簡單的應用程序如 Telnet 遠程登錄、FTP 文件傳輸、 SMTP 郵件傳輸協議。
實際上,在發送數據時,經過網絡協議棧的每一層,都會給來自上層的數據添加上一個數據包的頭,再傳遞給下一層。在接收方收到數據時,一層層地把所在層的數據包的頭去掉,向上層遞交數據,參考圖 42-4。
以太網外設(ETH)
STM32F42x 系列控制器內部集成了一個以太網外設,它實際是一個通過 DMA 控制器進行介質訪問控制(MAC),它的功能就是實現 MAC 層的任務。借助以太網外設,STM32F42x 控制器可以通過 ETH 外設按照 IEEE 802.3-2002 標准發送和接收 MAC 數據包。ETH 內部自帶專用的 DMA 控制器用於 MAC, ETH 支持兩個工業標准接口介質獨立接口(MII)和簡化介質獨立接口(RMII),用於與外部 PHY 芯片連接。 MII 和 RMII 接口用於 MAC數據包傳輸, ETH 還集成了站管理接口(SMI)接口專門用於與外部 PHY 通信,用於訪問PHY 芯片寄存器。
物理層定義了以太網使用的傳輸介質、傳輸速度、數據編碼方式和沖突檢測機制,PHY 芯片是物理層功能實現的實體,生活中常用水晶頭網線+水晶頭插座+PHY 組合構成了物理層。
ETH 有專用的 DMA 控制器,它通過 AHB 主從接口與內核和存儲器相連, AHB 主接口用於控制數據傳輸,而 AHB 從接口用於訪問“控制與狀態寄存器” (CSR)空間。在進行數據發送是,先將數據有存儲器以 DMA 傳輸到發送 TX FIFO 進行緩沖,然后由 MAC 內核發送;接收數據時, RX FIFO 先接收以太網數據幀,再由 DMA 傳輸至存儲器。 ETH 系統功能框圖見圖 42-5。
SMI接口
SMI 是 MAC 內核訪問 PHY 寄存器標志接口,它由兩根線組成,數據線 MDIO 和時鍾線 MDC。 SMI 支持訪問 32 個 PHY,這在設備需要多個網口時非常有用,不過一般設備都只使用一個 PHY。 PHY 芯片內部一般都有 32 個 16 位的寄存器,用於配置 PHY 芯片屬性、工作環境、狀態指示等等,當然很多 PHY 芯片並沒有使用到所有寄存器位。 MAC 內核就是通過 SMI 向 PHY 的寄存器寫入數據或從 PHY 寄存器讀取 PHY 狀態,一次只能對一個PHY 的其中一個寄存器進行訪問。 SMI 最大通信頻率為 2.5MHz,通過控制以太網 MACMII 地址寄存器 (ETH_MACMIIAR)的 CR 位可選擇時鍾頻率。
- SMI幀格式
SMI 是通過數據幀方式與 PHY 通信的,幀格式如表 42-1,數據位傳輸順序從左到右。
PADDR 用於指定 PHY 地址,每個 PHY 都有一個地址,一般由 PHY 硬件設計決定,所以是固定不變的。 RADDR 用於指定 PHY 寄存器地址。 TA 為狀態轉換域, 若為讀操作,MAC 輸出兩個位高阻態,而 PHY 芯片則在第一位時輸出高阻態,第二位時輸出“0”。若為寫操作, MAC 輸出“10”, PHY 芯片則輸出高阻態。 數據段有 16 位,對應 PHY 寄存器每個位,先發送或接收到的位對應以太網 MAC MII 數據寄存器(ETH_MACMIIDR)寄存器的位 15。
- SMI讀寫操作
當以太網 MAC MII 地址寄存器 (ETH_MACMIIAR)的寫入位和繁忙位被置 1 時, SMI將向指定的 PHY 芯片指定寄存器寫入 ETH_MACMIIDR 中的數據。寫操作時序見圖 42-6。
當以太網 MAC MII 地址寄存器 (ETH_MACMIIAR)的寫入位為 0 並且繁忙位被置 1 時,SMI 將從向指定的 PHY 芯片指定寄存器讀取數據到 ETH_MACMIIDR 內。讀操作時序見圖42-7。
MII和RMII接口
介質獨立接口(MII)用於連接 MAC 控制器和 PHY 芯片,提供數據傳輸路徑。 RMII 接口是 MII 接口的簡化版本, MII 需要 16 根通信線, RMII 只需 7 根通信,在功能上是相同的。 圖 42-8 為 MII 接口連接示意圖, 圖 42-9 為 RMII 接口連接示意圖。
TX_CLK:數據發送時鍾線。標稱速率為 10Mbit/s 時為 2.5MHz;速率為 100Mbit/s 時
為 25MHz。 RMII 接口沒有該線。
RX_CLK:數據接收時鍾線。標稱速率為 10Mbit/s 時為 2.5MHz;速率為 100Mbit/s 時
為 25MHz。 RMII 接口沒有該線。
TX_EN:數據發送使能。在整個數據發送過程保存有效電平。
TXD[3:0]或 TXD[1:0]:數據發送數據線。對於 MII 有 4 位, RMII 只有 2 位。只有在TX_EN 處於有效電平數據線才有效。
CRS:載波偵聽信號,由 PHY 芯片負責驅動,當發送或接收介質處於非空閑狀態時使能該信號。在全雙工模式該信號線無效。
COL:沖突檢測信號,由 PHY 芯片負責驅動,檢測到介質上存在沖突后該線被使能,並且保持至沖突解除。在全雙工模式該信號線無效。
RXD[3:0]或 RXD[1:0]:數據接收數據線,由 PHY 芯片負責驅動。對於 MII 有 4 位,RMII 只有 2 位。在 MII 模式,當 RX_DV 禁止、 RX_ER 使能時,特定的 RXD[3:0]值用於傳輸來自 PHY 的特定信息。
RX_DV:接收數據有效信號,功能類似 TX_EN,只不過用於數據接收,由 PHY 芯片負責驅動。對於 RMII 接口,是把 CRS 和 RX_DV 整合成 CRS_DV 信號線,當介質處於不同狀態時會自切換該信號狀態。
RX_ER:接收錯誤信號線,由 PHY 驅動,向 MAC 控制器報告在幀某處檢測到錯誤。
REF_CLK:僅用於 RMII 接口,由外部時鍾源提供 50MHz 參考時鍾。
因為要達到 100Mbit/s 傳輸速度, MII 和 RMII 數據線數量不同,使用 MII 和 RMII 在時鍾線的設計是完全不同的。對於 MII 接口,一般是外部為 PHY 提供 25MHz 時鍾源,再由 PHY 提供 TX_CLK 和 RX_CLK 時鍾。對於 RMII 接口,一般需要外部直接提供 50MHz時鍾源,同時接入 MAC 和 PHY。
開發板板載的 PHY 芯片型號為 LAN8720A,該芯片只支持 RMII 接口,電路設計時參考圖 42-9。
ETH 相關硬件在 STM32F42x 控制器分布參考表 42-2。
其中, PPS_OUT 是 IEEE 1588 定義的一個時鍾同步機制。
MAC數據包發送和接受
ETH 外設負責 MAC 數據包發送和接收。利用 DMA 從系統寄存器得到數據包數據內容, ETH 外設自動填充完成 MAC 數據包封裝,然后通過 PHY 發送出去。在檢測到有MAC 數據包需要接收時, ETH 外設控制數據接收,並解封 MAC 數據包得到解封后數據通過 DMA 傳輸到系統寄存器內。
- MAC 數據包發送
MAC 數據幀發送全部由 DMA 控制,從系統存儲器讀取的以太網幀由 DMA 推入 FIFO,然后將幀彈出並傳輸到 MAC 內核。幀傳輸結束后,從 MAC 內核獲取發送狀態並傳回DMA。在檢測到 SOF(Start Of Frame)時, MAC 接收數據並開始 MII 發送。在 EOF(End Of Frame)傳輸到 MAC 內核后,內核將完成正常的發送,然后將發送狀態返回給 DMA。如果在發送過程中發送常規沖突, MAC 內核將使發送狀態有效, 然后接受並丟棄所有后續數據,直至收到下一 SOF。檢測到來自 MAC 的重試請求時,應從 SOF 重新發送同一幀。如果發送期間未連續提供數據, MAC 將發出下溢狀態。在幀的正常傳輸期間,如果 MAC 在未獲得前一幀的 EOF 的情況下接收到 SOF,則將忽略該 SOF 並將新的幀視為前一幀的延續。MAC 控制 MAC 數據包的發送操作,它會自動生成前導字段和 SFD 以及發送幀狀態返回給 DMA,在半雙工模式下自動生成阻塞信號,控制 jabber(MAC 看門狗)定時器用於在傳輸字節超過 2048 字節時切斷數據包發送。 在半雙工模式下, MAC 使用延遲機制進行流量控制,程序通過將 ETH_MACFCR 寄存器的 BPA 位置 1 來請求流量控制。 MAC 包含符合
IEEE 1588 的時間戳快照邏輯。 MAC 數據包發送時序參考圖 42-10。
- MAC 數據包接收
MAC 接收到的數據包填充 RX FIFO,達到 FIFO 設定閾值后請求 DMA 傳輸。在默認直通模式下,當 FIFO 接收到 64 個字節(使用 ETH_DMAOMR 寄存器中的 RTC 位配置)或完整的數據包時,數據將彈出,其可用性將通知給 DMA。 DMA 向 AHB 接口發起傳輸后,數據傳輸將從 FIFO 持續進行,直到傳輸完整個數據包。完成 EOF 幀的傳輸后,狀態字將彈出並發送到 DMA 控制器。在 Rx FIFO 存儲轉發模式(通過 ETH_DMAOMR 寄存器中的RSF 位配置)下,僅在幀完全寫入 Rx FIFO 后才可讀出幀。
當 MAC 在 MII 上檢測到 SFD 時,將啟動接收操作。 MAC 內核將去除報頭和 SFD,然后再繼續處理幀。檢查報頭字段以進行過濾, FCS 字段用於驗證幀的 CRC 如果幀未通過地址濾波器,則在內核中丟棄該幀。 MAC 數據包接收時序參考圖 42-11。
MAC過濾
MAC 過濾功能可以選擇性的過濾設定目標地址或源地址的 MAC 幀。它將檢查所有接收到的數據幀的目標地址和源地址,根據過濾選擇設定情況,檢測后報告過濾狀態。針對目標地址過濾可以有三種,分別是單播、多播和廣播目標地址過濾;針對源地址過濾就只有單播源地址過濾。
單播目標地址過濾是將接收的相應 DA 字段與預設的以太網 MAC 地址寄存器內容比較,最高可預設 4 個過濾 MAC 地址。多播目標地址過濾是根據幀過濾寄存器中的 HM 位執行對多播地址的過濾,是對 MAC 地址寄存器進行比較來實現的。單播和多播目標地址過濾都還支持 Hash 過濾模式。廣播目標地址過濾通過將幀過濾寄存器的 BFD 位置 1 使能,這使得 MAC 丟棄所有廣播幀。
單播源地址過濾是將接收的 SA 字段與 SA 寄存器內容進行比較過濾。
MAC 過濾還具備反向過濾操作功能,即讓過濾結構求補集。
PHY:LAN8720
LAN8720A 是 SMSC 公司(已被 Microchip 公司收購)設計的一個體積小、功耗低、全能型 10/100Mbps 的以太網物理層收發器。它是針對消費類電子和企業應用而設計的。LAN8720A 總共只有 24Pin,僅支持 RMII 接口。由它組成的網絡結構見圖 42-12。
LAN8720A 通過 RMII 與 MAC 連接。 RJ45 是網絡插座,在與 LAN8720A 連接之間還需要一個變壓器,所以一般使用帶電壓轉換和 LED 指示燈的 HY911105A 型號的插座。一般來說,必須為使用 RMII 接口的 PHY 提供 50MHz 的時鍾源輸入到 REF_CLK 引腳,不過LAN8720A 內部集成 PLL,可以將 25MHz 的時鍾源陪頻到 50MHz 並在指定引腳輸出該時鍾,所以我們可以直接使其與 REF_CLK 連接達到提供 50MHz 時鍾的效果。
LAN8720A 內部系統結構見圖 42-13。
LAN8720A 有各個不同功能模塊組成,最重要的要數接收控制器和發送控制器,其它的基本上都是與外部引腳掛鈎,實現信號傳輸。部分引腳是具有雙重功能的,比如PHYAD0 與 RXER 引腳是共用的,在系統上電后 LAN8720A 會馬上讀取這部分共用引腳的電平,以確定系統的狀態並保存在相關寄存器內,之后則自動轉入作為另一功能引腳。
PHYAD[0]引腳用於配置 SMI 通信的 LAN8720A 地址,在芯片內部該引腳已經自帶下拉電阻,默認認為 0(即使外部懸空不接),在系統上電時會檢測該引腳獲取得到 LAN8720A的地址為 0 或者 1,並保存在特殊模式寄存器(R18)的 PHYAD 位中,該寄存器的 PHYAD有 5 個位,在需要超過 2 個 LAN8720A 時可以通過軟件設置不同 SMI 通信地址。PHYAD[0]是與 RXER 引腳共用。
MODE[2:0]引腳用於選擇 LAN8720A 網絡通信速率和工作模式,可選 10Mbps 或100Mbps 通信速度,半雙工或全雙工工作模式,另外 LAN8720A 支持 HP Auto-MDIX 自動翻轉功能,即可自動識別直連或交叉網線並自適應。一般將 MODE 引腳都設置為 1,可以讓 LAN8720A 啟動自適應功能,它會自動尋找最優工作方式。 MODE[0]與 RXD0 引腳共用、MODE[1]與 RXD1 引腳共用、 MODE[2]與 CRS_DV 引腳共用。
nINT/REFCLKO 引腳用於 RMII 接口中 REF_CLK 信號線,當 nINTSEL 引腳為低電平時,它也可以被設置成 50MHz 時鍾輸出,這樣可以直接與 STM32F42x 的 REF_CLK 引腳連接為其提供 50MHz 時鍾源,這種模式要求為 XTAL1 與 XTAL2 之間或為 XTAL1/CLKIN提供 25MHz 時鍾,由 LAN8720A 內部 PLL 電路陪頻得到 50MHz 時鍾,此時nIN/REFCLKO 引腳的中斷功能不可用,用於 50MHz 時鍾輸出。當 nINTSEL 引腳為高電平時, LAN8720A 被設置為時鍾輸入,即外部時鍾源直接提供 50MHz 時鍾接入 STM32F42x的 REF_CLK 引腳和 LAN8720A 的 XTAL1/CLKIN 引腳,此時 nINT/REFCLKO 可用於中斷功能。 nINTSEL 與 LED2 引腳共用,一般使用下拉
REGOFF 引腳用於配置內部+1.2V 電壓源, LAN8720A 內部需要+1.2V 電壓,可以通過VDDCR 引腳輸入+1.2V 電壓提供,也可以直接利用 LAN8720A 內部+1.2V 穩壓器提供。當REGOFF 引腳為低電平時選擇內部+1.2V 穩壓器。 REGOFF 與 LED1 引腳共用。
SMI 支持尋址 32 個寄存器, LAN8720A 只用到其中 14 個,參考表 42-3。
序號與 SMI 數據幀中的 RADDR 是對應的,這在編寫驅動時非常重要,本文將它們標記為 R0~R31。寄存器可規划為三個組: Basic、 Extended 和 Vendor-specific。 Basic 是 IEEE802.3 要求的, R0 是基本控制寄存器,其位 15 為 Soft Reset 位,向該位寫 1 啟動LAN8720A 軟件復位,還包括速度、自適應、低功耗等等功能設置。 R1 是基本狀態
寄存器。Extended 是擴展寄存器,包括 LAN8720A 的 ID 號、制造商、版本號等等信息。 Vendorspecific 是供應商自定義寄存器, R31 是特殊控制/狀態寄存器,指示速度類型和自適應功能。
LwIP:輕型TCP/IP協議棧
LwIP 是 Light Weight Internet Protocol 的縮寫,是由瑞士計算機科學院 Adam Dunkels等開發的適用於嵌入式領域的開源輕量級 TCP/IP 協議棧。它可以移植到含有操作系統的平台中,也可以在無操作系統的平台下運行。由於它開源、占用的 RAM 和 ROM 比較少、支持較為完整的 TCP/IP 協議、且十分便於裁剪、調試,被廣泛應用在中低端的 32 位控制器平台。可以訪問網站: http://savannah.nongnu.org/projects/lwip/ 獲取更多 LwIP 信息。
目前, LwIP 最新更新到 1.4.1 版本,我們在上述網站可找到相應的 LwIP 源碼下載通道。我們下載兩個壓縮包: lwip-1.4.1.zip 和 contrib-1.4.1.zip, lwip-1.4.1.zip 包括了 LwIP 的實現代碼, contrib-1.4.1.zip 包含了不同平台移植 LwIP 的驅動代碼和使用 LwIP 實現的一些應用實例測試。
以太網通信實驗:無操作系統Lwip移植
參考引用:
- 野火---《零死角玩轉STM32-F429挑戰者》
- 《STM32F4xx中文參考手冊》
- 《Cortex-M4內核編程手冊》