UIP協(xié)議在單片機(jī)上的移植與實(shí)現(xiàn)_第1頁
UIP協(xié)議在單片機(jī)上的移植與實(shí)現(xiàn)_第2頁
UIP協(xié)議在單片機(jī)上的移植與實(shí)現(xiàn)_第3頁
UIP協(xié)議在單片機(jī)上的移植與實(shí)現(xiàn)_第4頁
UIP協(xié)議在單片機(jī)上的移植與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 本科生畢業(yè)設(shè)計(jì) UIP協(xié)議在單片機(jī)上的移植與實(shí)現(xiàn)院 系電氣信息工程學(xué)院 專 業(yè)電氣工程及其自動(dòng)化 班 級(jí) 學(xué) 號(hào) 學(xué) 生 姓 名 聯(lián) 系 方 式指 導(dǎo) 教 師趙忠彪職稱: 講師 2011 年 5 月獨(dú) 創(chuàng) 性 聲 明本人鄭重聲明:所呈交的畢業(yè)論文(設(shè)計(jì))是本人在指導(dǎo)老師指導(dǎo)下取得的研究成果。除了文中特別加以注釋和致謝的地方外,論文(設(shè)計(jì))中不包含其他人已經(jīng)發(fā)表或撰寫的研究成果。與本研究成果相關(guān)的所有人所做出的任何貢獻(xiàn)均已在論文(設(shè)計(jì))中作了明確的說明并表示了謝意。簽名: 年月日授 權(quán) 聲 明本人完全了解許昌學(xué)院有關(guān)保留、使用本科生畢業(yè)論文(設(shè)計(jì))的規(guī)定,即:有權(quán)保留

2、并向國家有關(guān)部門或機(jī)構(gòu)送交畢業(yè)論文(設(shè)計(jì))的復(fù)印件和磁盤,允許畢業(yè)論文(設(shè)計(jì))被查閱和借閱。本人授權(quán)許昌學(xué)院可以將畢業(yè)論文(設(shè)計(jì))的全部或部分內(nèi)容編入有關(guān)數(shù)據(jù)庫進(jìn)行檢索,可以采用影印、縮印或掃描等復(fù)制手段保存、匯編論文(設(shè)計(jì))。本人論文(設(shè)計(jì))中有原創(chuàng)性數(shù)據(jù)需要保密的部分為(如沒有,請(qǐng)?zhí)顚憽盁o”):無。簽名: 年月日指導(dǎo)教師簽名: 年月日 摘 要本文針對(duì)單片機(jī)在嵌入式系統(tǒng)中資源和處理能力有限這一問題,提出了精簡(jiǎn)的嵌入式協(xié)議棧uIP協(xié)議,并以ENC28J60芯片為例,采用c語言編程,經(jīng)過一些測(cè)試,最終實(shí)現(xiàn)了uIP協(xié)議在單片機(jī)上的移植。 關(guān)鍵詞:嵌入式系統(tǒng),uIP協(xié)議,移植ABSTRACTThis

3、 paper proposes streamlined an embedded protocolthe uIP agreement ,as the SCM is limited at resources and processing power in the embedded system. Taking the ENC28J60 chips for example ,the design achieved the transplant using the c language after some tests finally.Key words:embedded system,uIP agr

4、eement, transplant目 錄1 概述11.1 研究背景11.2 研究意義11.3 研究思路12 UIP協(xié)議在單片機(jī)上的移植過程22.1 UIP特性22.2 UIP 架構(gòu)22.3 UIP 在MCS-51單片機(jī)上的移植3 3 UIP協(xié)議在單片機(jī)上的實(shí)現(xiàn)53.1 UIP協(xié)議關(guān)鍵庫函數(shù)的功能及使用方法53.1.1 接收數(shù)據(jù)63.1.2 發(fā)送數(shù)據(jù)63.1.3 重發(fā)數(shù)據(jù)73.1.4 關(guān)閉連接73.1.5 報(bào)告錯(cuò)誤73.1.6 輪詢73.1.7 監(jiān)聽端口73.1.8 打開連接73.1.9 數(shù)據(jù)流控制83.1.10 UIP函數(shù)總結(jié)83.2 重點(diǎn)代碼分析103.2.1 UIP/設(shè)備驅(qū)動(dòng)接口103.

5、2.2 UIP/周期計(jì)時(shí)接口103.2.3 UIP協(xié)議棧提供的主要接口103.3 以太網(wǎng)的芯片ENC28J60介紹及編程113.3.1 ENC28J60介紹113.3.2 ENC28J60與單片機(jī)的連接13設(shè) 計(jì) 總 結(jié)16參 考 文 獻(xiàn)17附 錄181.ENC28J60與單片機(jī)的外部連接圖182.重點(diǎn)函數(shù)程序20致 謝32 1 概述1.1 研究背景近些年來,人們對(duì)把各種裝置連接到一個(gè)現(xiàn)有的IP網(wǎng)絡(luò)比如因特網(wǎng)上產(chǎn)生了濃厚的興趣。為了能通過因特網(wǎng)通訊,一個(gè)可實(shí)現(xiàn)的TCP/IP協(xié)議棧是很必要的。對(duì)于由32位嵌入式處理器構(gòu)建的中、高端網(wǎng)絡(luò)接入嵌入式系統(tǒng),一般會(huì)運(yùn)行一個(gè)集成有TCP/IP協(xié)議棧的操作系

6、統(tǒng)。但是對(duì)于由8位和16位低端處理器構(gòu)建的系統(tǒng),因?yàn)樗哂械奶幚砟芰唾Y源十分有限,通常不運(yùn)行操作系統(tǒng),這就要求系統(tǒng)開發(fā)者根據(jù)應(yīng)用的要求和所選用的處理器的實(shí)際情況構(gòu)建自己的TCP/IP協(xié)議棧,而TCP/IP協(xié)議的透明性掩蓋了它實(shí)現(xiàn)的復(fù)雜性,從無到有構(gòu)建一個(gè)協(xié)議棧是一件艱巨的任務(wù),并且缺少有效的調(diào)試工具。uIP TCP/IP協(xié)議棧是應(yīng)用于低端8位或16位微處理器構(gòu)建的嵌入式系統(tǒng)的一個(gè)可實(shí)現(xiàn)的極小的TCP/IP協(xié)議棧,它可以用于商業(yè)和非商業(yè)目的。為了方便于移植uIP使用C語言編寫,而且uIP協(xié)議棧的代碼大小和RAM的需求比其它一般的TCP/IP棧要小,這就使得它可以方便的應(yīng)用于各種低端系統(tǒng)上。本

7、文將簡(jiǎn)要描述uIP的實(shí)現(xiàn)方法,分析uIP協(xié)議棧的應(yīng)用接口,并討論如何將其應(yīng)用到51系列單片機(jī)上。1.2 研究意義單片機(jī)在嵌入式領(lǐng)域中屬于很低端的處理器,它的資源和處理能力有限。首先,它的數(shù)據(jù)存儲(chǔ)空間RAM和程序存儲(chǔ)空間ROM都不能超過64K;其次,它的CPU頻率通常在12M40M之間,指令的執(zhí)行速度相對(duì)較慢,導(dǎo)致網(wǎng)絡(luò)傳輸速度很難上去。據(jù)計(jì)算,12M 的51 單片機(jī)的最快網(wǎng)絡(luò)傳送速度大概是25KB/s。這些特點(diǎn)導(dǎo)致在單片機(jī)上不可能運(yùn)行大而全的 TCP/IP 協(xié)議棧,需要使用精簡(jiǎn)的嵌入式協(xié)議棧。雖然通訊流量和處理速度不允許很大,但對(duì)于一般的樓宇、工業(yè)、家居智能化等領(lǐng)域也足夠應(yīng)付。更重要的是,它的成

8、本很低,具有很高的經(jīng)濟(jì)價(jià)值??紤]到這些原因,uIP 協(xié)議棧是一個(gè)不錯(cuò)的選擇。因此本文以基于單片機(jī)控制的硬件和uIP 協(xié)議棧介紹單片機(jī)TCP/IP 網(wǎng)絡(luò)編程與應(yīng)用。1.3 研究思路本文將簡(jiǎn)要描述uIP協(xié)議的實(shí)現(xiàn)方法,分析其在單片機(jī)上的移植過程,研究其關(guān)鍵庫函數(shù)的功能及其使用方法,并討論如何將其應(yīng)用到51系列單片機(jī)上。2 UIP協(xié)議在單片機(jī)上的移植過程2.1 UIP特性u(píng)IP 協(xié)議棧去掉了完整的TCP/IP系統(tǒng)中不常用的功能,簡(jiǎn)化了通訊流程,只保留了網(wǎng)絡(luò)通信必須使用的協(xié)議,設(shè)計(jì)重點(diǎn)放在了IP/TCP/ICMP/UDP/ARP這些網(wǎng)絡(luò)層和傳輸層的協(xié)議上,因此保證了其代碼的通用性和結(jié)構(gòu)的穩(wěn)定性。由于u

9、IP協(xié)議棧專門為嵌入式系統(tǒng)而設(shè)計(jì),因此還具有以下優(yōu)越功能:(1)代碼非常少,其協(xié)議棧代碼不到6K,方便閱讀與移植。(2)占用的內(nèi)存數(shù)極少,RAM占用僅幾百字節(jié)。(3)它的硬件處理層、協(xié)議棧層和應(yīng)用層共用一個(gè)全局緩存區(qū),不存在數(shù)據(jù)拷貝,而且發(fā)送和接收都是依靠這個(gè)緩存區(qū),極大的節(jié)省了空間和時(shí)間。(4)支持多個(gè)主動(dòng)連接和被動(dòng)連接并發(fā)。(5)它的源代碼中提供一套實(shí)例程序:web 客戶端,web 服務(wù)器,Telnet 服務(wù)器,電子郵件發(fā)送程序(SMTP 客戶端), DNS 主機(jī)名解析程序等。通用性強(qiáng),移植起來基本不用修改就可通過。(6)在數(shù)據(jù)的處理上采用輪循機(jī)制,不需要操作系統(tǒng)的支持。由于 uIP 對(duì)資

10、源的需求少而且移植容易,大部分的8位微控制器都使用過uIP協(xié)議棧, 而且很多著名的嵌入式產(chǎn)品和項(xiàng)目(如衛(wèi)星,Cisco 路由器,無線傳感器網(wǎng)絡(luò))中均在使用uIP 協(xié)議棧。2.2 UIP 架構(gòu)uIP相當(dāng)于一個(gè)代碼庫,通過一系列的函數(shù)實(shí)現(xiàn)與底層硬件和高層應(yīng)用程序之間的通訊,對(duì)于整個(gè)系統(tǒng)來說它內(nèi)部的協(xié)議組是透明的,從而增加了協(xié)議的通用性。uIP協(xié)議棧與系統(tǒng)底層和高層應(yīng)用之間的關(guān)系如圖(一)所示:UIP_PERIODIC() UIPINPUT()UIP_APPCALL()應(yīng)用程序UIP協(xié)議棧系統(tǒng)底層網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)系統(tǒng)定時(shí)器 圖(一) uIP在系統(tǒng)中的位置uIP 協(xié)議棧主要提供了三個(gè)函數(shù)供系統(tǒng)底層調(diào)用。即

11、uip_init(), uip_input()和uip_periodic()。其與應(yīng)用程序的主要接口是UIP_APPCALL( )。uip_init()是系統(tǒng)初始化時(shí)調(diào)用的,主要用于初始化協(xié)議棧的偵聽端口和默認(rèn)所有連接是關(guān)閉的。當(dāng)網(wǎng)卡驅(qū)動(dòng)收到一個(gè)輸入包時(shí),將其放入全局緩沖區(qū) uip_buf 中,包的大小由全局變量uip_len 約束。同時(shí)將調(diào)用uip_input()函數(shù),這個(gè)函數(shù)將會(huì)根據(jù)包首部的協(xié)議處理這個(gè)包并在需要時(shí)調(diào)用應(yīng)用程序。當(dāng)uip_input()返回時(shí),一個(gè)輸出包同樣放在全局緩沖區(qū)uip_buf 里,并把大小賦給uip_len。若uip_len 是0,則說明沒有包要發(fā)送;否則調(diào)用底層

12、系統(tǒng)的發(fā)包函數(shù)就會(huì)將包發(fā)送到網(wǎng)絡(luò)上。uIP周期計(jì)時(shí)用于驅(qū)動(dòng)所有的uIP內(nèi)部時(shí)鐘事件:當(dāng)周期計(jì)時(shí)激發(fā),每一個(gè)TCP連接都會(huì)調(diào)用uIP函數(shù)uip_periodic()。類似于uip_input()函數(shù),uip_periodic()函數(shù)返回時(shí),輸出的IP 包要放到uip_buf 中,供底層系統(tǒng)查詢uip_len 的大小并發(fā)送。由于TCP/IP 的應(yīng)用場(chǎng)景很多,所以應(yīng)用程序作為單獨(dú)的模塊由用戶實(shí)現(xiàn)。uIP 協(xié)議棧提供一系列接口函數(shù)供用戶程序調(diào)用,其中大部分函數(shù)是作為C的宏命令實(shí)現(xiàn)的,主要是為了速度、代碼大小、堆棧和效率的使用。用戶需要將應(yīng)用層入口程序作為接口提供給uIP協(xié)議棧,并將這個(gè)函數(shù)定義為UIP

13、_APPCALL()。這樣以來,uIP 在接受到底層傳來的數(shù)據(jù)包后,在需要送到上層應(yīng)用程序處理的地方,調(diào)用UIP_APPCALL( ),在不用修改協(xié)議棧的情況下可以適配不同的應(yīng)用程序。2.3 UIP 在MCS-51單片機(jī)上的移植1為此項(xiàng)目建立一個(gè)keil C 工程,建立src 目錄存放源文件。2通過閱讀uip-1.0unixmain.c,了解uIP 的的主循環(huán)代碼架構(gòu),并將main.c放到src 目錄下。3仿照uip-1.0unixtapdev.c 寫網(wǎng)卡驅(qū)動(dòng)程序,與具體硬件相關(guān)。這一步比較費(fèi)點(diǎn)時(shí)間,不過好在大部分網(wǎng)卡芯片的驅(qū)動(dòng)程序都有代碼借鑒或移植。驅(qū)動(dòng)需要提供三個(gè)函數(shù)。etherdev_i

14、nit():網(wǎng)卡初始化函數(shù),初始化網(wǎng)卡的工作模式。u16_t etherdev_read(void):讀包函數(shù)。將網(wǎng)卡收到的數(shù)據(jù)放入全局緩存區(qū)uip_buf 中,返回包的長(zhǎng)度,賦給uip_len。void etherdev_send(void):發(fā)包函數(shù)。將全局緩存區(qū)uip_buf 里的數(shù)據(jù)(長(zhǎng)度放在uip_len 中)發(fā)送出去。因此,收包和發(fā)包主要是操作uip_buf 和uip_len。4因?yàn)閡IP 協(xié)議棧需要使用時(shí)鐘,為TCP 和ARP 的定時(shí)器服務(wù),所以使用單片機(jī)的定時(shí)器0 用作時(shí)鐘,每20ms 讓計(jì)數(shù)tick_cnt 加1,這樣,25 次計(jì)數(shù)(0.5S)滿了后可以調(diào)用TCP 的定時(shí)處理

15、程序,10S 后可以調(diào)用ARP 老化程序。對(duì)uIP1.0 版本,增加了timer.c/timer.h,專門用來管理時(shí)鐘,都放到src 下。5uIP 協(xié)議棧的主要內(nèi)容在uip-1.0uip下的uip.c/uip.h 中,放到src 下。如果需要ARP 協(xié)議,需要將uip_arp.c 和uip_arp.h 也放到src 下。6uipopt.h/uip-conf.h 是配置文件,用來設(shè)置本地的IP 地址、網(wǎng)關(guān)地址、MAC 地址、全局緩沖區(qū)的大小、支持的最大連接數(shù)、偵聽數(shù)、ARP 表大小等。需要放在src 下,并且根據(jù)需要配置。在V1.00 版本中對(duì)配置做了如下修改:(1)配置IP 地址,默認(rèn)先關(guān)IP

16、,在初始化中再設(shè)定。#define UIP_FIXEDADDR 0#define UIP_IPADDR0 192#define UIP_IPADDR1 168#define UIP_IPADDR2 1#define UIP_IPADDR3 9#define UIP_NETMASK0 255#define UIP_NETMASK1 255#define UIP_NETMASK2 255#define UIP_NETMASK3 0#define UIP_DRIPADDR0 192#define UIP_DRIPADDR1 168#define UIP_DRIPADDR2 1#define UIP_

17、DRIPADDR3 1(2)設(shè)置MAC 地址#define UIP_FIXEDETHADDR 1#define UIP_ETHADDR0 0x00#define UIP_ETHADDR1 0x4f#define UIP_ETHADDR2 0x49#define UIP_ETHADDR3 0x12#define UIP_ETHADDR4 0x12#define UIP_ETHADDR5 0x13(3)ping 功能#define UIP_PINGADDRCONF 1(4)關(guān)閉主動(dòng)請(qǐng)求連接的功能#define UIP_ACTIVE_OPEN 0(5)將uip_tcp_appstate_t 定位u8

18、_t 類型。(6)由于單片機(jī)是大端結(jié)構(gòu),因此宏定義需要修改#define UIP_CONF_BYTE_ORDER UIP_BIG_ENDIAN(7)暫時(shí)不移植打印信息,先關(guān)閉#define UIP_CONF_LOGGING 0(8)定義數(shù)據(jù)結(jié)構(gòu)類型typedef unsigned char u8_t;typedef unsigned int u16_t;typedef unsigned long u32_t;7若使用 keil C 的小模式編譯,則需要在大部分的RAM 的變量前增加xdata。8data為keil C 的關(guān)鍵詞,代碼中所有出現(xiàn)data 的地方(主要是參數(shù)、局部變量、結(jié)構(gòu)體成員)

19、改為pucdata或ucdata。9解決編譯過程中的錯(cuò)誤。由于uIP 協(xié)議棧是用C 語言編寫,所以編譯過程中的問題比較少,并且容易解決。3 UIP協(xié)議在單片機(jī)上的實(shí)現(xiàn)3.1 UIP協(xié)議關(guān)鍵庫函數(shù)的功能及使用方法應(yīng)用程序必須作為C函數(shù)去實(shí)現(xiàn),uIP在任何一個(gè)事件發(fā)生時(shí)調(diào)用UIP_APPCALL()。表 1 列出了可能的事件和每個(gè)事件的對(duì)應(yīng)測(cè)試函數(shù),測(cè)試函數(shù)用于區(qū)別不同的事件。函數(shù)是作為C宏命令實(shí)現(xiàn)的,將會(huì)是零或非零值。注意,某些函數(shù)可以在互相連接時(shí)發(fā)生(即新數(shù)據(jù)可以在數(shù)據(jù)確應(yīng)的同時(shí)到達(dá))。表 1 uIP應(yīng)用事件和對(duì)應(yīng)的測(cè)試參數(shù)一個(gè)數(shù)據(jù)包到達(dá),確定先前發(fā)送到數(shù)據(jù)uip_acked()應(yīng)用程序的新數(shù)

20、據(jù)包已到達(dá)uip_newdata()一個(gè)遠(yuǎn)程主機(jī)連接到監(jiān)聽端口uip_connected()一個(gè)到達(dá)遠(yuǎn)程主機(jī)的連接建立成功uip_connected()計(jì)時(shí)時(shí)間滿重發(fā)uip_rexmit()計(jì)時(shí)時(shí)間滿周期性輪詢uip_poll()遠(yuǎn)程主機(jī)關(guān)閉連接uip_closed()遠(yuǎn)程主機(jī)中斷連接uip_aborted()由于太多重傳,連接中斷uip_timedout()當(dāng)應(yīng)用程序調(diào)用時(shí),uIP設(shè)置全局變量uip_conn去指向當(dāng)前連接的uip_conn結(jié)構(gòu),這可以用于區(qū)別不同的服務(wù)。一個(gè)典型的應(yīng)用是檢查uip_conn->lport (當(dāng)?shù)豑CP端口號(hào))去決定哪個(gè)服務(wù)連接應(yīng)該提供。例如,如果值ui

21、p_conn->lport等于80,應(yīng)用程序可以決定啟動(dòng)一個(gè)HTTP服務(wù);若值是23,則是啟動(dòng)TELNET服務(wù)。3.1.1 接收數(shù)據(jù)如果uIP測(cè)試函數(shù)uip_newdata()的值為1,則遠(yuǎn)程連接的主機(jī)有發(fā)送新數(shù)據(jù),uip_appdata指針指向?qū)嶋H數(shù)據(jù),數(shù)據(jù)的大小通過uIP函數(shù)uip_datalen()獲得。在數(shù)據(jù)不是被緩沖后,應(yīng)用程序必須立刻啟動(dòng)。3.1.2 發(fā)送數(shù)據(jù)應(yīng)用程序通過使用uIP函數(shù)uip_send()發(fā)送數(shù)據(jù)。uip_send()函數(shù)采用兩個(gè)參數(shù):一個(gè)指針指向發(fā)送數(shù)據(jù)和數(shù)據(jù)的長(zhǎng)度。如果應(yīng)用程序?yàn)榱水a(chǎn)生要發(fā)送的實(shí)際數(shù)據(jù)需要RAM空間,包緩存(通過uip_appdata指針指

22、向)可以用于這方面。在一個(gè)時(shí)間里應(yīng)用程序只能在連接中發(fā)送一塊數(shù)據(jù),所以不可以在每個(gè)應(yīng)用程序啟用中調(diào)用uip_send()超過一次,只有上一次調(diào)用的數(shù)據(jù)將會(huì)發(fā)出后才可以。注意,調(diào)用uip_send()后會(huì)改變某些全局變量,在應(yīng)用函數(shù)返回前它不能被調(diào)用。3.1.3 重發(fā)數(shù)據(jù)若數(shù)據(jù)在網(wǎng)絡(luò)中丟失,則應(yīng)用程序必須重新發(fā)數(shù)據(jù)。無論是數(shù)據(jù)收到還是沒有收到,uIP都保持跟蹤,并通知應(yīng)用程序什么時(shí)候察覺出數(shù)據(jù)丟失了。若測(cè)試函數(shù)uip_rexmit()為真,則應(yīng)用程序要重發(fā)上一次發(fā)出的數(shù)據(jù)。重發(fā)就好像原來那樣發(fā)送,也就是通過uip_send()發(fā)送。3.1.4 關(guān)閉連接應(yīng)用程序通過調(diào)用uip_close()關(guān)閉當(dāng)

23、前連接,這會(huì)導(dǎo)致連接干凈地關(guān)閉。為了指出致命的錯(cuò)誤,應(yīng)用程序可以通過中止連接和調(diào)用uip_abort()函數(shù)完成這項(xiàng)工作。若連接已經(jīng)被遠(yuǎn)端關(guān)閉,則測(cè)試函數(shù)uip_closed()為真,應(yīng)用程序接著可以做一些必要的清理工作。 3.1.5 報(bào)告錯(cuò)誤有兩個(gè)致命的錯(cuò)誤可以發(fā)生在連接中:連接由遠(yuǎn)程主機(jī)中止和連接多次重發(fā)上一數(shù)據(jù)而被中止。uIP通過調(diào)用函數(shù)報(bào)告這些問題,應(yīng)用程序使用兩個(gè)測(cè)試函數(shù)uip_aborted()和uip_timedout() 去測(cè)試這些錯(cuò)誤情況。3.1.6 輪詢當(dāng)連接空閑時(shí),uIP周期性地輪詢應(yīng)用程序,應(yīng)用程序使用測(cè)試函數(shù)uip_poll()去檢查它是否被輪詢過。3.1.7 監(jiān)聽端

24、口uIP維持一個(gè)監(jiān)聽TCP端口列表,通過uip_listen()函數(shù),一個(gè)新的監(jiān)聽端口被打開。當(dāng)一個(gè)連接請(qǐng)求在一個(gè)監(jiān)聽端口到達(dá),uIP產(chǎn)生一個(gè)新的連接。若一個(gè)新連接產(chǎn)生,則應(yīng)用程序被調(diào)用,測(cè)試函數(shù)uip_connected()為真。3.1.8 打開連接作為uIP的0.6版,在uIP里面通過使用uip_connect()函數(shù)打開一個(gè)新連接。這個(gè)函數(shù)打開一個(gè)新連接到指定的IP地址和端口,返回一個(gè)新連接的指針到uip_conn結(jié)構(gòu)。若是沒有空余的連接槽,則函數(shù)返回空值。為了方便,函數(shù)uip_ipaddr()可以用于將IP地址打包進(jìn)兩個(gè)單元16位數(shù)組里,通過uIP去代表IP地址。接下來用兩個(gè)例子說明。

25、第一個(gè)例子展示了怎樣打開一個(gè)連接去遠(yuǎn)端TCP端口8080。若沒有足夠的TCP連接插槽去允許一個(gè)新連接打開,則uip_connect()函數(shù)返回NULL并通過uip_abort()中止當(dāng)前連接。第二個(gè)例子展示怎樣打開一個(gè)新連接去指定的IP地址。例1:打開一個(gè)連接去遠(yuǎn)端TCP端口8080。void connect_example1_app(void) if(uip_connect(uip_conn->ripaddr, 8080) = NULL) uip_abort();例2:打開一個(gè)連接去當(dāng)前連接的遠(yuǎn)端的端口8080。 void connect_example2(void) u16_t ip

26、addr2;uip_ipaddr(ipaddr, 192,168,0,1);uip_connect(ipaddr, 8080);3.1.9 數(shù)據(jù)流控制uIP通過函數(shù)uip_stop()和函數(shù)uip_restart()提供對(duì)存取TCP數(shù)據(jù)流的控制途徑。假如一個(gè)應(yīng)用程序下載數(shù)據(jù)到一個(gè)慢速設(shè)備,例如磁盤驅(qū)動(dòng)器。當(dāng)磁盤驅(qū)動(dòng)器的作業(yè)隊(duì)列滿時(shí),應(yīng)用程序不會(huì)準(zhǔn)備從服務(wù)器接收更多的數(shù)據(jù),直到隊(duì)列排出空位。函數(shù)uip_stop()可以用于維護(hù)流控制和停止遠(yuǎn)程主機(jī)發(fā)送數(shù)據(jù)。當(dāng)應(yīng)用程序準(zhǔn)備好接收更多數(shù)據(jù)時(shí),可用函數(shù)uip_restart()告知遠(yuǎn)程終端再次發(fā)送數(shù)據(jù)。函數(shù)uip_stopped()可以用于檢查當(dāng)前連接

27、是否停止。3.1.10 UIP函數(shù)總結(jié)表 2 包含了所有uIP提供的函數(shù)表2 uIP 函數(shù)總結(jié)系統(tǒng)接口uip_init()uip_input()uip_periodic()初始化uIP處理輸入包處理周期計(jì)時(shí)事件應(yīng)用程序接口uip_listen()uip_connect()uip_send()uip_datalen()uip_close()uip_abort()uip_stop()uip_stopped()uip_restart()開始監(jiān)聽端口連接到遠(yuǎn)程主機(jī)在當(dāng)前連接發(fā)送數(shù)據(jù)輸入數(shù)據(jù)的大小關(guān)閉當(dāng)前連接中止當(dāng)前連接停止當(dāng)前連接查找連接是否停止重新啟動(dòng)當(dāng)前連接測(cè)試函數(shù)uip_newdata()uip

28、_acked()uip_connected()uip_closed()uip_aborted()uip_timeout()uip_rexmituip_poll()遠(yuǎn)程主機(jī)已經(jīng)發(fā)出數(shù)據(jù)確定發(fā)出的數(shù)據(jù)當(dāng)前連接剛連上當(dāng)前連接剛關(guān)閉當(dāng)前連接剛中止當(dāng)前連接剛超時(shí)數(shù)據(jù)重發(fā)應(yīng)用程序循環(huán)運(yùn)行其它uip_mss()uip_ipaddr()htons(),ntohs()獲得當(dāng)前連接的最大段的大小將IP地址結(jié)構(gòu)打包在主機(jī)和網(wǎng)絡(luò)之間轉(zhuǎn)換字節(jié)次序3.2 重點(diǎn)代碼分析從系統(tǒng)的立場(chǎng)看,uIP有3個(gè)C函數(shù),即uip_init(),uip_input()和 uip_periodic()。uip_init()函數(shù)用于初始化uIP

29、堆棧在系統(tǒng)啟動(dòng)期間的調(diào)用。當(dāng)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)器讀一個(gè)IP包到包緩存時(shí),調(diào)用函數(shù)uip_input()。周期性運(yùn)行時(shí)調(diào)用uip_periodic(),代表的是一秒一次。3.2.1 UIP/設(shè)備驅(qū)動(dòng)接口當(dāng)設(shè)備驅(qū)動(dòng)在包緩存里(uip_buf)放一個(gè)輸入包,系統(tǒng)應(yīng)該調(diào)用uip_input()函數(shù)。函數(shù)將會(huì)處理這個(gè)包并在需要時(shí)調(diào)用應(yīng)用程序。當(dāng)uip_input()返回,一個(gè)輸出包放在包緩存里,包的大小由全局變量uip_len約束。如果uip_len是0,則沒有包要發(fā)送。3.2.2 UIP/周期計(jì)時(shí)接口周期計(jì)時(shí)用于驅(qū)動(dòng)所有uIP內(nèi)部時(shí)鐘事件,例如包重發(fā)。當(dāng)周期計(jì)時(shí)激發(fā),每一個(gè)TCP連接應(yīng)該調(diào)用uIP函數(shù)uip

30、_periodic()。連接編號(hào)傳遞作為自變量給uip_periodic()函數(shù)。類似于uip_input()函數(shù),當(dāng)uip_periodic()函數(shù)返回,輸出的IP包要放在包緩存里。在這個(gè)特別的例子,函數(shù)netdev_send()是網(wǎng)絡(luò)驅(qū)動(dòng)的部分,將uip_buf數(shù)組的目錄發(fā)出到網(wǎng)上。for(i = 0; i < UIP_CONNS; +i) uip_periodic(i);if(uip_len > 0) netdev_send(); 3.2.3 UIP協(xié)議棧提供的主要接口提供的接口在 uip.h 中,為了減少函數(shù)調(diào)用造成的額外支出,大部分接口函數(shù)以宏命令實(shí)現(xiàn)。1初始化uIP協(xié)議

31、棧:uip_init()2處理輸入包:uip_input()3處理周期計(jì)時(shí)事件:uip_periodic()4開始監(jiān)聽端口:uip_listen()5連接到遠(yuǎn)程主機(jī):uip_connect()6接收到連接請(qǐng)求:uip_connected()7主動(dòng)關(guān)閉連接:uip_close()8連接被關(guān)閉:uip_closed()9發(fā)出去的數(shù)據(jù)被應(yīng)答:uip_acked()10在當(dāng)前連接發(fā)送數(shù)據(jù):uip_send()11在當(dāng)前連接上收到新的數(shù)據(jù):uip_newdata()12告訴對(duì)方要停止連接:uip_stop()13連接被意外終止:uip_aborted()3.3 以太網(wǎng)的芯片ENC28J60介紹及編程3.

32、3.1 ENC28J60介紹ENC28J60 是帶有行業(yè)標(biāo)準(zhǔn)串行外設(shè)接口(SerialPeripheral Interface,SPI)的獨(dú)立以太網(wǎng)控制器。 它可作為任何配備有SPI 的控制器的以太網(wǎng)接口,ENC28J60 符合IEEE 802.3 的全部規(guī)范,采用了一系列包過濾機(jī)制以便對(duì)傳入數(shù)據(jù)包進(jìn)行限制。它還提供了一個(gè)內(nèi)部DMA 模塊,以實(shí)現(xiàn)快速數(shù)據(jù)吞吐和硬件支持的IP校驗(yàn)和計(jì)算,通過兩個(gè)中斷引腳和SPI 實(shí)現(xiàn)與主控制器的通信,數(shù)據(jù)傳輸速率高達(dá)10 Mb/s。兩個(gè)專用的引腳用于連接LED,進(jìn)行網(wǎng)絡(luò)活動(dòng)狀態(tài)指示。要將單片機(jī)連接到速率為10 Mbps 的以太網(wǎng),只需ENC28J60、兩個(gè)脈沖變

33、壓器和一些無源元件即可。ENC28J60 由七個(gè)主要功能模塊組成:1. SPI 接口充當(dāng)主控制器和ENC28J60 之間的通信通道。2. 控制寄存器用于控制和監(jiān)視ENC28J60。3. 雙端口RAM緩沖器用于發(fā)送和接收數(shù)據(jù)包。4. 判優(yōu)器當(dāng)DMA、發(fā)送和接收模塊發(fā)出請(qǐng)求時(shí)對(duì)RAM 緩沖器的訪問進(jìn)行控制。5. 總線接口對(duì)通過SPI 接收的數(shù)據(jù)和命令進(jìn)行解析。6. MAC (Medium Access Control)模塊實(shí)現(xiàn)符合IEEE 802.3 標(biāo)準(zhǔn)的MAC 邏輯。7. PHY(物理層)模塊對(duì)雙絞線上的模擬數(shù)據(jù)進(jìn)行編碼和譯碼。該器件還包括其他支持模塊,如片內(nèi)穩(wěn)壓器、振蕩器、電平變換器(提供可

34、以接受5V 電壓的I/O引腳)和系統(tǒng)控制邏輯。各模塊工作特性如下:(1)以太網(wǎng)控制器特性 IEEE 802.3 兼容的以太網(wǎng)控制器 接收器和沖突抑制電路 集成MAC 和10 BASE-T PHY 支持半雙工和全雙工模式 支持一個(gè)帶自動(dòng)極性檢測(cè)和校正的10BASE-T 端口 可編程在發(fā)生沖突時(shí)自動(dòng)重發(fā) 可編程填充和CRC 生成 可編程自動(dòng)拒絕錯(cuò)誤數(shù)據(jù)包 最高速度可達(dá)10 Mb/s(2)緩沖器 8 KB 發(fā)送/ 接收數(shù)據(jù)包雙端口SRAM 可配置發(fā)送/ 接收緩沖器大小 硬件管理的循環(huán)接收FIFO 用于快速數(shù)據(jù)傳送的內(nèi)部DMA 字節(jié)寬度的隨機(jī)訪問和順序訪問(地址自動(dòng)遞增) 硬件支持的IP 校驗(yàn)和計(jì)算(

35、2)介質(zhì)訪問控制器(即MAC)特性 支持單播、組播和廣播數(shù)據(jù)包 可編程數(shù)據(jù)包過濾,并在以下事件的邏輯“與”和“或”結(jié)果為真時(shí)喚醒主機(jī):- 單播目標(biāo)地址- 組播地址- 廣播地址- 由64 位哈希表定義的組目標(biāo)地址- Magic Packet- 多達(dá)64 字節(jié)的可編程模式匹配(偏移量可由用戶定義) 環(huán)回模式(3)物理層(PHY)特性 環(huán)回模式 整形輸出濾波器(4)工作特性 兩個(gè)用來表示連接、發(fā)送、接收、沖突和全/ 半雙工狀態(tài)的可編程LED 輸出 25 MHz 時(shí)鐘 使用兩個(gè)中斷引腳的七個(gè)中斷源 帶可編程預(yù)分頻器的時(shí)鐘輸出引腳 工作電壓范圍是3.14V 3.45V TTL 電平輸入 溫度范圍:-40

36、°C+85°C (工業(yè)級(jí)), 0°C +70°C (商業(yè)級(jí))(僅SSOP 封裝) 28 引腳SPDIP、SSOP、SOIC 和QFN 封裝3.3.2 ENC28J60與單片機(jī)的連接 ENC28J60與微控制器MCU的連接是通過SPI實(shí)現(xiàn)的,支持10Mbps。對(duì)于沒有SPI接口的芯片可通過用I/O口模擬SPI接口的方式實(shí)現(xiàn)。ENC28J60僅支持SPI模式0,0。微控制器可通過SPI接口發(fā)送命令,訪問ENC28J60的寄存器或讀寫接收/發(fā)送緩沖區(qū),完成相關(guān)操作。復(fù)位也可通過SPI接口用軟件實(shí)現(xiàn),其中軟件復(fù)位不影響RESET引腳的狀態(tài)。ENC28J60有兩個(gè)

37、中斷輸出,分別用于事件中斷觸發(fā)和網(wǎng)絡(luò)喚醒主機(jī)。CPU采用LPC2138用宏定義實(shí)現(xiàn)SPI口讀寫操作。SOSPDR為SPI數(shù)據(jù)寄存器,該雙向寄存器為SPI提供發(fā)送和接收的數(shù)據(jù),發(fā)送數(shù)據(jù)通過寫該寄存器提供,SPI接收的數(shù)據(jù)可從該寄存器讀出。SOSPSR為SPI狀態(tài)寄存器,在對(duì)SPI接口進(jìn)行操作之前需對(duì)其初始化。以下是讀/寫SPI接口的源代碼:#defineREADSPI(Val)  S0SPDR=0x00;  while(0=(S0SPSR&0x80)  Val=S0SPDR; #defineWRITESPI(Val) if(0=(S0SP

38、SR&0x40)   S0SPDR=Val;  while(0=(S0SPSR&0x80)    uIP的設(shè)置單獨(dú)包含在一個(gè)叫uipopt.h的頭文件里,都是以宏的形式定義方便修改。用戶應(yīng)根據(jù)自己的應(yīng)用在uipopt.h文件里設(shè)置本地的物理地址、IP地址、網(wǎng)關(guān)地址、收發(fā)緩沖區(qū)的大小、支持的最大連接數(shù)、ARP表大小等選項(xiàng)。添加必須的模塊,對(duì)uIP進(jìn)行了正確地配置后,需要編寫主程序函數(shù)。針對(duì)基于以太網(wǎng)WEBSERVER應(yīng)用,主程序在完成初始化后將不停的進(jìn)行查詢,若有新數(shù)據(jù)包到達(dá)則送uip_input()函數(shù)處理,沒有新數(shù)據(jù)包到達(dá)則處理定時(shí)事件

39、。流程圖如下所示:檢索函數(shù)定時(shí)器初始化化結(jié)束開始是否網(wǎng)絡(luò)初始化函數(shù)Uip協(xié)議棧初始化TCP、UDP、HTTP應(yīng)用函數(shù)初始化初始化arp協(xié)議的緩沖打開串口中斷進(jìn)行接收函數(shù)是否返回1處理IP數(shù)據(jù)包 15設(shè) 計(jì) 總 結(jié)可以看出,uIP協(xié)議棧采用有效的方法和結(jié)構(gòu)化的代碼,使其存儲(chǔ)器占用量很小并且可以很方便的應(yīng)用到不同的工程項(xiàng)目中,同時(shí)它又是免費(fèi)的可以自由使用于商業(yè)和非商業(yè)目的。uIP為低端嵌入式設(shè)備的網(wǎng)絡(luò)接入提供了很好的解決方案,具有很高的應(yīng)用價(jià)值。ENC28J60是極具特色的獨(dú)立以太網(wǎng)控制器:SPI接口使得小型單片機(jī)也能具有網(wǎng)絡(luò)連接功能;集成MAC和PHY無需其他外設(shè);具有可編程過濾功能,可自動(dòng)評(píng)價(jià)

40、、接收或拒收多種信息包,減輕了主控單片機(jī)的處理負(fù)荷;內(nèi)部繼承可編程的8KB雙端口SRAM緩沖器,操作靈活方便。不足之處為僅支持10BASET。這次設(shè)計(jì)基本實(shí)現(xiàn)了所要設(shè)計(jì)的內(nèi)容,但是我也看到了設(shè)計(jì)過程中的不足和出現(xiàn)的問題。例如,在編程時(shí)由于所掌握的知識(shí)有限,遇到過不少困難,雖然出了不少錯(cuò)誤,但我相信自己在以后越來越多的實(shí)踐中越來越成熟起來??偟膩碚f這次的畢業(yè)設(shè)計(jì)不僅鍛煉了我的實(shí)戰(zhàn)能力,激發(fā)了我的創(chuàng)新思維,提高了我發(fā)現(xiàn)問題、解決問題的能力,而且培養(yǎng)了我面對(duì)挫折并勇于克服的意志、品質(zhì)和吃苦耐勞的精神,也使我深深的體會(huì)到理論結(jié)合實(shí)際的重要性,體會(huì)到即使以后走到工作崗位,仍然要繼續(xù)努力汲取知識(shí)。參考文獻(xiàn)

41、1李廣弟,朱月秀,王秀山.單片機(jī)基礎(chǔ)M.北京:北京航空航天大學(xué)出版社,2001.72韓志軍,沈晉源,望振波.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)M.北京:機(jī)械工業(yè)出版社,20053樓然苗,李光飛.51單片機(jī)設(shè)計(jì)實(shí)例M.北京:北京航空航天大學(xué)出版社,20034雷曉平等編.單片機(jī)及其應(yīng)用M.成都:電子科技大學(xué)出版社,2005.65李蘭友等編.單片機(jī)開發(fā)應(yīng)用十例M.北京:電子工業(yè)出版社,2006.76吳微,文軍等編.單片機(jī)原理及制作M.武漢:武漢大學(xué)出版社,2004.127靳達(dá).單片機(jī)應(yīng)用系統(tǒng)開發(fā)實(shí)例導(dǎo)航M.北京:人民郵電出版社, 2003.108周志敏,周紀(jì)海等編.LED驅(qū)動(dòng)電路設(shè)計(jì)與應(yīng)用M.北京:人民郵電出版社,

42、2004.89何立民.單片機(jī)高級(jí)教程M.北京:北京航空航天大學(xué)出版社,200110夏繼強(qiáng).單片機(jī)實(shí)驗(yàn)與實(shí)踐教程M.北京: 北京航空航天大學(xué)出版社,200111閻石.數(shù)字電子技術(shù)基礎(chǔ)M.北京:高等教育出版社,2005附 錄1.ENC28J60與單片機(jī)的外部連接圖(1)整體連接圖(2)MCU部分(3)串口與單片機(jī)部分(4)串口與單片機(jī)部分(5)電源部分2.重點(diǎn)函數(shù)程序(1) USART函數(shù)#include "USART.h"#include "STC12C5A.h"#define BAUD 9600/串口初始化void USART_Init()PCON &a

43、mp;= 0x7f;/波特率不倍速 SMOD=0SCON = 0x50;/8位數(shù)據(jù),可變波特率AUXR |= 0x40;/定時(shí)器1時(shí)鐘為Fosc,即1TAUXR &= 0xfe;/串口1選擇定時(shí)器1為波特率發(fā)生器TMOD &= 0x0f;/清除定時(shí)器1模式位TMOD |= 0x20;/設(shè)定定時(shí)器1為8位自動(dòng)重裝方式TL1 = 0xB2;/設(shè)定定時(shí)初值TH1 = 0xB2;/設(shè)定定時(shí)器重裝值ET1 = 0;/禁止定時(shí)器1中斷TR1 = 1;/啟動(dòng)定時(shí)器1ES = 1;/開串行中斷EA = 1;/開總中斷 /發(fā)送一個(gè)字符,ASCII碼void SendASC(unsigned ch

44、ar d)SBUF=d;while(!TI);/等待發(fā)送完成,TI置位TI=0;/發(fā)送字符串void SendString(unsigned char *str)while(*str)SendASC(*str) ;str+;/串口中斷服務(wù)程序void USART_Interrupt(void) interrupt 4 /放在這里和放在main()里面一樣unsigned char RxData=0;EA=0; if(RI) /必須判斷RI(接收中斷標(biāo)志)是否為1 RI=0; RxData = SBUF;/在這里添加你的接收代碼SendString("The word you send

45、 is ");SendASC(RxData);SendASC('n'); EA=1;(2) uip_arp函數(shù)#include "uip_arp.h"#include <string.h>struct arp_hdr struct uip_eth_hdr ethhdr; u16_t hwtype; u16_t protocol; u8_t hwlen; u8_t protolen; u16_t opcode; struct uip_eth_addr shwaddr; u16_t sipaddr2; struct uip_eth_addr

46、 dhwaddr; u16_t dipaddr2; struct ethip_hdr struct uip_eth_hdr ethhdr; u8_t vhl; tos; len2; ipid2; ipoffset2; ttl; proto; u16_t ipchksum; u16_t srcipaddr2; destipaddr2;#define ARP_REQUEST 1#define ARP_REPLY 2#define ARP_HWTYPE_ETH 1struct arp_entry u16_t ipaddr2; struct uip_eth_addr ethaddr; u8_t tim

47、e;struct uip_eth_addr uip_ethaddr = UIP_ETHADDR0; UIP_ETHADDR1; UIP_ETHADDR2; UIP_ETHADDR3; UIP_ETHADDR4; UIP_ETHADDR5; static struct arp_entry arp_tableUIP_ARPTAB_SIZE;static u16_t ipaddr2;static u8_t i, c;static u8_t arptime;static u8_t tmpage;#define BUF (struct arp_hdr *)&uip_buf0)#define IP

48、BUF (struct ethip_hdr *)&uip_buf0)-*/Void uip_arp_init(void)for(i = 0; i < UIP_ARPTAB_SIZE; +i) memset(arp_tablei.ipaddr, 0, 4); -*/Void uip_arp_timer(void) struct arp_entry *tabptr; +arptime;for(i = 0; i < UIP_ARPTAB_SIZE; +i) tabptr = &arp_tablei; if(tabptr->ipaddr0 | tabptr->i

49、paddr1) != 0 && arptime - tabptr->time >= UIP_ARP_MAXAGE) memset(tabptr->ipaddr, 0, 4); -*/static void uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr) register struct arp_entry *tabptr;for(i = 0; i < UIP_ARPTAB_SIZE; +i) tabptr = &arp_tablei; if(tabptr->ipaddr0

50、 != 0 && tabptr->ipaddr1 != 0) if(ipaddr0 = tabptr->ipaddr0 && ipaddr1 = tabptr->ipaddr1) memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); tabptr->time = arptime; return; for(i = 0; i < UIP_ARPTAB_SIZE; +i) tabptr = &arp_tablei; if(tabptr->ipaddr0 = 0 &

51、& tabptr->ipaddr1 = 0) break; if(i = UIP_ARPTAB_SIZE) tmpage = 0; c = 0;for(i = 0; i < UIP_ARPTAB_SIZE; +i) tabptr = &arp_tablei; if(arptime - tabptr->time > tmpage) tmpage = arptime - tabptr->time; c = i; i = c; memcpy(tabptr->ipaddr, ipaddr, 4); memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); tabptr->time = arptime;-*/Void uip_arp_ipin(void)uip_len -= sizeof(struct uip_eth_hdr);if(IPBUF->srcipaddr0 & uip_arp_netmask0) != (uip_hostaddr0 & uip_arp_netmask0) return; if(IPBUF->srcipaddr1 &

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論