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

          新聞中心

          EEPW首頁 > 手機(jī)與無線通信 > 設(shè)計(jì)應(yīng)用 > 基于MC9328MXl的Socket通信設(shè)計(jì)與實(shí)現(xiàn)

          基于MC9328MXl的Socket通信設(shè)計(jì)與實(shí)現(xiàn)

          作者: 時(shí)間:2008-03-03 來源:網(wǎng)絡(luò) 收藏
          摘要:介紹了新一代龍珠i.MX系列芯片(ARM920T)最小系統(tǒng)的嵌入式系統(tǒng)開發(fā)平臺,對其以太網(wǎng)卡部分圍繞網(wǎng)卡芯片CS8900A進(jìn)行了嵌入式網(wǎng)絡(luò)系統(tǒng)的電路,在此基礎(chǔ)上,通過對應(yīng)用層的編程的研究和分析,在嵌入式Linux環(huán)境下了開發(fā)板與PC機(jī)之間的C/S模式。
          關(guān)鍵詞:嵌入式系統(tǒng);ARM;;CS8900A;編程


          1 引言
          目前,嵌入式系統(tǒng)已經(jīng)廣泛應(yīng)用到人們的工作、生活中,2003年我國嵌入式系統(tǒng)應(yīng)用產(chǎn)品經(jīng)濟(jì)總量達(dá)l 000億元。隨著技術(shù)的發(fā)展,8位MCU市場已逐步趨向穩(wěn)定,32位MPU代表著嵌入式技術(shù)的發(fā)展方向,正在加速發(fā)長。在32位嵌入式微處理器市場上,ARM內(nèi)核的微處理器處于絕對的領(lǐng)導(dǎo)地位。
          嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟、硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)除了具有高效、穩(wěn)定、性能專一等優(yōu)點(diǎn)外,還具有實(shí)時(shí)性較高的操作系統(tǒng)。嵌入式系統(tǒng)與、網(wǎng)絡(luò)技術(shù)的結(jié)合可以極大增強(qiáng)網(wǎng)絡(luò)的智能化與靈話性,拓展通信功能,從而各種通信系統(tǒng)之間的互聯(lián)互通。本文給出了一種適合于中/低端應(yīng)用的通信平臺方案,它可支持以太網(wǎng)之間的數(shù)據(jù)傳輸,并且具有RS232、RS485、USB等接口。文中圍繞嵌入式Linux環(huán)境(ARM920T)最小系統(tǒng)的硬件通信平臺,從而了嵌入式通信。

          2 最小系統(tǒng)分析
          Motorola公司的MC9328MXl是以ARM920T為內(nèi)核的高性價(jià)比16/32位RISC微控制器,內(nèi)含一個(gè)ARM公司設(shè)計(jì)的16/32位ARM920T RISC處理器核,ARM920T為低功耗,高性能16/32位核,最適合于對價(jià)格及功耗敏感的應(yīng)用場合。除了ARM920T核以外,MC9328MXl還包含了許多外圍功能模塊。處理器和這些模塊都集成在核心板上,其具體結(jié)構(gòu)如圖1所示。

          由圖1可見,除了ARM920TDMI內(nèi)核外,MC9328MXl還集成了多個(gè)外圍功能模塊:一個(gè)LCD控制器、一個(gè)脈沖調(diào)制控制器、一個(gè)USB控制器及多個(gè)擴(kuò)展通道,但是沒有集成用于網(wǎng)絡(luò)通信的以太網(wǎng)控制器。所以,需要設(shè)計(jì)包含合適的以太網(wǎng)控制器的外圍電路。

          3 外圍電路設(shè)計(jì)
          本系統(tǒng)選用與MC9328MXl相匹配的CS8900A作為以太網(wǎng)控制器。CS8900A是Cirrus Logic公司生產(chǎn)的低功耗16位以太網(wǎng)控制器,功能強(qiáng)大。該器件的突出特點(diǎn)是使用靈活,其物理層接口、數(shù)據(jù)傳輸模式和工作模式等都能根據(jù)需要?jiǎng)討B(tài)調(diào)整,通過內(nèi)部寄存器的設(shè)置來適應(yīng)不同的應(yīng)用環(huán)境。
          CS8900A內(nèi)部結(jié)構(gòu)框圖如圖2所示,內(nèi)部功能模塊主要是802.3介質(zhì)訪問控制塊(MAC)。802.3介質(zhì)訪問控制塊支持全雙工工作模式,完全依照IEEE802.3以太網(wǎng)標(biāo)準(zhǔn),采用100引腳TQFP封裝,負(fù)責(zé)處理有關(guān)以太網(wǎng)數(shù)據(jù)幀的發(fā)送和接收,包括:沖突檢測、幀頭的產(chǎn)生和檢測、CRC校驗(yàn)碼的生成和驗(yàn)證。通過對發(fā)送控制寄存器(TxCMD)的初始化配置,MAC能自動完成幀的沖突后重傳。如果幀的數(shù)據(jù)部分少于46個(gè)字節(jié),它能生成填充字段使數(shù)據(jù)幀達(dá)到802.3所要求的最短長度。

          CS8900A的主要特點(diǎn)如下:
          符合IEEE802.3以太網(wǎng)標(biāo)準(zhǔn),并帶有ISA接口;
          片內(nèi)4KB RAM;
          適用于I/O工作模式、存儲器工作模式和DMA工作模式;
          帶有傳送、接收低通濾波的lOBase2T連接端口;
          支持lOBase2,lOBase5和lOBase2F的AUI接口;
          自動生成報(bào)頭,自動進(jìn)行CRC檢驗(yàn),沖突后自動重發(fā);
          最大電流消耗為55mA(5 V電源);
          全雙工工作模式;
          支持外部EEPROM。
          另外,要實(shí)現(xiàn)CS8900A與主機(jī)之間的數(shù)據(jù)通訊,在電路設(shè)計(jì)時(shí)可根據(jù)具體情況靈活選擇合適的數(shù)據(jù)傳輸模式。CS8900A支持的傳輸模式有:I/O模式和Memory模式,另外還有DMA模式。其中,I/O模式是訪問CS8900A存儲區(qū)的缺省模式,簡單易用。
          由MC9328MXl的引腳描述可以看出,MCU的數(shù)據(jù)是通過D[3l:0]傳輸?shù)模蕴W(wǎng)控制器CS8900A最多使用16位傳輸模式,所以MC9328MXl的數(shù)據(jù)總線前16位(D[15:0])應(yīng)與CS8900A的SD[O:15]相連,為解決速度不匹配的問題,需使用具有緩沖功能的總線收發(fā)器。從成本考慮,該系統(tǒng)采用兩個(gè)8位的74LS245。地址信息通過MC9328MXI地址總線接口的A[DO:03]與CS8900A的SA[00:03]通過緩沖器74HC244相連,A[04:19]與SA[04:19]直接相連用于設(shè)置網(wǎng)卡的初始基址。另外,CS8900A通過一個(gè)帶扼流線圈的隔離變壓器20F001N將CPU發(fā)送的數(shù)據(jù)(變比為l:1.414)發(fā)送到網(wǎng)絡(luò)上;接收數(shù)據(jù)時(shí),網(wǎng)絡(luò)傳送的數(shù)據(jù)經(jīng)過隔離變壓器(變比為1:1)。隔離變壓器的作用主要是將外部線路與CS8900A隔開,防止干擾和燒壞元件,實(shí)現(xiàn)帶電的插拔功能。XTALl與XTAL2之間的晶振為CS8900A提供穩(wěn)定的時(shí)鐘脈沖。其電路圖如圖3所示。

          4 基于嵌入式Linux的Socket通信
          基于嵌入式Linux的開發(fā)環(huán)境一般由裝有交叉編譯器的PC機(jī)和硬件開發(fā)板組成。本設(shè)計(jì)以PC宿主機(jī)作為客戶端,以MC9328MXl的開發(fā)板作為服務(wù)器實(shí)現(xiàn)通信。先由PC機(jī)將客戶機(jī)程序(server)編譯好后,通過串口寫入開發(fā)板,然后將開發(fā)板與PC機(jī)通過以太網(wǎng)口建立連接。
          Socket(套接字)是通過標(biāo)準(zhǔn)UNIX文件描述符和其他程序通訊的一個(gè)方法,其實(shí)質(zhì)是提供了進(jìn)程通信的端點(diǎn),可以看作是一種特殊的管道。通過Sock-et編程可以實(shí)現(xiàn)網(wǎng)絡(luò)通信。一個(gè)完整的套接字有一個(gè)相關(guān)的描述:協(xié)議、本地地址、本地端口、遠(yuǎn)程地址、遠(yuǎn)程端口。
          通用套接口地址結(jié)構(gòu)struct sockaddr的定義如下:


          套接字操作函數(shù)主要有:
          (1)創(chuàng)建一個(gè)Sockets
          sockfd=socket (family,type,protocol)
          其中由地址類(family)參數(shù)指定該Socket使用的地址類。由類型(type)參數(shù)規(guī)定所請求的通信類型。協(xié)議(protocol)參數(shù)一般為零,使得默認(rèn)的協(xié)議將自動被選取。
          (2)連接本地地址
          本函數(shù)的主要功能是將一個(gè)規(guī)定的地址與一個(gè)Sockets結(jié)合,一個(gè)服務(wù)進(jìn)程要使用如下函數(shù):bind(sockfd,address,addrlen)其中,sockfd參數(shù)是由socket()調(diào)用返回的sockets描述符。address指向一個(gè)地址結(jié)構(gòu),addrlen參數(shù)規(guī)定了地址的字節(jié)長度。
          (3)客戶進(jìn)程連接到服務(wù)進(jìn)程
          用此函數(shù)實(shí)現(xiàn)客戶進(jìn)程對服務(wù)進(jìn)程連接的初始化。此系統(tǒng)調(diào)用是:
          connect(sockfd,address,addrlen)
          其中,sockfd是本地Sockets的Sockets描述符。address規(guī)定目的機(jī)上服務(wù)進(jìn)程正在使用的地址,addrlen規(guī)定了地址的字節(jié)長度。
          當(dāng)connect()函數(shù)被調(diào)用時(shí),如果客戶的Sockets還沒有結(jié)合到一個(gè)本地地址,則系統(tǒng)自動選擇一個(gè)本地地址和一個(gè)適當(dāng)?shù)亩丝谔?,并且把它們和該客戶的Sockets相結(jié)合。
          (4)網(wǎng)絡(luò)監(jiān)聽
          int listen(int sockfd,int backlog);
          sockfd是Socket系統(tǒng)調(diào)用返回的Socket描述符;backlog指定在請求隊(duì)列中允許的最大請求數(shù),進(jìn)入的連接請求將在隊(duì)列中等待accept ()(參考下文)。backlog對隊(duì)列中等待服務(wù)的請求的數(shù)目進(jìn)行了限制,大多數(shù)系統(tǒng)缺省值為20。如果一個(gè)服務(wù)請求到來時(shí),輸入隊(duì)列已滿,該Socket將拒絕連接請求,客戶將收到一個(gè)出錯(cuò)信息。當(dāng)出現(xiàn)錯(cuò)誤時(shí)listen函數(shù)返回-l,并置相應(yīng)的errno錯(cuò)誤碼。
          (5)接收請求函數(shù)
          accept()函數(shù)讓服務(wù)器接收客戶的連接請求。在建立好輸入隊(duì)列后,服務(wù)器就調(diào)用accept函數(shù),然后睡眠并等待客戶的連接請求。
          int accept(int sockfd,void*addr,int*addrlen);
          sockfd是被監(jiān)聽的Socket描述符,addr通常是一個(gè)指向sockaddr_in變量的指針,該變量用來存放提出連接請求服務(wù)的主機(jī)的信息;addrlen通常為一個(gè)指向值為sizeof(struct sockaddr_in)的整型指針變量。
          (6)數(shù)據(jù)傳輸
          Send()和Recv()這兩個(gè)函數(shù)應(yīng)用于面向連接的Socket上進(jìn)行數(shù)據(jù)傳輸。
          Send()函數(shù)原型為:int send(int sockfd,const void*msg,int len,int flags);sockfd是用來傳輸數(shù)據(jù)的socket描述符;msg是一個(gè)指向要發(fā)送數(shù)據(jù)的指針;len是以字節(jié)為單位的數(shù)據(jù)長度;flags一般情況下置為0。
          Recv ()函數(shù)原型為:int Recv(int sockfd,void*buf int len,unsigned int flags);sockfd是接受數(shù)據(jù)的Socket描述符;buf是存放接收數(shù)據(jù)的緩沖區(qū);len是緩沖的長度。flags也被置為O。Recv()返回實(shí)際上接收的字節(jié)數(shù),當(dāng)出現(xiàn)錯(cuò)誤時(shí),返回-1并置相應(yīng)的errno值。
          本部分設(shè)計(jì)的目的是通過分析Socket的編程方法,編寫一個(gè)服務(wù)器程序server,用arm-linux-gcc編譯后運(yùn)行在ARM開發(fā)板上,一個(gè)客戶端程序client用gcc編譯后在PC上運(yùn)行。
          總體編程模型即客戶機(jī)與服務(wù)器的通信過程見圖4。

          4.1 服務(wù)器端
          (1)初始化

          4.2 客戶機(jī)端
          (1)通過服務(wù)器域名獲得服務(wù)器的IP地址


          函數(shù)gethostbyname ()是完成域名轉(zhuǎn)換的。當(dāng)gethostname()調(diào)用成功時(shí),返回指向struct hosten的指針,當(dāng)調(diào)用失敗時(shí)返回-1。
          (2)創(chuàng)建一個(gè)Socket(實(shí)現(xiàn)方法與服務(wù)器端相同)
          (3)與服務(wù)器建立連接


          這樣,給ARM開發(fā)板CS8900A網(wǎng)卡分配地址,并且編譯server和client程序后,可以將開發(fā)板用作服務(wù)器,PC用作客戶端,實(shí)現(xiàn)兩者的通信。


          5 結(jié)束語
          本文設(shè)計(jì)開發(fā)了基于MC9328MXl的以太網(wǎng)通信系統(tǒng),并利用嵌入式linux操作系統(tǒng)強(qiáng)大的網(wǎng)絡(luò)功能實(shí)現(xiàn)了Socket通信。文中的客戶端應(yīng)用程序已經(jīng)在基于ARM9TDMI核的MC9328MXl處理器的嵌入式開發(fā)平臺上成功運(yùn)行,應(yīng)用宿主PC機(jī)的服務(wù)器端應(yīng)用程序成功實(shí)現(xiàn)了Socket通信。當(dāng)然,也可以把目標(biāo)硬件開發(fā)平臺當(dāng)作服務(wù)器端,而把宿主PC機(jī)當(dāng)作客戶端來進(jìn)行雙向文件傳輸。

          linux相關(guān)文章:linux教程


          數(shù)字通信相關(guān)文章:數(shù)字通信原理


          通信相關(guān)文章:通信原理




          評論


          相關(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); })();