用uIP堆棧實現MAXQ微控制器聯網
摘要:本應用筆記描述了如何用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方式授權。完整的源代碼可從http://www.sics.se/~adam/uip/index.php/Main_Page下載。
當然,對于大多數應用,沒有必要完全運行TCP/IP,過于浪費。uIP具有一整套功能,符合全功能主機的最低需求,并且可以避免其它簡單IP堆棧存在的"特殊情況"。
編譯環境
Rowley CrossWorks 1.1 build 1 C編譯器用于編譯、匯編和鏈接項目。為方便調試,所有代碼優化功能均被禁用。最終代碼僅占用MAXQ2000程序閃存存儲器的一小部分。
MAXQ2000有2kB的數據存儲器。使用這種數據存儲器時必須謹慎,因為緩沖器必須用來處理IP數據包的內容。為了最大限度地利用數據存儲器,所有常數都存儲在代碼空間內,并根據需要復制到一個固定大小的RMA緩存區。
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()和and uip_rexmit()。前四個函數管理輸入連接的打開和關閉;后兩個函數管理數據的輸入和輸出。
當新數據到達套接字等待應用程序處理時,uip_newdata()將返回一個非零的結果。然后應用程序進行數據處理,這些數據保存在uip_appdata指向的緩沖區中,也可以返回響應。所有數據,包括以太網鏈路層和IP頭儲存在uip_appdata。
如果網絡丟掉返回至peer的數據的任何部分,應用將通過計時器超時調用應用程序回調功能并且uip_rexmit()返回一個非零的結果。
在這個點上uIP與其他IP堆棧不同。通常情況下,TCP數據包的轉發由IP協議棧處理。當uip_rexmit()標記出現時uIP需要應用程序轉發丟失的數據,可以節省存儲空間。轉發可以通過重新生成數據來實現,或將先前產生的數據保存在緩沖區以供轉發。
MAC/PHY驅動器
發送和接收以太網IP數據包時,必須向uIP提供MAC/PHY驅動程序代碼。API相當簡單:驅動器必須發出信號表明輸入以太網的幀準備就緒等待處理; 在線接收和傳送數據包時必須調用函數。這些調用由macphy.c實現,從主事件循環調用。
本文中我們選擇了Microchip ENC28J60 SPI-Ethernet芯片。該集成MAC/PHY通過SPI和8kB的數據緩沖存儲器訪問。圖1為MAXQ2000和ENC28J60的連接電路。
圖1. MAXQ2000微控制器和SPI至以太網轉換之間的電路連接原理圖
實施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_init()進行uIP堆棧初始化,同時設置在編譯默認IP地址、網絡掩碼、網關設置。
當輸入連接完成后,向peer打印問候語。客戶端發送的文字以"回聲"的形式被送回,除了那些已經逐字母轉換過的字。
單片機系統具有充足的資源執行系統的主要功能。例如,在高爾夫球場灑水系統中,可以用中斷系統提供的實時時鐘在適當的時間打開和關閉噴灑閥門。
由于TCP/IP可以無縫處理超時和轉發,因此網絡接口無實時限制。因超時而導致連接被刪除之前,TCP連接通常會花費數分鐘至數小時,因此,微控制器代碼可以管理網絡連接將其作為后臺任務。
結論
用免費uIP堆棧很容易實現MAXQ2000聯網。uIP本身的事件驅動性質使其適合單片機系統的遠程監控和控制。
本應用筆記描述了一個簡單的應用程序執行過程,該程序可以擴展以創建更復雜的系統。示例應用程序的源代碼包括MAC/PHY驅動程序,可點擊下載(ZIP, 112 kB)。
1-Wire是Maxim Integrated Products, Inc.的注冊商標。
MAXQ是Maxim Integrated Products, Inc.的注冊商標。
SPI是Motorola, Inc.的商標。
評論
查看更多