基于S7600A的嵌入式系統Internet接入方案
摘要:TCP/IP協(xié)議棧大規模集成電路S7600A的結構、功能、硬件接口和應用程序接口;介紹一個(gè)基于實(shí)時(shí)任務(wù)操作系統μs/OS的S7600A應用方案,此方案實(shí)現了嵌入式系統的Internet接入。
本文引用地址:http://dyxdggzs.com/article/241603.htm關(guān)鍵詞:TCP/IP API 實(shí)時(shí)操作系統(RTOS) 多任務(wù) 嵌入式系統
隨著(zhù)電子設備智能化要求的提高和各種功能強大的微處理器的推出,嵌入式系統逐漸成為許多電子設備不可缺少的一部分,并處在前所未有的發(fā)展期;而互聯(lián)網(wǎng)概念的深入人心更為嵌入式系統與互聯(lián)網(wǎng)的結合提出了要求。嵌入式系統接入Internet以后,不僅實(shí)現了設備的遠程控制、維護和升級,而且從另外一層意義上講,接入Internet的設備已經(jīng)成為網(wǎng)絡(luò )共享資源的一部分??梢哉f(shuō)這是自電子設備智能化以來(lái)設計思想的又一次飛躍。
嵌入式系統接入Internet的關(guān)鍵是滿(mǎn)足TCP/IP協(xié)議。TCP/IP協(xié)議是建立在數據鏈路層、網(wǎng)絡(luò )層、傳輸層和應用層上的協(xié)議族,是Internet的基礎。各種型號計算機運行在不同操作系統之上,TCP/IP協(xié)議族允許它們互相通信。通常,一個(gè)嵌入式系統接入Internet,可選擇一個(gè)提供TCP/IP協(xié)議的嵌入式操作系統,或是在現有操作系統之上加入TCP/IP軟件協(xié)議棧,實(shí)現TCP/IP連接。對于嵌入式系統,TCP/IP軟件協(xié)議棧也構成了系統成本的一部分,而這部分投入占有不小的比例。同時(shí),軟件協(xié)議棧的引入無(wú)疑要占用更多的系統資源,對于嵌入式系統來(lái)說(shuō)是很可觀(guān)的。S7600A TCP/IP硬件協(xié)議棧芯片很好地解決了資源和成本有限的嵌入式系統的Internet接入問(wèn)題。
1 S7600A的內部結構
S7600A內部結構如圖1所示,它由網(wǎng)絡(luò )棧、物理層接口、微控制器接口、SRAM接口和片內SRAM組成。(1)網(wǎng)絡(luò )棧是該芯片的核心。它建立在物理層上,包含有實(shí)現TCP/IP協(xié)議的特殊的層次化的數據結構,并完成數據的包裝或剝離。其內部又可以分為PPP(點(diǎn)對點(diǎn)協(xié)議)、IP(網(wǎng)際協(xié)議)、TCP(傳輸控制協(xié)議)/UDP(用戶(hù)數據報協(xié)議)幾個(gè)層次。(2)物理層接口是實(shí)現協(xié)議的最底層接口。在這里以UART的形式提供對外連接,可以通過(guò)外接Modem實(shí)現Internet接入。(3)微控制器接口提供了與68k/x86(Moterola/Intel)MPU的標準并行接口非標準的串行接口(串/并模式由PSX來(lái)選擇)。在x86/68k并行模式下,由C86來(lái)選擇x86或68k。SD[7:0]為地址/數據復用總線(xiàn),CS為片選輸入,READX和WRITEX為讀寫(xiě)信號,RS為寄存器選擇輸入,用業(yè)指示地址和數據。在串行模式下,SD7為串行數據輸入,SD6為串行時(shí)鐘輸入,SD5為串行數據輸出,WRITEX用來(lái)切換讀和寫(xiě)。另外芯片提供了中斷輸出,用來(lái)給MPU發(fā)特定請求。BUSYX用做忙指示。
2 S7600A內部寄存器和數據傳輸實(shí)例
S7600A有36個(gè)內部寄存器,有單字節、多字節,也有變長(cháng)的(如PPP_String寄存器,用來(lái)存放PAP用戶(hù)名和指令,其長(cháng)度與用戶(hù)名和口令的實(shí)際長(cháng)度相關(guān))。對內部寄存器的讀寫(xiě)可以實(shí)現對S7600A的各種操作,其中若干寄存器用來(lái)做TCP/IP的協(xié)議接口。由于寄存器數據量較多,這里不一一介紹,僅舉一個(gè)TCP數據的傳輸實(shí)例來(lái)說(shuō)明對該芯片的操作。
一個(gè)IP地址和一個(gè)端口號可以稱(chēng)一個(gè)插口(Socket)。而一個(gè)插口對可以唯一地確定互聯(lián)網(wǎng)絡(luò )里一個(gè)TCP連接。在進(jìn)行以下操作之前事先要建立一個(gè)TCP連接。
首先,將Serial_Port_Config寄存器(08H)里的SCTL標志位置1,把對串口的控制權交給硬件(S7600A),把要傳輸的數據寫(xiě)到Socket_Data寄存器(2EH)里,S7600A就會(huì )把數據通過(guò)該寄存器放到輸出緩沖區(1K字節長(cháng)度)。注意輸出緩沖區地址在Buffer_Out_Length寄存器(30H-31H)里,當輸出緩沖區為全空時(shí),該寄存器里寫(xiě)一個(gè)字節的數據,用戶(hù)每向Socket_Data寄存器里寫(xiě)一個(gè)字節的數據,Buffer_Out_Length寄存器的值就會(huì )自動(dòng)減一。
當用戶(hù)要發(fā)送TCP數據時(shí),只要向Data_Send寄存器(30H)里寫(xiě)任意個(gè)字節的數據,S7600A就會(huì )對輸出緩沖區里的數據進(jìn)行TCP數據處理(自動(dòng)加入TCP首部,形成TCP段;再加入IP首部,形成IP數據報;最后在串行鏈路上封裝IP數據報,形成PPP數據幀,如圖2所示。)然后通過(guò)UART接口發(fā)送出去。同時(shí)Buffer_Out_Length寄存器的值會(huì )復原到3FFH.注意輸出緩沖區最大1K字節,超過(guò)該值是不允許的。
3 基于S7600A的接入方案
3.1 系統構成
基于S7600A的接入方案如圖3所示,系統采用通用單片機AT89C51為控制核。單片機既可以通過(guò)并行總線(xiàn)又可以通過(guò)串行總線(xiàn)與S7600A相連(在串行時(shí)用I/O口實(shí)現串行時(shí)序),通過(guò)對S7600A的操作實(shí)現TCP/IP協(xié)議。S7600A經(jīng)UART接口與嵌入式Modem相接,經(jīng)電話(huà)線(xiàn)接入Internet。應用程序與遠程服務(wù)器或客戶(hù)機建立TCP或UDP連接,在此基礎上實(shí)現多種應用,如FTP、SMTP、POP3、Telnet、IP電話(huà)服務(wù)等。從網(wǎng)上獲取的信息可以經(jīng)系統總線(xiàn)傳給嵌入系統的其他部分或者直接顯示在LCD上,同樣系統產(chǎn)生的信息也可發(fā)送到網(wǎng)絡(luò )上。
3.2 系統的軟件設計
(1)嵌入式實(shí)時(shí)多任務(wù)操作系統
在這個(gè)系統里,引入了實(shí)時(shí)操作系統(RTOS)。通常對單片機的開(kāi)發(fā)是在硬件的基礎上直接進(jìn)行編程,這種方法一般用于規模較小、較簡(jiǎn)單的系統,對于規模較大、較為復雜的系統會(huì )產(chǎn)生一定的隱患,屬于較低層次的開(kāi)發(fā)。近年來(lái),在嵌入式應用中使用實(shí)時(shí)多任務(wù)操作系統已經(jīng)成為一個(gè)熱點(diǎn)、一種時(shí)尚,從本質(zhì)意義上講,是系統開(kāi)發(fā)層次的一種提高。在實(shí)時(shí)多任務(wù)操作系統的支持下,多個(gè)任務(wù)可以按照一定關(guān)系并行工作,CPU資源得到充分利用,系統可靠性得到很好的保證,同時(shí)方便組織開(kāi)發(fā)任務(wù)。
當前出現了很多商業(yè)的RTOS,但一般價(jià)格比較昂貴,代碼不公開(kāi)。本系統使用了開(kāi)放源代碼的RTOS μC/OS,這個(gè)RTOS已經(jīng)在很多系統上進(jìn)行了成功的應用,同時(shí)已經(jīng)被移植到8051上。
(2)S7600A應用程序接口(API)
S7600A以硬件的形式提供了TCP/IP協(xié)議的簡(jiǎn)單端口。即便如此,對其內部眾多寄存器進(jìn)行尋址操作了并不容易,建立TCP/IP連接仍然是比較復雜的過(guò)程。幸運的是,廠(chǎng)商為其提供API函數集,通過(guò)調用該函數集,可以實(shí)現S7600A的所有功能。這個(gè)函數集是建立在RTOS上的。但是這套API又具有硬件和平臺的獨立性,非常有利于在各種系統上移植,這種特性為實(shí)際開(kāi)發(fā)項目的層次公組織創(chuàng )造了非常有利的條件。其硬件獨立性是通過(guò)API里的兩個(gè)文件iHwIFace.h和iHwIFace.c實(shí)現的,用戶(hù)在重寫(xiě)這兩個(gè)文件后,可以使API用在不同的CPU上,它實(shí)際相當于S7600A的底層驅動(dòng)程序。在這個(gè)系統里要根據AT89C51和S7600A的編址連接來(lái)確定這兩個(gè)文件,其平臺獨立性是通過(guò)API里的iSys.h和iSys.c實(shí)現的,用戶(hù)在重寫(xiě)這兩個(gè)文件后,可以使API運行在不同的操作系統上,在該公司提供的這套API里已經(jīng)附帶了基于μC/OS的這兩個(gè)文件。
該API包括兩個(gè)主要部分:iStacApi(實(shí)現PPP)和iSockApi(實(shí)現Socket連接),對S7600A的功能進(jìn)行了簡(jiǎn)單而有效的封裝,為應用軟件的開(kāi)發(fā)提供了方便。如表1、表2所示。
表1 iStacApi
函數名 | 用 途 |
IsInitStack IsPPPConnect IsPPPDisconnect IsPPPCheck IsPPPKeepAlive IsGetOurIP | 初始化硬件協(xié)議棧子系統 建立PPP連接 關(guān)斷PPP連接 檢測PPP連接是否激活 在PPP連接失效時(shí)重建連接 獲得本地當前IP地址 |
表2 IsockApi
函數名 | 用 途 |
IsInitSocket IsTCPConnect IsTCPListen IsTCPRead IsTCPWrite IsTCPClose IsTCPAbort IsUDPCreate IsUDPRead IsUDPWrite IsUDPRelease IsUDPAbort | 初始化Socket的軟件構成 嘗試打開(kāi)TCP連接 接受TCP連接 從TCP Socket中讀取數據 向TCP Socket里寫(xiě)數據 關(guān)閉TCP Socket 中止TCP Socket上的操作 建立對UDP Socket的監聽(tīng) 等待并讀取UDP信息 寫(xiě)并發(fā)送UDP Socket 關(guān)閉UDP Socket 中止UDP Socket上的操作 |
(3)應用程序
應用程序建立在RTOS和API之上,并可以實(shí)現多任務(wù),在編譯完畢后和RTOS庫以及API庫一起連接生成可執行代碼,如圖4所示。
在系統需接入Internet傳輸數據的時(shí)候,首先要通過(guò)Modem撥號,建立PPP連接,然后再根據數據傳輸的具體需要決定建立TCP連接還是UDP連接。一般情況下,TCP建立可靠的連接,可以實(shí)現諸如FTP、SMTP等服務(wù);而像IP電話(huà)這樣強調實(shí)時(shí)性的場(chǎng)合,需要建立UDP連接。
#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函數執行狀態(tài)返值的數據類(lèi)型
iPPPData pdata; //該數據結構包含建立PPP連接的必要數據
static char *initSrtings[5];
initStrings[]=“AT+FAE=0”; //在字符串數組里存放Modem初始化指令
initStrings[]=“ATE0”;
initStrings[]=0; //設定該字符為NULL
initStrings[]=0;
initStrings[]=0;
pdata.name=“169”; //撥號上網(wǎng)的用戶(hù)名
pdata.passwd=“169”; //撥號上網(wǎng)的用戶(hù)口令
pdata.baudRate=28800; //設置波特率
pdata.hwFlowCtrl=1; //啟用硬件流控制
pdata.useModem=1;
pdata.modemDialString=“ATDT 169”; //ATDT為雙音頻撥號指令
pdata.auth=IPPP_AUTH_PAP; //提供PAP驗證
pdata.modemInitStrings=initstrings; //Modem初始化的系統指令,必須以NLLL結尾
rc=IsInitStack(); //初始化硬件棧子系統
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); //撥號并與ISP建立PPP連接
continue;
}
smallSleep(L_TIME);
}
}
}
基于RTOS和S7600A的嵌入式系統Internet接入方案硬件上簡(jiǎn)潔可靠、成本適中;軟件開(kāi)發(fā)上體現了較好的層次思想和較高的技術(shù)水準,可維護性好,可擴展性好。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)tcp/ip相關(guān)文章:tcp/ip是什么
評論