本應用筆記介紹如何使用uIP TCP/IP網絡堆棧將MAXQ?微控制器聯網。常用的SPI?轉以太網IC用作此應用的MAC/PHY。MAXQ2000作為微控制器示例。
介紹
系統的遠程監測和控制可能是任何微控制器應用中最有價值的功能之一。想象一下,一個高爾夫球場的大型草坪噴水滅火系統,其中系統應向主計算機報告故障。這樣的系統幾乎消除了人工觀察系統正常運行的需要。
許多通信方法,如RS-232串行或紅外,可用于實現該系統內遠程設備的控制和監控。但是,所有這些方法都綁定到涉及不兼容傳輸介質和協議的特定接口,并且距離有限。
以太網互聯網協議 (IP)
互聯網協議為上述挑戰提供了解決方案。所有現代操作系統都實現了 IP 堆棧。雖然IP可以在各種傳輸介質上運行,但以太網是迄今為止最普遍的。此外,由于采用交換和路由網絡拓撲結構,以太網不受距離限制。
隨著帶有板載緩沖器的先進MAC/PHY集成電路的出現,我們可以使用微控制器和以太網IP來控制和收集來自幾乎任何遠程系統的數據。在本應用筆記中,我們將演示如何使用免費的uIP堆棧和SPI轉以太網IC將MAXQ2000微控制器聯網。
uIP 簡介
uIP(發音為“micro IP”)提供了一個最小的IP堆棧,其中包括TCP,UDP和ICMP協議。uIP由Adam Dunkels開發,并在BSD風格的許可證下發布。
當然,對于大多數應用程序來說,完全實現 TCP/IP 既沒有必要,也不是謹慎的。uIP 提供了一組功能,可滿足全功能主機的最低要求,并且不需要像其他一些輕量級 IP 堆棧那樣的“特殊情況”例外。
編譯器環境
用于C的Rowley CrossWorks 1.1 build 1編譯器用于編譯,匯編和鏈接該項目。為了便于調試,禁用了所有代碼優化功能。最終代碼大小僅為MAXQ2000可用程序閃存的一小部分。
MAXQ2000具有2kB的可用數據存儲器。我們必須明智地使用此數據存儲器,因為必須為處理IP數據包內容分配緩沖區。為了優化數據存儲器的使用,所有常量字符串都存儲在代碼空間中,并根據需要復制到固定大小的RAM緩沖區。
使用 uIP 堆棧
uIP 堆棧可以看作是一個事件循環,其超時基于特定于體系結構的時鐘代碼。在主循環中,MAC/PHY 接收的任何數據包都將由 uip_arp_ipin() 和 uip_input() 處理。這些調用可能會生成輸出數據包,該數據包必須由 MAC/PHY 驅動程序代碼傳輸。
然后檢查計時器以清理一段時間未看到的已關閉連接和 ARP 表條目,并調用應用程序回調以進行重新傳輸。主事件循環是樣板代碼,對于大多數應用程序不需要更改。
請務必注意,uIP 實現的 TCP 窗口大小非常小,因此一次只有一個未完成(未確認)數據包可供處理,并可能重新傳輸。
真正的應用程序處理發生在為UIP_APPCALL定義的函數中。調用時,應用程序回調可能會檢查返回 uIP 當前狀態的多個函數。這些狀態中最重要的是:uip_connected()、uip_closed()、uip_aborted()、uip_timedout()、uip_newdata()和uip_rexmit()。前四個函數管理傳入連接的打開和關閉;后兩個函數處理傳入和傳出數據。
當新數據到達套接字供應用程序處理時,uip_newdata() 將返回非零結果。然后,應用程序應處理數據(這些數據保存在 uip_appdata 指向的緩沖區中),并選擇性地返回響應。所有數據(包括以太網鏈路層和 IP 報頭)都存儲在uip_appdata中。
如果網絡丟棄返回給對等方的任何部分數據,則應用程序回調將通過計時器超時調用,uip_rexmit() 將返回非零結果。
正是在這一點上,uIP 與其他 IP 堆棧不同。通常,TCP 數據包重新傳輸由 IP 堆棧處理。uIP 通過要求應用程序在顯示 uip_rexmit() 標志時重新傳輸丟失的數據來節省內存。這種重新傳輸可以通過重新生成數據來完成,或者通過將先前生成的數據保存在緩沖區中以進行重新傳輸來實現。
MAC/PHY 驅動程序
要通過以太網傳輸和接收 IP 數據報,我們必須向 uIP 提供 MAC/PHY 驅動程序代碼。API 相當簡單:驅動程序必須發出信號,表明傳入的以太網幀已準備好進行處理;必須有調用才能接收數據包并在網絡上傳輸數據包。這些調用在 macphy.c 中實現,并從主事件循環調用。
對于此應用,我們選擇了Microchip ENC28J60 SPI轉以太網芯片。此集成 MAC/PHY 可通過 SPI 訪問,并具有 8kB 的數據包緩沖存儲器。圖1所示為MAXQ2000與ENC28J60之間的連接。
圖1.原理圖示出了MAXQ2000微控制器與SPI轉以太網IC之間的連接。
當前實現的 uIP 堆棧假定整個 IP 數據報駐留在內存中。MAXQ2000具有2kB的數據RAM,可能需要用于其他任務,因此將數據包從以太網復制到1500字節的MTU是不明智的。相反,我們使用最大段大小的 TCP 功能來指定我們不接受超過 500 字節的段,包括以太網鏈路層和 IP 標頭。此段大小為大多數應用程序提供了足夠的吞吐量。此外,我們指示 MAC/PHY 以靜默方式丟棄任何超過 500 字節的數據包。
此項目的示例源代碼包括文件 macphy.c 中的 MAC/PHY 驅動程序代碼以及關聯的包含文件 macphy.h 和 macphy_priv.h。
示例應用程序
我們的示例應用程序實現了在 TCP 端口 23 上偵聽的修改后的回顯服務器。首先,啟動MAXQ2000的實時時鐘(RTC)進行事件定時。然后,我們初始化 SPI 硬件并使用默認設置加載 MAC/PHY。
然后,應用從PCB上的1-Wire? DS2502-E48中檢索唯一的以太網硬件地址。必須將此硬件地址通知 MAC/PHY 驅動程序和 uIP 堆棧。進行兩次調用 macphy_init() 和 uip_setethaddr() 來設置此信息。
uIP 堆棧通過調用 uip_init() 進行初始化,并設置編譯的默認 IP 地址、網絡掩碼和網關。
傳入連接完成后,將向對等方打印問候語。客戶端發送的任何文本都以“回顯”方式發回,除了所有單詞都是逐個字母顛倒的。
仍然有充足的計算資源來執行微控制器系統的主要功能。在我們的高爾夫球場灑水器示例中,我們可以使用 RTC 上可用的中斷系統在適當的時間打開和關閉噴水滅火閥。
網絡接口沒有實時限制,因為 TCP/IP 可以無縫處理超時和重新傳輸。TCP 連接通常需要幾分鐘到幾小時才能因超時而斷開連接。因此,微控制器代碼可以將網絡連接作為后臺任務進行管理。
結論
MAXQ2000的聯網使用免費的uIP堆棧很容易實現。uIP的事件驅動特性有助于遠程監視和控制微控制器系統。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7552瀏覽量
151423 -
以太網
+關注
關注
40文章
5425瀏覽量
171721 -
計算機
+關注
關注
19文章
7494瀏覽量
87953
發布評論請先 登錄
相關推薦
評論