<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/241603.htm

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

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

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

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

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

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

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

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

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

          3 基于S7600A的接入方案

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

          基于S7600A的接入方案如圖3所示,系統(tǒng)采用通用單片機(jī)AT89C51為控制核。單片機(jī)既可以通過(guò)并行總線又可以通過(guò)串行總線與S7600A相連(在串行時(shí)用I/O口實(shí)現(xiàn)串行時(shí)序),通過(guò)對(duì)S7600A的操作實(shí)現(xiàn)TCP/IP協(xié)議。S7600A經(jīng)UART接口與嵌入式Modem相接,經(jīng)電話線接入Internet。應(yīng)用程序與遠(yuǎn)程服務(wù)器或客戶機(jī)建立TCP或UDP連接,在此基礎(chǔ)上實(shí)現(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è)計(jì)

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

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

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

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

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

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

          表1 iStacApi

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

          表2 IsockApi

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

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

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

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

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

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

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

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

          pdata.useModem=1;

          pdata.modemDialString=“ATDT 169”; //ATDT為雙音頻撥號(hào)指令

          pdata.auth=IPPP_AUTH_PAP; //提供PAP驗(yàn)證

          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)//在連接失效時(shí)重新建立連接

          }

          else

          {

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

          continue;

          }

          smallSleep(L_TIME);

          }

          }

          }

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

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

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




          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();