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