摘? 要: TCP/IP協議棧大規模集成電路S7600A的結構、功能、硬件接口和應用程序接口;介紹一個基于實時多任務操作系統μC/OS的S7600A應用方案,此方案實現了嵌入式系統的Internet接入。?
關鍵詞: TCP/IP API 實時操作系統(RTOS) 多任務嵌入式系統?
?
隨著電子設備智能化要求的提高和各種功能強大的微處理器的推出,嵌入式系統逐漸成為許多電子設備不可缺少的一部分,并處在前所未有的發展期;而互聯網概念的深入人心更為嵌入式系統與互聯網的結合提出了要求。嵌入式系統接入Internet以后,不僅實現了設備的遠程控制、維護和升級,而且從另外一層意義上講,接入Internet的設備已經成為網絡共享資源的一部分。可以說這是自電子設備智能化以來設計思想的又一次飛躍。?
嵌入式系統接入Internet的關鍵是滿足TCP/IP協議。TCP/IP協議是建立在數據鏈路層、網絡層、傳輸層和應用層上的協議族,是Internet的基礎。各種型號計算機運行在不同操作系統之上,TCP/IP協議族允許它們互相通信。通常,一個嵌入式系統接入Internet,可選擇一個提供TCP/IP協議的嵌入式操作系統,或是在現有操作系統之上加入TCP/IP軟件協議棧,實現TCP/IP連接。對于嵌入式系統,TCP/IP軟件協議棧也構成了系統成本的一部分,而這部分投入占有不小的比例。同時,軟件協議棧的引入無疑要占用更多的系統資源,對于嵌入式系統來說是很可觀的。S7600A TCP/IP硬件協議棧芯片很好地解決了資源和成本有限的嵌入式系統的Internet接入問題。?
1 S7600A的內部結構?
S7600A內部結構如圖1所示,它由網絡棧、物理層接口、微控制器接口、SRAM接口和片內SRAM組成。(1)網絡棧是該芯片的核心。它建立在物理層上,包含有實現TCP/IP協議的特殊的層次化的數據結構,并完成數據的包裝或剝離。其內部又可以分為PPP(點對點協議)、IP(網際協議)、TCP(傳輸控制協議)/UDP(用戶數據報協議)幾個層次。(2)物理層接口是實現協議的最底層接口。在這里以UART的形式提供對外連接,可以通過外接Modem實現Intenet接入。(3)微控制器接口提供了與68k/x86(Motorola/Intel)MPU的標準并行接口和非標準的串行接口(串/并模式由PSX來選擇)。在x86/68k并行模式下,由C86來選擇x86或68k。SD[7:0]為地址/數據復用總線,CS為片選輸入,READX和WRITEX為讀寫信號,RS為寄存器選擇輸入,用來指示地址和數據。在串行模式下,SD7為串行數據輸入,SD6為串行時鐘輸入,SD5為串行數據輸出,WRITEX用來切換讀和寫。另外芯片提供了中斷輸出,用來給MPU發特定請求。BUSYX用做忙指示。?
?
?
2 S7600A內部寄存器和數據傳輸實例?
S7600A有36個內部寄存器,有單字節、多字節,也有變長的(如PPP_String寄存器,用來存放PAP用戶名和指令,其長度與用戶名和口令的實際長度相關)。對內部寄存器的讀寫可以實現對S7600A的各種操作,其中若干寄存器用來做TCP/IP的協議接口。由于寄存器數量較多,這里不一一介紹,僅舉一個TCP數據的傳輸實例來說明對該芯片的操作。?
一個IP地址和一個端口號可以稱為一個插口(Socket)。而一個插口對可以唯一地確定互聯網絡里的一個TCP連接。在進行以下操作之前事先要建立一個TCP連接。?
首先,將Serial_Port_Config寄存器(08H)里的SCTL標志位置1,把對串口的控制權交給硬件(S7600A),把要傳輸的數據寫到Socket_Data寄存器(2EH)里,S7600A就會把數據通過該寄存器放到輸出緩沖區(1K字節長度)。注意輸出緩沖區地址在Buffer_Out_Length寄存器(30H-31H)里。當輸出緩沖區為全空時,該寄存器里的值是3FFH,用戶每向Socket_Data寄存器里寫一個字節的數據,Buffer_Out_Length寄存器的值就會自動減一。?
當用戶要發送TCP數據時,只要向Data_Send寄存器(30H)里寫任意一個字節的數據,S7600A就會對輸出緩沖區里的數據進行TCP數據處理(自動加入TCP首部,形成TCP段;再加入IP首部,形成IP數據報;最后在串行鏈路上封裝IP數據報,形成PPP數據幀,如圖2所示。),然后通過UART接口發送出去。同時Buffer_Out_Length寄存器的值會復原到3FFH。注意輸出緩沖區最大1K字節,超過該值是不允許的。?
?
?
3? 基于S7600A的接入方案?
3.1 系統構成?
基于S7600A的接入方案如圖3所示,系統采用通用單片機AT89C51為控制核心。單片機既可以通過并行總線又可以通過串行總線與S7600A相連(在串行時用I/O口實現串行時序),通過對S7600A的操作實現TCP/IP協議。S7600A經UART接口與嵌入式Modem相接,經電話線接入Internet。應用程序與遠程服務器或客戶機建立TCP或UDP連接,在此基礎上實現多種應用,如FTP、SMTP、POP3、Telnet、IP電話服務等。從網上獲取的信息可以經系統總線傳給嵌入系統的其他部分或者直接顯示在LCD上,同樣系統產生的信息也可以發送到網絡上。?
?
?
3.2 系統的軟件設計?
(1) 嵌入式實時多任務操作系統?
在這個系統里,引入了實時操作系統(RTOS)。通常對單片機的開發是在硬件的基礎上直接進行編程,這種方法一般用于規模較小、較簡單的系統,對于規模較大、較為復雜的系統會產生一定的隱患,屬于較低層次的開發。近年來,在嵌入式應用中使用實時多任務操作系統已經成為一個熱點、一種時尚,從本質意義上講,是系統開發層次的一種提高。在實時多任務操作系統的支持下,多個任務可以按照一定關系并行工作,CPU資源得到充分利用,系統可靠性得到很好的保證,同時方便組織開發任務。?
當前出現了很多商業的RTOS,但一般價格比較昂貴,代碼不公開。本系統使用開放源代碼的RTOS μC/OS,這個RTOS已經在很多系統上進行了成功的應用,同時已經被移植到8051上。?
(2) S7600A應用程序接口(API)?
S7600A以硬件的形式提供了TCP/IP協議的簡單端口。即便如此,對其內部眾多寄存器進行尋址操作也并不容易,建立TCP/IP連接仍然是比較復雜的過程。幸運的是,廠商為其提供了API函數集,通過調用該函數集,可以實現S7600A的所有功能。這個函數集是建立在RTOS上的。但是這套API又具有硬件和平臺的獨立性,非常有利于在各種系統上移植,這種特性為實際開發項目的層次化組織創造了非常有利的條件。其硬件獨立性是通過API里的兩個文件iHwIFace.h和iHwIFace.c實現的,用戶在重寫這兩個文件后,可以使API用在不同的CPU上,它實際相當于S7600A的底層驅動程序。在這個系統里要根據AT89C51和S7600A的編址連接來確定這兩個文件。其平臺獨立性是通過API里的iSys.h和iSys.c實現的,用戶在重寫這兩個文件后,可以使API運行在不同的操作系統上,在該公司提供的這套API里已經附帶了基于μC/OS的這兩個文件。?
該API包括兩個主要部分:iStacApi(實現PPP)和iSockApi(實現Socket連接),對S7600A的功能進行了簡單而有效的封裝,為應用軟件的開發提供了方便。如表1、表2所示。?
?
?
?
?
(3)應用程序?
應用程序建立在RTOS和API之上,并可以實現多任務,在編譯完畢后和RTOS庫以及API庫一起連接生成可執行代碼,如圖4所示。?
在系統需要接入Internet傳輸數據的時候,首先要通過Modem撥號,建立PPP連接,然后再根據數據傳輸的具體需要決定建立TCP連接還是UDP連接。一般情況下,TCP 建立可靠的連接,可以實現諸如FTP、SMTP等服務;而像IP電話這樣強調實時性的場合,需要建立UDP連接。?
在需要上網的時候,運行以下程序,可以實現與ISP(網絡服務提供商)之間的撥號連接。首先,程序調用IsInitStack(),初始化S7600A的硬件協議棧子系統。如果初始化成功(得到RET_CODE_OK的返值),就開始進行撥號連接。調用IsPPPCheck()檢查是否已經連接,如果還沒有連接,就調用IsPPPConnect()進行撥號(該函數的參數含有進行撥號連接的要素:pdata.name表示撥號上網的用戶名,例如撥169時,用戶名就指定為“169”;pdata.passwd表示用戶口令,例如撥169時,該口令就指定為“169”;pdata.modemInitStrings存放初始化Modem用的指令,符合Modem AT指令集,“AT”為Modem指令的前綴。例如,“AT+FAE=0”表示關閉data/fax自動應答模式,“ATE0”表示禁止指令回應;pdata.baudRate為波特率;pdata.modemDialString為撥號號碼,此處為電話號碼169,“DT”表示用雙音頻撥號);如果已經建立了連接,就調用IsGetOurIP()得到IP地址或者調用IsPPPKeepAlive()保持連接。?
??? #include
??? #include
??? #define L_Time 10000?
??? static int do_connect=1, was_connect=0;?
??? static iIPAddr ip;?
??? ppp_task(void)?
??? {?
????? RET_CODE rc;??????? ? //RET_CODE為API函數執行狀態返值的數據類型?
??? ? iPPPData pdata;??? ?? //該數據結構包含建立PPP連接的必要數據?
??? ? static char *initStrings[5];?
??? ? initStrings[]=“AT+FAE=0n”; //在字符串數組里存放Modem初始化指令?
??? ? initStrings[]=“ATE0n”; ?
??? ? initStrings[]=0;?????????? ?? //設定該字符為NULL?
??? ? initStrings[]=0;?
??? ? initStrings[]=0;?
??? ? pdata.name=“169”;?? ??? //撥號上網的用戶名?
??? ? pdata.passwd=“169”;??? //撥號上網的用戶口令?
??? ? 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{rc==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的嵌入式系統Internet接入方案硬件上簡潔可靠、成本適中;軟件開發上體現了較好的層次思想和較高的技術水準,可維護性好,可擴展性好。?
參考文獻?
1 Seiko Instruments Inc. S7600A Datasheet.2000.?
2 Seiko Instruments Inc.S7600A Network Stack Driver APIs.?
3 W.Richard Stevens. TCP/IP Illustrated Vol.1 The Protocols?
4 Miller Freeman,Inc. μC/OS-II:the Real Time Kernel.