隨著人們對(duì)信息化程度的要求不斷提高, 設(shè)備上網(wǎng)已經(jīng)成為一個(gè)趨勢(shì)。32位機(jī)資源豐富,上網(wǎng)方案也較為成熟,但成本相對(duì)較高,因而價(jià)位偏低的8位機(jī)上網(wǎng)方案成為研究的熱點(diǎn)。但是,8位機(jī)資源有限,因此在實(shí)現(xiàn)8位機(jī)以太網(wǎng)連接時(shí),一定要考慮周全。本文介紹在VRS51L3074上實(shí)現(xiàn)TCP/IP協(xié)議棧uIP的移植,成功實(shí)現(xiàn)了socket通信。
硬件平臺(tái)
本方案的硬件平臺(tái)主要由VRS51L3074和CS8900A組成,經(jīng)網(wǎng)絡(luò)變壓器的隔離,CS8900A與網(wǎng)絡(luò)接口RJ-45連接上,這樣整個(gè)系統(tǒng)就可以連接到Ethernet。數(shù)據(jù)輸入可由串口傳遞給系統(tǒng)。
VRS51L3074簡(jiǎn)介
VRS51L3074是Ramtron公司最新推出的單周期、基于8051內(nèi)核、功能豐富的SOC單片機(jī),是全球第一款集成FRAM的高性能單片機(jī)。CPU最高處理速度可達(dá)40MIPS,內(nèi)置64kB Flash存儲(chǔ)器支持ISP、IAP功能、4kB+256B的SRAM以及8kB的FRAM,帶有完全可配置的I2C接口和SPI接口等片內(nèi)外設(shè),支持JTAG下載和非侵入式在線調(diào)試。VRS51系列單片機(jī)和8051完全兼容,支持SDCC、Keil等C編譯器,編譯和下載時(shí)需要一些特殊的配置。Versa Ware JTAG軟件是VRS51系列單片機(jī)的下載工具,和Keil uVision配合使用時(shí)需要一些配置。

CS8900A簡(jiǎn)介
CS8900A是CIRRUS LOGIC公司的一種低價(jià)位、高集成度、低功耗、全雙工的16bit以太網(wǎng)控制器,是一款專門為嵌入式系統(tǒng)設(shè)計(jì)優(yōu)化的以太網(wǎng)控制器。該芯片的突出特點(diǎn)就是使用靈活,其物理層接口、數(shù)據(jù)傳輸模式、工作模式都能根據(jù)需要而進(jìn)行動(dòng)態(tài)配置,可通過(guò)內(nèi)部寄存器的配置來(lái)適應(yīng)不同的應(yīng)用環(huán)境。CS8900A有三種工作模式:I/O模式、存儲(chǔ)器模式和DMA模式。
CS8900A基本工作原理是:在收到由主機(jī)發(fā)來(lái)的數(shù)據(jù)報(bào)后,偵聽(tīng)網(wǎng)絡(luò)線路。如果線路忙,它就等到線路空閑為止,否則立即發(fā)送該數(shù)據(jù)幀 。發(fā)送過(guò)程中,首先它添加以太網(wǎng)幀頭(包括先導(dǎo)字段和幀開(kāi)始標(biāo)志),然后生成CRC校驗(yàn)碼,最后將此數(shù)據(jù)幀發(fā)送到以太網(wǎng)上。接收時(shí),它將從以太網(wǎng)收到的數(shù)據(jù)幀在經(jīng)過(guò)解碼、去掉幀頭和地址檢驗(yàn)等步驟后緩存在片內(nèi)。通過(guò)CRC校驗(yàn)后,它會(huì)根據(jù)初始化配置情況,通知主機(jī)CS8900A收到了數(shù)據(jù)幀,最后用某種傳輸模式傳到主機(jī)的存儲(chǔ)區(qū)中。
嵌入式TCP/IP協(xié)議棧uIP
TCP/IP是一個(gè)協(xié)議族,它是一個(gè)四層協(xié)議模型,包括應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。應(yīng)用層定義清晰的會(huì)話過(guò)程,HTTP、FTP、Telnet和SMTP等都屬于應(yīng)用層協(xié)議;傳輸層提供端到端的通信,該協(xié)議有傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報(bào)協(xié)議(UDP);網(wǎng)絡(luò)層負(fù)責(zé)數(shù)據(jù)打包和邏輯尋址,IP、ICMP和ARP等協(xié)議都屬于網(wǎng)絡(luò)層;網(wǎng)絡(luò)接口層負(fù)責(zé)在源和目的節(jié)點(diǎn)間線路上進(jìn)行無(wú)差錯(cuò)的傳輸數(shù)據(jù),具有流量控制等功能。

TCP/IP協(xié)議較為復(fù)雜,實(shí)現(xiàn)起來(lái)非常困難,一般都采用現(xiàn)有的TCP/IP協(xié)議棧來(lái)實(shí)現(xiàn)。本系統(tǒng)就是采用源碼開(kāi)放的免費(fèi)嵌入式TCP/IP協(xié)議棧uIP來(lái)實(shí)現(xiàn)TCP/IP協(xié)議的。
uIP是專門為8位和16位嵌入式微控制器設(shè)計(jì)的微型TCP/IP協(xié)議棧 , 它是由瑞典計(jì)算機(jī)學(xué)院的Adam Dunkels開(kāi)發(fā)的免費(fèi)開(kāi)源軟件,最新版本為uIP1.0。uIP完全是由C語(yǔ)言編寫的,因此可移植到各種不同的CPU結(jié)構(gòu)和操作系統(tǒng)上。uIP提供了網(wǎng)絡(luò)通信所必須的協(xié)議,本身代碼和占用的內(nèi)存數(shù)都非常少,uIP的源代碼只有幾kB,RAM僅占用幾百字節(jié)。uIP具有如下特點(diǎn):
1)完整的說(shuō)明文檔和公開(kāi)的源代碼,全部由C編寫,并附有詳細(xì)的注釋,便于移植。
2)極少的代碼占用量和RAM資源要求,尤其適合于8/16位單片機(jī)。
3)支持IP、ARP、TCP、ICMP和UDP等基本功能。
4)高度的可配置性以適應(yīng)不同資源條件和應(yīng)用場(chǎng)合。
5)支持多個(gè)主動(dòng)連接和被動(dòng)連接并發(fā),支持連接的動(dòng)態(tài)分配和釋放。
6)簡(jiǎn)易的應(yīng)用層接口和設(shè)備驅(qū)動(dòng)層接口。
7)完善的示例程序和協(xié)議實(shí)現(xiàn)范例。
為了節(jié)省資源占用,簡(jiǎn)化應(yīng)用接口,uIP1.0在內(nèi)部實(shí)現(xiàn)上做了特殊處理。
1)注意各模塊的融合,減少處理函數(shù)的個(gè)數(shù)和調(diào)用次數(shù),提高代碼復(fù)用率以減少ROM占用。
2)基于單一全局?jǐn)?shù)組的收發(fā)數(shù)據(jù)緩沖區(qū),不支持內(nèi)存動(dòng)態(tài)分配,由應(yīng)用負(fù)責(zé)處理收發(fā)的數(shù)據(jù)。
3 )基于事件驅(qū)動(dòng)的應(yīng)用程序接口,各并發(fā)連接采用輪循處理,僅當(dāng)網(wǎng)絡(luò)事件發(fā)生時(shí),由uIP內(nèi)核喚起應(yīng)用程序處理,這樣uIP用戶只須關(guān)注特定應(yīng)用就可以了。傳統(tǒng)的TCP/IP實(shí)現(xiàn)一般要基于多任務(wù)處理環(huán)境,而大多數(shù)8位機(jī)系統(tǒng)不具備這個(gè)條件。
4)應(yīng)用程序主動(dòng)參與部分協(xié)議棧功能的實(shí)現(xiàn)(如TCP的重發(fā)機(jī)制,數(shù)據(jù)包分段和流量控制),由uIP內(nèi)核設(shè)置重發(fā)事件,應(yīng)用程序重新生成數(shù)據(jù)提交發(fā)送,免去了大量?jī)?nèi)部緩存的占用。基于事件驅(qū)動(dòng)的應(yīng)用接口使得這些實(shí)現(xiàn)較為簡(jiǎn)單。

uIP實(shí)現(xiàn)了TCP/IP協(xié)議族的四個(gè)基本協(xié)議:ARP(地址解析協(xié)議),IP(網(wǎng)際協(xié)議),ICMP(因特網(wǎng)信息控制協(xié)議)和TCP(傳輸控制協(xié)議),UDP協(xié)議是可選模塊。
IP(Internet Protocol網(wǎng)際協(xié)議)是TCP/IP協(xié)議族中最為核心的協(xié)議,提供不可靠的無(wú)連接的數(shù)據(jù)報(bào)傳送服務(wù)。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都是以IP數(shù)據(jù)報(bào)格式傳輸?shù)?。uIP的IP協(xié)議主要負(fù)責(zé)封裝TCP幀、驗(yàn)證輸入包IP頭的正確性、接受IP數(shù)據(jù)報(bào)進(jìn)行處理并向上層協(xié)議提交以及TCP與ICMP之間的復(fù)用數(shù)據(jù)包。為了節(jié)省占用空間,uIP1.0只支持一個(gè)數(shù)據(jù)報(bào)的分片和重組。
TCP(Transmission Control Protocol)協(xié)議是傳輸層的協(xié)議之一,它提供高可靠性的數(shù)據(jù)通信。TCP的主要工作是把應(yīng)用程序交給的數(shù)據(jù)分成適當(dāng)?shù)男K交給下面的網(wǎng)絡(luò)層,確認(rèn)收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)鐘等。TCP是uIP重點(diǎn)實(shí)現(xiàn)的協(xié)議。為了減少存儲(chǔ)器空間占用,uIP沒(méi)有實(shí)現(xiàn)TCP發(fā)送和接收數(shù)據(jù)的窗口調(diào)整,且不會(huì)緩存收到的TCP段,而是立即交給應(yīng)用程序處理。重發(fā)也是由應(yīng)用程序?qū)崿F(xiàn)的。在輸出數(shù)據(jù)時(shí),每一個(gè)連接只能有一個(gè)正在傳輸?shù)腡CP段。
ICMP(Internet控制報(bào)文協(xié)議)用來(lái)傳遞差錯(cuò)報(bào)文以及其他需要注意的信息。uIP只實(shí)現(xiàn)了echo。
ARP(Address Resolution Protocol)為IP地址到對(duì)應(yīng)的硬件地址之間提供動(dòng)態(tài)映射。ARP協(xié)議是把目標(biāo)IP地址解析為以太網(wǎng)MAC地址,當(dāng)一個(gè)IP包要在以太網(wǎng)上發(fā)送時(shí),先查詢ARP表,找出要發(fā)送的MAC地址。如果在表里找不到對(duì)應(yīng)的IP地址,就會(huì)廣播ARP請(qǐng)求包,以獲取給出IP地址所對(duì)應(yīng)的MAC地址。目的主機(jī)收到請(qǐng)求包后發(fā)出一個(gè)ARP回應(yīng)包,給出自己的MAC地址和IP地址。ARP表每十秒更新一次。ARP協(xié)議是uIP的可選模塊。
UDP(User Datagram Protocol)協(xié)議是一個(gè)簡(jiǎn)單的、面向數(shù)據(jù)報(bào)的傳輸層協(xié)議。UDP協(xié)議是uIP可選模塊。
uIP是一個(gè)專為8位和16位單片機(jī)設(shè)計(jì)的小型簡(jiǎn)易的TCP/IP協(xié)議棧,簡(jiǎn)單易用、占用資源少是其設(shè)計(jì)特點(diǎn)。為了占用較少的資源,uIP只保留了基本的通信功能而把全功能協(xié)議棧中那些不常用的功能去掉,其重點(diǎn)是在IP、TCP和ICMP的實(shí)現(xiàn)上,而把ARP和UDP作為可選模塊。
uIP處于網(wǎng)絡(luò)通信的中間,其上層協(xié)議是應(yīng)用程序?qū)?,其下層硬件或固件稱為網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)層。uIP并不僅僅是為以太網(wǎng)設(shè)計(jì)的,它與媒體無(wú)關(guān)。
uIP的設(shè)備驅(qū)動(dòng)程序接口
uIP中需要底層驅(qū)動(dòng)支持的函數(shù)有:uip_input( )和uip_periodic( )。uip_input( )函數(shù)是用來(lái)處理網(wǎng)絡(luò)層和設(shè)備驅(qū)動(dòng)層之間的傳送數(shù)據(jù)的,當(dāng)設(shè)備驅(qū)動(dòng)程序從網(wǎng)絡(luò)層收到一個(gè)數(shù)據(jù)包時(shí)會(huì)調(diào)用此函數(shù),設(shè)備驅(qū)動(dòng)程序會(huì)事先把數(shù)據(jù)包存放在uip_buf[ ]緩沖區(qū)里,而把數(shù)據(jù)長(zhǎng)度放到uip_len,然后交給uip_input( )函數(shù)處理。當(dāng)函數(shù)返回時(shí),如果uip_len不為0,則表明帶有數(shù)據(jù)。如果需要ARP支持時(shí),則要考慮更新ARP 表或者發(fā)送ARP請(qǐng)求和回應(yīng)。
uip_periodic( )用于內(nèi)部時(shí)鐘事件計(jì)時(shí),當(dāng)周期定時(shí)激發(fā)時(shí),每一個(gè) TCP連接應(yīng)該調(diào)用uip_periodic( )函數(shù)。這個(gè)函數(shù)用于uIP內(nèi)核對(duì)各連接的定時(shí)輪循,因此需要一個(gè)硬件支持的定時(shí)程序周期性地用它輪循各連接,一般用于檢查主機(jī)是否有數(shù)據(jù)要發(fā)送,如果需要?jiǎng)t構(gòu)造IP包。
從本質(zhì)上來(lái)說(shuō),uip_input( )和uip_periodic( )在內(nèi)部是一個(gè)函數(shù),即uip_process ( )。UIP的設(shè)計(jì)者將uip_process(UIP_DATA)定義成uip_input( ),而將uip_process(UIP_TIMER)定義成uip_periodic( ),因此從代碼實(shí)現(xiàn)上來(lái)說(shuō)是完全復(fù)用的。
uIP應(yīng)用程序接口
uIP在接受到底層傳來(lái)的數(shù)據(jù)包后,如需送上層應(yīng)用程序處理,就會(huì)調(diào)UIP_APPCALL( ),同時(shí)uIP設(shè)置UIP_CONN結(jié)構(gòu)體指針指向當(dāng)前連接。UIP_CONN記錄一條TCP連接的所有相關(guān)信息。為了將用戶的應(yīng)用程序掛接到uIP中,必須將宏UIP_APPCALL( )定義成實(shí)際的應(yīng)用程序函數(shù)名,這樣每當(dāng)某個(gè)uIP事件發(fā)生時(shí),內(nèi)核就會(huì)調(diào)用該應(yīng)用程序進(jìn)行處理。如果要加入應(yīng)用程序狀態(tài)的話,必須將宏UIP_APPSTATE_SIZE定義成應(yīng)用程序狀態(tài)結(jié)構(gòu)體的長(zhǎng)度。
uIP在VRS51L3074上的應(yīng)用和簡(jiǎn)單Socket通信
本硬件平臺(tái)是網(wǎng)絡(luò)POS機(jī)的一部分,它的工作原理是:由掃描槍采集的數(shù)據(jù)經(jīng)串口送入網(wǎng)卡內(nèi),然后經(jīng)網(wǎng)絡(luò)發(fā)送到遠(yuǎn)端主機(jī)。
本系統(tǒng)的軟件部分包括網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序、TCP/IP協(xié)議棧實(shí)現(xiàn)以及簡(jiǎn)單的Socket通信程序。
CS8900主要包括三個(gè)部分:EtherDevInit()函數(shù)完成CS8900A網(wǎng)絡(luò)芯片的初始化,包括初始化寄存器等,使之進(jìn)入服務(wù)狀態(tài);EtherDevSend()實(shí)現(xiàn)把以太網(wǎng)數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)中;EtherDevRecv()完成數(shù)據(jù)的接受。在CS8900的頭文件中設(shè)置了MAC地址以及其他的一些參數(shù)。
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序通過(guò)兩個(gè)全局變量與uIP協(xié)議棧進(jìn)行接口:uip_buf為收發(fā)緩沖區(qū),uip_len為數(shù)據(jù)的長(zhǎng)度。EtherDevSend( )函數(shù)把uip_buf里的數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中,EtherDevRecv( )函數(shù)把接受到的數(shù)據(jù)存儲(chǔ)到uip_buf緩沖區(qū)中,同時(shí)修改uip_len的值。
uIP協(xié)議棧承擔(dān)網(wǎng)絡(luò)通信功能,一方面與底層鏈路層通信實(shí)現(xiàn)數(shù)據(jù)收發(fā),另一方面為上層應(yīng)用程序提供了簡(jiǎn)單的API接口。uIP基本實(shí)現(xiàn)了IP、TCP、ARP、UDP以及ICMP(ping)等協(xié)議,它包括uip.c、uip_arch.c、uip_arp.c、uip.h、uipopt.h、uip_arch.h、uip_arp.h等文件。uip.c完成主要TCP/IP功能,主要是IP和TCP協(xié)議,UDP是可選模塊;uip_arp.c完成地址解析;uip_arch.c完成校驗(yàn);uipopt.h是uIP配置文件,它以宏的形式定義便于修改,用戶可根據(jù)自己的需要設(shè)置本地的物理地址、IP地址、網(wǎng)關(guān)地址、收發(fā)緩沖區(qū)大小、支持的最大連接數(shù)以及ARP表大小等選項(xiàng)。
VRS51L3074有3個(gè)16-bit的定時(shí)器,可以選擇一個(gè)為TCP/IP協(xié)議中與事件有關(guān)的事件定時(shí)。uIP中需要定時(shí)的事件有:為uip_periodic( )函數(shù)的執(zhí)行提供基準(zhǔn)和ARP表更新。uip_periodic( )函數(shù)每0.5秒執(zhí)行一次,ARP表每10秒更新一次。
添加了必需的模塊,進(jìn)行了正確的配置后,需要編寫主程序和應(yīng)用程序初始化包括定時(shí)器初始化、串口初始化、網(wǎng)卡芯片初始化、uIP協(xié)議棧初始化、用戶應(yīng)用程序初始化等,主程序初始化完成后,進(jìn)入不停查詢的狀態(tài),如果有數(shù)據(jù)到來(lái),則交給uip_input( )進(jìn)行處理,如果沒(méi)有則由uip_periodic( )來(lái)處理定時(shí)事件。為了將應(yīng)用程序掛接到uIP中,必須把UIP_APPCALL( )定義為實(shí)際的應(yīng)用 程序函數(shù)名,這樣每當(dāng)某個(gè)uIP事件發(fā)生時(shí),內(nèi)核就會(huì)調(diào)用該應(yīng)用程序進(jìn)行處理。本應(yīng)用程序定義 #define UIP_APPCALL socket_appcall。
結(jié)束語(yǔ)
本方案成功地把嵌入式TCP/IP協(xié)議棧uIP移植到VRS51單片機(jī)上,實(shí)現(xiàn)了網(wǎng)絡(luò)通信。該方案是網(wǎng)絡(luò)POS機(jī)的一部分,目前已經(jīng)正在運(yùn)行,且狀態(tài)良好。本方案采用的單片機(jī)和網(wǎng)絡(luò)芯片不但性能良好而且價(jià)格低廉,uIP是一個(gè)性能優(yōu)良的免費(fèi)小型TCP/IP協(xié)議棧,因此本系統(tǒng)運(yùn)行速度快、穩(wěn)定可靠且價(jià)位較低。本方案可廣泛應(yīng)用于遠(yuǎn)程數(shù)據(jù)采集、傳輸,遠(yuǎn)程監(jiān)控,遠(yuǎn)程抄表以及 信息家電等領(lǐng)域。
責(zé)任編輯:gt
-
變壓器
+關(guān)注
關(guān)注
162文章
7905瀏覽量
144243 -
單片機(jī)
+關(guān)注
關(guān)注
6072文章
45271瀏覽量
661565 -
嵌入式
+關(guān)注
關(guān)注
5178文章
20030瀏覽量
326257
發(fā)布評(píng)論請(qǐng)先 登錄
一種uIP TCP/IP協(xié)議棧在51系列單片機(jī)上的實(shí)現(xiàn)
51單片機(jī)用uip協(xié)議棧怎么通過(guò)網(wǎng)頁(yè)訪問(wèn)單片機(jī)?
VRS51L3074 pdf datasheet (High
uIP TCP/IP協(xié)議棧在51系列單片機(jī)上的應(yīng)用
基于單片機(jī)的LED顯示屏控制系統(tǒng)設(shè)計(jì)
基于VRS51L3074和DS12887的電子日歷時(shí)鐘設(shè)計(jì)方
VRS51L3074與串行FRAM在LED顯示屏中的應(yīng)用
多點(diǎn)定鬧電子日歷鐘方案
VRS51L3074_IcpdfCom_61367
uip在單片機(jī)上的移植精講
uIP協(xié)議棧介紹
51+單片機(jī)TCP-IP+協(xié)議棧ZLIP源碼
Flex與51單片機(jī)進(jìn)行socket通信的詳細(xì)資料說(shuō)明
基于PIC單片機(jī)的TCP/IP協(xié)議棧實(shí)現(xiàn)

基于VRS51L3074單片機(jī)實(shí)現(xiàn)協(xié)議棧uIP的socket通信設(shè)計(jì)
評(píng)論