基于MC9328MXl的Socket通信設計與實(shí)現
關(guān)鍵詞:嵌入式系統;ARM;MC9328MXl;CS8900A;Socket編程
1 引言
目前,嵌入式系統已經(jīng)廣泛應用到人們的工作、生活中,2003年我國嵌入式系統應用產(chǎn)品經(jīng)濟總量達l 000億元。隨著(zhù)技術(shù)的發(fā)展,8位MCU市場(chǎng)已逐步趨向穩定,32位MPU代表著(zhù)嵌入式技術(shù)的發(fā)展方向,正在加速發(fā)長(cháng)。在32位嵌入式微處理器市場(chǎng)上,基于ARM內核的微處理器處于絕對的領(lǐng)導地位。
嵌入式系統是以應用為中心,以計算機技術(shù)為基礎,軟、硬件可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專(zhuān)用計算機系統。嵌入式系統除了具有高效、穩定、性能專(zhuān)一等優(yōu)點(diǎn)外,還具有實(shí)時(shí)性較高的操作系統。嵌入式系統與通信、網(wǎng)絡(luò )技術(shù)的結合可以極大增強網(wǎng)絡(luò )的智能化與靈話(huà)性,拓展通信功能,從而實(shí)現各種通信系統之間的互聯(lián)互通。本文給出了一種適合于中/低端應用的通信平臺設計方案,它可支持以太網(wǎng)之間的數據傳輸,并且具有RS232、RS485、USB等接口。文中圍繞嵌入式Linux環(huán)境設計了基于MC9328MXl(ARM920T)最小系統的硬件通信平臺,從而實(shí)現了嵌入式Socket通信。
2 最小系統分析
Motorola公司的MC9328MXl是以ARM920T為內核的高性?xún)r(jià)比16/32位RISC微控制器,內含一個(gè)ARM公司設計的16/32位ARM920T RISC處理器核,ARM920T為低功耗,高性能16/32位核,最適合于對價(jià)格及功耗敏感的應用場(chǎng)合。除了ARM920T核以外,MC9328MXl還包含了許多外圍功能模塊。處理器和這些模塊都集成在核心板上,其具體結構如圖1所示。
由圖1可見(jiàn),除了ARM920TDMI內核外,MC9328MXl還集成了多個(gè)外圍功能模塊:一個(gè)LCD控制器、一個(gè)脈沖調制控制器、一個(gè)USB控制器及多個(gè)擴展通道,但是沒(méi)有集成用于網(wǎng)絡(luò )通信的以太網(wǎng)控制器。所以,需要設計包含合適的以太網(wǎng)控制器的外圍電路。
3 外圍電路設計
本系統選用與MC9328MXl相匹配的CS8900A作為以太網(wǎng)控制器。CS8900A是Cirrus Logic公司生產(chǎn)的低功耗16位以太網(wǎng)控制器,功能強大。該器件的突出特點(diǎn)是使用靈活,其物理層接口、數據傳輸模式和工作模式等都能根據需要動(dòng)態(tài)調整,通過(guò)內部寄存器的設置來(lái)適應不同的應用環(huán)境。
CS8900A內部結構框圖如圖2所示,內部功能模塊主要是802.3介質(zhì)訪(fǎng)問(wèn)控制塊(MAC)。802.3介質(zhì)訪(fǎng)問(wèn)控制塊支持全雙工工作模式,完全依照IEEE802.3以太網(wǎng)標準,采用100引腳TQFP封裝,負責處理有關(guān)以太網(wǎng)數據幀的發(fā)送和接收,包括:沖突檢測、幀頭的產(chǎn)生和檢測、CRC校驗碼的生成和驗證。通過(guò)對發(fā)送控制寄存器(TxCMD)的初始化配置,MAC能自動(dòng)完成幀的沖突后重傳。如果幀的數據部分少于46個(gè)字節,它能生成填充字段使數據幀達到802.3所要求的最短長(cháng)度。
CS8900A的主要特點(diǎn)如下:
符合IEEE802.3以太網(wǎng)標準,并帶有ISA接口;
片內4KB RAM;
適用于I/O工作模式、存儲器工作模式和DMA工作模式;
帶有傳送、接收低通濾波的lOBase2T連接端口;
支持lOBase2,lOBase5和lOBase2F的AUI接口;
自動(dòng)生成報頭,自動(dòng)進(jìn)行CRC檢驗,沖突后自動(dòng)重發(fā);
最大電流消耗為55mA(5 V電源);
全雙工工作模式;
支持外部EEPROM。
另外,要實(shí)現CS8900A與主機之間的數據通訊,在電路設計時(shí)可根據具體情況靈活選擇合適的數據傳輸模式。CS8900A支持的傳輸模式有:I/O模式和Memory模式,另外還有DMA模式。其中,I/O模式是訪(fǎng)問(wèn)CS8900A存儲區的缺省模式,簡(jiǎn)單易用。
由MC9328MXl的引腳描述可以看出,MCU的數據是通過(guò)D[3l:0]傳輸的,而以太網(wǎng)控制器CS8900A最多使用16位傳輸模式,所以MC9328MXl的數據總線(xiàn)前16位(D[15:0])應與CS8900A的SD[O:15]相連,為解決速度不匹配的問(wèn)題,需使用具有緩沖功能的總線(xiàn)收發(fā)器。從成本考慮,該系統采用兩個(gè)8位的74LS245。地址信息通過(guò)MC9328MXI地址總線(xiàn)接口的A[DO:03]與CS8900A的SA[00:03]通過(guò)緩沖器74HC244相連,A[04:19]與SA[04:19]直接相連用于設置網(wǎng)卡的初始基址。另外,CS8900A通過(guò)一個(gè)帶扼流線(xiàn)圈的隔離變壓器20F001N將CPU發(fā)送的數據(變比為l:1.414)發(fā)送到網(wǎng)絡(luò )上;接收數據時(shí),網(wǎng)絡(luò )傳送的數據經(jīng)過(guò)隔離變壓器(變比為1:1)。隔離變壓器的作用主要是將外部線(xiàn)路與CS8900A隔開(kāi),防止干擾和燒壞元件,實(shí)現帶電的插拔功能。XTALl與XTAL2之間的晶振為CS8900A提供穩定的時(shí)鐘脈沖。其電路圖如圖3所示。
4 基于嵌入式Linux的Socket通信
基于嵌入式Linux的開(kāi)發(fā)環(huán)境一般由裝有交叉編譯器的PC機和硬件開(kāi)發(fā)板組成。本設計以PC宿主機作為客戶(hù)端,以MC9328MXl的開(kāi)發(fā)板作為服務(wù)器實(shí)現通信。先由PC機將客戶(hù)機程序(server)編譯好后,通過(guò)串口寫(xiě)入開(kāi)發(fā)板,然后將開(kāi)發(fā)板與PC機通過(guò)以太網(wǎng)口建立連接。
Socket(套接字)是通過(guò)標準UNIX文件描述符和其他程序通訊的一個(gè)方法,其實(shí)質(zhì)是提供了進(jìn)程通信的端點(diǎn),可以看作是一種特殊的管道。通過(guò)Sock-et編程可以實(shí)現網(wǎng)絡(luò )通信。一個(gè)完整的套接字有一個(gè)相關(guān)的描述:協(xié)議、本地地址、本地端口、遠程地址、遠程端口。
通用套接口地址結構struct sockaddr的定義如下:
套接字操作函數主要有:
(1)創(chuàng )建一個(gè)Sockets
sockfd=socket (family,type,protocol)
其中由地址類(lèi)(family)參數指定該Socket使用的地址類(lèi)。由類(lèi)型(type)參數規定所請求的通信類(lèi)型。協(xié)議(protocol)參數一般為零,使得默認的協(xié)議將自動(dòng)被選取。
(2)連接本地地址
本函數的主要功能是將一個(gè)規定的地址與一個(gè)Sockets結合,一個(gè)服務(wù)進(jìn)程要使用如下函數:bind(sockfd,address,addrlen)其中,sockfd參數是由socket()調用返回的sockets描述符。address指向一個(gè)地址結構,addrlen參數規定了地址的字節長(cháng)度。
(3)客戶(hù)進(jìn)程連接到服務(wù)進(jìn)程
用此函數實(shí)現客戶(hù)進(jìn)程對服務(wù)進(jìn)程連接的初始化。此系統調用是:
connect(sockfd,address,addrlen)
其中,sockfd是本地Sockets的Sockets描述符。address規定目的機上服務(wù)進(jìn)程正在使用的地址,addrlen規定了地址的字節長(cháng)度。
當connect()函數被調用時(shí),如果客戶(hù)的Sockets還沒(méi)有結合到一個(gè)本地地址,則系統自動(dòng)選擇一個(gè)本地地址和一個(gè)適當的端口號,并且把它們和該客戶(hù)的Sockets相結合。
(4)網(wǎng)絡(luò )監聽(tīng)
int listen(int sockfd,int backlog);
sockfd是Socket系統調用返回的Socket描述符;backlog指定在請求隊列中允許的最大請求數,進(jìn)入的連接請求將在隊列中等待accept ()(參考下文)。backlog對隊列中等待服務(wù)的請求的數目進(jìn)行了限制,大多數系統缺省值為20。如果一個(gè)服務(wù)請求到來(lái)時(shí),輸入隊列已滿(mǎn),該Socket將拒絕連接請求,客戶(hù)將收到一個(gè)出錯信息。當出現錯誤時(shí)listen函數返回-l,并置相應的errno錯誤碼。
(5)接收請求函數
accept()函數讓服務(wù)器接收客戶(hù)的連接請求。在建立好輸入隊列后,服務(wù)器就調用accept函數,然后睡眠并等待客戶(hù)的連接請求。
int accept(int sockfd,void*addr,int*addrlen);
sockfd是被監聽(tīng)的Socket描述符,addr通常是一個(gè)指向sockaddr_in變量的指針,該變量用來(lái)存放提出連接請求服務(wù)的主機的信息;addrlen通常為一個(gè)指向值為sizeof(struct sockaddr_in)的整型指針變量。
(6)數據傳輸
Send()和Recv()這兩個(gè)函數應用于面向連接的Socket上進(jìn)行數據傳輸。
Send()函數原型為:int send(int sockfd,const void*msg,int len,int flags);sockfd是用來(lái)傳輸數據的socket描述符;msg是一個(gè)指向要發(fā)送數據的指針;len是以字節為單位的數據長(cháng)度;flags一般情況下置為0。
Recv ()函數原型為:int Recv(int sockfd,void*buf int len,unsigned int flags);sockfd是接受數據的Socket描述符;buf是存放接收數據的緩沖區;len是緩沖的長(cháng)度。flags也被置為O。Recv()返回實(shí)際上接收的字節數,當出現錯誤時(shí),返回-1并置相應的errno值。
本部分設計的目的是通過(guò)分析Socket的編程方法,編寫(xiě)一個(gè)服務(wù)器程序server,用arm-linux-gcc編譯后運行在A(yíng)RM開(kāi)發(fā)板上,一個(gè)客戶(hù)端程序client用gcc編譯后在PC上運行。
總體編程模型即客戶(hù)機與服務(wù)器的通信過(guò)程見(jiàn)圖4。
4.1 服務(wù)器端
(1)初始化
4.2 客戶(hù)機端
(1)通過(guò)服務(wù)器域名獲得服務(wù)器的IP地址
函數gethostbyname ()是完成域名轉換的。當gethostname()調用成功時(shí),返回指向struct hosten的指針,當調用失敗時(shí)返回-1。
(2)創(chuàng )建一個(gè)Socket(實(shí)現方法與服務(wù)器端相同)
(3)與服務(wù)器建立連接
這樣,給ARM開(kāi)發(fā)板CS8900A網(wǎng)卡分配地址,并且編譯server和client程序后,可以將開(kāi)發(fā)板用作服務(wù)器,PC用作客戶(hù)端,實(shí)現兩者的通信。
5 結束語(yǔ)
本文設計開(kāi)發(fā)了基于MC9328MXl的以太網(wǎng)通信系統,并利用嵌入式linux操作系統強大的網(wǎng)絡(luò )功能實(shí)現了Socket通信。文中的客戶(hù)端應用程序已經(jīng)在基于A(yíng)RM9TDMI核的MC9328MXl處理器的嵌入式開(kāi)發(fā)平臺上成功運行,應用宿主PC機的服務(wù)器端應用程序成功實(shí)現了Socket通信。當然,也可以把目標硬件開(kāi)發(fā)平臺當作服務(wù)器端,而把宿主PC機當作客戶(hù)端來(lái)進(jìn)行雙向文件傳輸。
linux相關(guān)文章:linux教程
數字通信相關(guān)文章:數字通信原理
通信相關(guān)文章:通信原理
評論