新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于S7600A的嵌入式系統(tǒng)Internet接入方案

基于S7600A的嵌入式系統(tǒng)Internet接入方案

作者: 時間:2006-05-07 來源:網(wǎng)絡(luò) 收藏

摘要:TCP/IP協(xié)議棧大規(guī)模集成電路S7600A的結(jié)構(gòu)、功能、硬件接口和應(yīng)用程序接口;介紹一個基于實時任務(wù)操作系統(tǒng)μs/OS的S7600A應(yīng)用方案,此方案實現(xiàn)了系統(tǒng)的Internet接入。

本文引用地址:http://butianyuan.cn/article/241603.htm

關(guān)鍵詞:TCP/IP API 實時操作系統(tǒng)(RTOS) 多任務(wù) 系統(tǒng)

隨著電子設(shè)備智能化要求的提高和各種功能強大的微處理器的推出,系統(tǒng)逐漸成為許多電子設(shè)備不可缺少的一部分,并處在前所未有的發(fā)展期;而互聯(lián)網(wǎng)概念的深入人心更為嵌入式系統(tǒng)與互聯(lián)網(wǎng)的結(jié)合提出了要求。嵌入式系統(tǒng)接入Internet以后,不僅實現(xiàn)了設(shè)備的遠(yuǎn)程控制、維護和升級,而且從另外一層意義上講,接入Internet的設(shè)備已經(jīng)成為網(wǎng)絡(luò)共享資源的一部分。可以說這是自電子設(shè)備智能化以來設(shè)計思想的又一次飛躍。

嵌入式系統(tǒng)接入Internet的關(guān)鍵是滿足TCP/IP協(xié)議。TCP/IP協(xié)議是建立在數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層上的協(xié)議族,是Internet的基礎(chǔ)。各種型號計算機運行在不同操作系統(tǒng)之上,TCP/IP協(xié)議族允許它們互相通信。通常,一個嵌入式系統(tǒng)接入Internet,可選擇一個提供TCP/IP協(xié)議的嵌入式操作系統(tǒng),或是在現(xiàn)有操作系統(tǒng)之上加入TCP/IP軟件協(xié)議棧,實現(xiàn)TCP/IP連接。對于嵌入式系統(tǒng),TCP/IP軟件協(xié)議棧也構(gòu)成了系統(tǒng)成本的一部分,而這部分投入占有不小的比例。同時,軟件協(xié)議棧的引入無疑要占用更多的系統(tǒng)資源,對于嵌入式系統(tǒng)來說是很可觀的。S7600A TCP/IP硬件協(xié)議棧芯片很好地解決了資源和成本有限的嵌入式系統(tǒng)的Internet接入問題。

1 S7600A的內(nèi)部結(jié)構(gòu)

S7600A內(nèi)部結(jié)構(gòu)如圖1所示,它由網(wǎng)絡(luò)棧、物理層接口、微控制器接口、SRAM接口和片內(nèi)SRAM組成。(1)網(wǎng)絡(luò)棧是該芯片的核心。它建立在物理層上,包含有實現(xiàn)TCP/IP協(xié)議的特殊的層次化的數(shù)據(jù)結(jié)構(gòu),并完成數(shù)據(jù)的包裝或剝離。其內(nèi)部又可以分為PPP(點對點協(xié)議)、IP(網(wǎng)際協(xié)議)、TCP(傳輸控制協(xié)議)/UDP(用戶數(shù)據(jù)報協(xié)議)幾個層次。(2)物理層接口是實現(xiàn)協(xié)議的最底層接口。在這里以UART的形式提供對外連接,可以通過外接Modem實現(xiàn)Internet接入。(3)微控制器接口提供了與68k/x86(Moterola/Intel)MPU的標(biāo)準(zhǔn)并行接口非標(biāo)準(zhǔn)的串行接口(串/并模式由PSX來選擇)。在x86/68k并行模式下,由C86來選擇x86或68k。SD[7:0]為地址/數(shù)據(jù)復(fù)用總線,CS為片選輸入,READX和WRITEX為讀寫信號,RS為寄存器選擇輸入,用業(yè)指示地址和數(shù)據(jù)。在串行模式下,SD7為串行數(shù)據(jù)輸入,SD6為串行時鐘輸入,SD5為串行數(shù)據(jù)輸出,WRITEX用來切換讀和寫。另外芯片提供了中斷輸出,用來給MPU發(fā)特定請求。BUSYX用做忙指示。

2 S7600A內(nèi)部寄存器和數(shù)據(jù)傳輸實例

S7600A有36個內(nèi)部寄存器,有單字節(jié)、多字節(jié),也有變長的(如PPP_String寄存器,用來存放PAP用戶名和指令,其長度與用戶名和口令的實際長度相關(guān))。對內(nèi)部寄存器的讀寫可以實現(xiàn)對S7600A的各種操作,其中若干寄存器用來做TCP/IP的協(xié)議接口。由于寄存器數(shù)據(jù)量較多,這里不一一介紹,僅舉一個TCP數(shù)據(jù)的傳輸實例來說明對該芯片的操作。

一個IP地址和一個端口號可以稱一個插口(Socket)。而一個插口對可以唯一地確定互聯(lián)網(wǎng)絡(luò)里一個TCP連接。在進行以下操作之前事先要建立一個TCP連接。

首先,將Serial_Port_Config寄存器(08H)里的SCTL標(biāo)志位置1,把對串口的控制權(quán)交給硬件(S7600A),把要傳輸?shù)臄?shù)據(jù)寫到Socket_Data寄存器(2EH)里,S7600A就會把數(shù)據(jù)通過該寄存器放到輸出緩沖區(qū)(1K字節(jié)長度)。注意輸出緩沖區(qū)地址在Buffer_Out_Length寄存器(30H-31H)里,當(dāng)輸出緩沖區(qū)為全空時,該寄存器里寫一個字節(jié)的數(shù)據(jù),用戶每向Socket_Data寄存器里寫一個字節(jié)的數(shù)據(jù),Buffer_Out_Length寄存器的值就會自動減一。

當(dāng)用戶要發(fā)送TCP數(shù)據(jù)時,只要向Data_Send寄存器(30H)里寫任意個字節(jié)的數(shù)據(jù),S7600A就會對輸出緩沖區(qū)里的數(shù)據(jù)進行TCP數(shù)據(jù)處理(自動加入TCP首部,形成TCP段;再加入IP首部,形成IP數(shù)據(jù)報;最后在串行鏈路上封裝IP數(shù)據(jù)報,形成PPP數(shù)據(jù)幀,如圖2所示。)然后通過UART接口發(fā)送出去。同時Buffer_Out_Length寄存器的值會復(fù)原到3FFH.注意輸出緩沖區(qū)最大1K字節(jié),超過該值是不允許的。

3 基于S7600A的接入方案

3.1 系統(tǒng)構(gòu)成

基于S7600A的接入方案如圖3所示,系統(tǒng)采用通用單片機AT89C51為控制核。單片機既可以通過并行總線又可以通過串行總線與S7600A相連(在串行時用I/O口實現(xiàn)串行時序),通過對S7600A的操作實現(xiàn)TCP/IP協(xié)議。S7600A經(jīng)UART接口與嵌入式Modem相接,經(jīng)電話線接入Internet。應(yīng)用程序與遠(yuǎn)程服務(wù)器或客戶機建立TCP或UDP連接,在此基礎(chǔ)上實現(xiàn)多種應(yīng)用,如FTP、SMTP、POP3、Telnet、IP電話服務(wù)等。從網(wǎng)上獲取的信息可以經(jīng)系統(tǒng)總線傳給嵌入系統(tǒng)的其他部分或者直接顯示在LCD上,同樣系統(tǒng)產(chǎn)生的信息也可發(fā)送到網(wǎng)絡(luò)上。

3.2 系統(tǒng)的軟件設(shè)計

(1)嵌入式實時多任務(wù)操作系統(tǒng)

在這個系統(tǒng)里,引入了實時操作系統(tǒng)(RTOS)。通常對單片機的開發(fā)是在硬件的基礎(chǔ)上直接進行編程,這種方法一般用于規(guī)模較小、較簡單的系統(tǒng),對于規(guī)模較大、較為復(fù)雜的系統(tǒng)會產(chǎn)生一定的隱患,屬于較低層次的開發(fā)。近年來,在嵌入式應(yīng)用中使用實時多任務(wù)操作系統(tǒng)已經(jīng)成為一個熱點、一種時尚,從本質(zhì)意義上講,是系統(tǒng)開發(fā)層次的一種提高。在實時多任務(wù)操作系統(tǒng)的支持下,多個任務(wù)可以按照一定關(guān)系并行工作,CPU資源得到充分利用,系統(tǒng)可靠性得到很好的保證,同時方便組織開發(fā)任務(wù)。

當(dāng)前出現(xiàn)了很多商業(yè)的RTOS,但一般價格比較昂貴,代碼不公開。本系統(tǒng)使用了開放源代碼的RTOS μC/OS,這個RTOS已經(jīng)在很多系統(tǒng)上進行了成功的應(yīng)用,同時已經(jīng)被移植到8051上。

(2)S7600A應(yīng)用程序接口(API)

S7600A以硬件的形式提供了TCP/IP協(xié)議的簡單端口。即便如此,對其內(nèi)部眾多寄存器進行尋址操作了并不容易,建立TCP/IP連接仍然是比較復(fù)雜的過程。幸運的是,廠商為其提供API函數(shù)集,通過調(diào)用該函數(shù)集,可以實現(xiàn)S7600A的所有功能。這個函數(shù)集是建立在RTOS上的。但是這套API又具有硬件和平臺的獨立性,非常有利于在各種系統(tǒng)上移植,這種特性為實際開發(fā)項目的層次公組織創(chuàng)造了非常有利的條件。其硬件獨立性是通過API里的兩個文件iHwIFace.h和iHwIFace.c實現(xiàn)的,用戶在重寫這兩個文件后,可以使API用在不同的CPU上,它實際相當(dāng)于S7600A的底層驅(qū)動程序。在這個系統(tǒng)里要根據(jù)AT89C51和S7600A的編址連接來確定這兩個文件,其平臺獨立性是通過API里的iSys.h和iSys.c實現(xiàn)的,用戶在重寫這兩個文件后,可以使API運行在不同的操作系統(tǒng)上,在該公司提供的這套API里已經(jīng)附帶了基于μC/OS的這兩個文件。

該API包括兩個主要部分:iStacApi(實現(xiàn)PPP)和iSockApi(實現(xiàn)Socket連接),對S7600A的功能進行了簡單而有效的封裝,為應(yīng)用軟件的開發(fā)提供了方便。如表1、表2所示。

表1 iStacApi

函數(shù)名用 途
IsInitStack
IsPPPConnect
IsPPPDisconnect
IsPPPCheck
IsPPPKeepAlive
IsGetOurIP
初始化硬件協(xié)議棧子系統(tǒng)
建立PPP連接
關(guān)斷PPP連接
檢測PPP連接是否激活
在PPP連接失效時重建連接
獲得本地當(dāng)前IP地址

表2 IsockApi

函數(shù)名用 途
IsInitSocket
IsTCPConnect
IsTCPListen
IsTCPRead
IsTCPWrite
IsTCPClose
IsTCPAbort
IsUDPCreate
IsUDPRead
IsUDPWrite
IsUDPRelease
IsUDPAbort
初始化Socket的軟件構(gòu)成
嘗試打開TCP連接
接受TCP連接
從TCP Socket中讀取數(shù)據(jù)
向TCP Socket里寫數(shù)據(jù)
關(guān)閉TCP Socket
中止TCP Socket上的操作
建立對UDP Socket的監(jiān)聽
等待并讀取UDP信息
寫并發(fā)送UDP Socket
關(guān)閉UDP Socket
中止UDP Socket上的操作

(3)應(yīng)用程序

應(yīng)用程序建立在RTOS和API之上,并可以實現(xiàn)多任務(wù),在編譯完畢后和RTOS庫以及API庫一起連接生成可執(zhí)行代碼,如圖4所示。

在系統(tǒng)需接入Internet傳輸數(shù)據(jù)的時候,首先要通過Modem撥號,建立PPP連接,然后再根據(jù)數(shù)據(jù)傳輸?shù)木唧w需要決定建立TCP連接還是UDP連接。一般情況下,TCP建立可靠的連接,可以實現(xiàn)諸如FTP、SMTP等服務(wù);而像IP電話這樣強調(diào)實時性的場合,需要建立UDP連接。

在需要上網(wǎng)的時候,運行以下程序要,可以實現(xiàn)與ISP(網(wǎng)絡(luò)服務(wù)提供商)之間的撥號連接。首先,程序調(diào)用IsInitStack(),初始化S7600A的硬件協(xié)議棧子系統(tǒng)。如果初始化成功(得到RET_CODE_OK的返值),就開始進行撥號連接。調(diào)用IsPPPCheck()檢查是否已經(jīng)連接,如果還沒有連接,就調(diào)用IsPPPConnect()進行撥號(該函數(shù)的參數(shù)含有進行撥號連接的要素:phata.name表示撥號上網(wǎng)的用戶名,例如撥169時,用戶名就指定為“169”;pdata.passwd表示用戶口令,例如撥169時,該口令指定為“169”;pdata.modemInitStrings存放初始化Modem用的指令,符合Modem AT指令集,“AT”為Modem指令的前綴。例如,“AT+FAE=0”表示關(guān)閉data/fax自動應(yīng)答模式,“ATE0”表示禁止指令回應(yīng);pdata.baudRate為波特率;pdata.modemDialString為撥號號碼,此處為電話號碼169,“DT”表示用雙音頻撥號);如果已經(jīng)建立了連接,就調(diào)用IsGetOurIP()得到IP地址或者調(diào)用IsPPPKeepAlive()保持連接。

#includeiReady.h>

#includeiRtacApi.h>

#define L_Time 10000

static int do_connect=1,was_connect=0;

static iIPAddr ip;

ppp_task(void)

{

RET_CODE rc; //RET_CODE為API函數(shù)執(zhí)行狀態(tài)返值的數(shù)據(jù)類型

iPPPData pdata; //該數(shù)據(jù)結(jié)構(gòu)包含建立PPP連接的必要數(shù)據(jù)

static char *initSrtings[5];

initStrings[]=“AT+FAE=0”; //在字符串?dāng)?shù)組里存放Modem初始化指令

initStrings[]=“ATE0”;

initStrings[]=0; //設(shè)定該字符為NULL

initStrings[]=0;

initStrings[]=0;

pdata.name=“169”; //撥號上網(wǎng)的用戶名

pdata.passwd=“169”; //撥號上網(wǎng)的用戶口令

pdata.baudRate=28800; //設(shè)置波特率

pdata.hwFlowCtrl=1; //啟用硬件流控制

pdata.useModem=1;

pdata.modemDialString=“ATDT 169”; //ATDT為雙音頻撥號指令

pdata.auth=IPPP_AUTH_PAP; //提供PAP驗證

pdata.modemInitStrings=initstrings; //Modem初始化的系統(tǒng)指令,必須以NLLL結(jié)尾

rc=IsInitStack(); //初始化硬件棧子系統(tǒng)

if{re= =RET_CODE_OK}

{

while(do_connect)

{

rc=IsPPPCheck(); //檢查PPP連接是否激活

if(rc= =RET_CODE_OK)

{

if(was_connect= =0)

{

rc=IsGetOurIP(ip); //獲取IP地址

was_connect=1;

}

}

else if(was_connect)

{

was_connect=0;

rc=IsPPPkeepAlive(L_TIME)//在連接失效時重新建立連接

}

else

{

rc=IsPPPConnect(pdata,L_TIME); //撥號并與ISP建立PPP連接

continue;

}

smallSleep(L_TIME);

}

}

}

基于RTOS和S7600A的嵌入式系統(tǒng)Internet接入方案硬件上簡潔可靠、成本適中;軟件開發(fā)上體現(xiàn)了較好的層次思想和較高的技術(shù)水準(zhǔn),可維護性好,可擴展性好。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

tcp/ip相關(guān)文章:tcp/ip是什么




評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉