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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于ARM9 的嵌入式多串口服務器設計

          基于ARM9 的嵌入式多串口服務器設計

          作者: 時間:2013-06-27 來源:網絡 收藏

          摘要:以20T 為內核的S3C2440A 作為主控制器和以太網控制芯片DM9000AEP 硬件平臺; 構建并移植適合系統(tǒng)的Linux 操作系統(tǒng),利用Linux 完善的TCP/IP 協(xié)議ARM 端的多線程網絡程序。實現(xiàn)RS-232C 與以太網口數(shù)據的雙向傳輸,使現(xiàn)有的智能儀器設備成功接入以太網。

          本文引用地址:http://www.ex-cimer.com/article/148006.htm

          隨著計算機網絡的發(fā)展和物聯(lián)網的興起,將智能儀器接入網絡已成為一種趨勢,以實現(xiàn)數(shù)據的共享與遠程管理。但是目前大多智能儀器使用的是異步串行通信接口RS-232C /485 /422,因此迫切需要一種能將異步串行通信協(xié)議轉換為以太網TCP /IP 協(xié)議的協(xié)議轉換器,使現(xiàn)有的串行通信設備方便地接入以太網,而不需要改變原有儀器設備的硬件。為此,筆者研究設計了微處理器和Linux 操作系統(tǒng)的。

          1 系統(tǒng)總體思路

          采用以20T 為內核的S3C2440A 微處理器運行Linux 操作系統(tǒng),使用100MBase-T 網絡在串行設備與遠端主機之間有效地進行傳輸數(shù)據,這樣通過串口服務器使串行設備快速接入以太網,利用以太網的TCP /IP 協(xié)議進行串口數(shù)據包的傳輸。嵌入式串口服務器作為以太網數(shù)據與串口數(shù)據之間交互的中間橋梁,負責數(shù)據的雙向透明傳送。服務器端的主要任務是在ARM 處理器中實現(xiàn)RS-232C /485 /422 轉TCP /IP 協(xié)議網關,完成對各端口的監(jiān)聽和數(shù)據的雙向傳輸,當端口有數(shù)據產生或客戶端有數(shù)據請求時啟動獨立線程,保證實時而又不丟失地進行數(shù)據傳輸。上述要求系統(tǒng)必須具備: 一套對網絡支持良好的嵌入式操作系統(tǒng),并且可根據專用的硬件平臺進行裁剪; 微處理器的運行速度與處理數(shù)據的能力優(yōu)秀,外圍芯片接口友好。

          筆者選用Linux 作為實時操作系統(tǒng),并進行移植與配置使其可以運行在以ARM9 為核心的硬件平臺上。S3C2440A 自帶三路串行通信口,完全能夠滿足多串口服務器的設計要求,但考慮到網絡數(shù)據傳輸與串口數(shù)據傳輸速率不匹配,需要在硬件板卡上擴展SDRAM 和NORFLASH,另外系統(tǒng)還需擴展以太網控制器芯片。系統(tǒng)的總體設計框架如圖1 所示。

          2 硬件電路

          系統(tǒng)可同時獨立地與兩路串行端口通信,當數(shù)據由以太網傳送給串口服務器時完成數(shù)據的存儲與數(shù)據格式的轉換與處理,為數(shù)據傳向指定的串行口做準備。當系統(tǒng)解包處理完成后,根據TCP /IP 協(xié)議的數(shù)據幀的幀頭信息就能獲得該數(shù)據包的發(fā)送目標串口,這樣就完成了從以太網到串行口數(shù)據的傳輸; 當數(shù)據由串口設備傳送到串口服務器時完成數(shù)據的分析、處理與格式轉換,為數(shù)據傳向以太網口做準備,當數(shù)據打包結束后將其從以太網口發(fā)送出去,這樣就完成了串行口到以太網數(shù)據的傳輸。

          2.1 S3C2440A 擴展以太網模塊電路

          DM9000AEP 是一款高集成度且成本較低的單片快速以太網媒體介質訪問層MAC 控制器,上有通用處理器接口,10M/100M 物理層和16KbyteSRAM,低功耗、高性能IO 管腳兼容3. 3 /5. 0V 電壓。DM9000AEP 合成了以太網MAC、物理層PHY 和MMU,內置AUTOMDI2X 功能10 /100MPHY,芯片可以根據處理器提供8 /16 /32bit 3 種連接方式實現(xiàn)以太網MAC 層和PHY 層) 的功能。

          在如圖2 所示的電路中, IOR#管腳接處理器的LnOE 讀信號端, IOW#接處理器的LnWE 寫信號端,CS#片選信號端接處理器的nGCS4 片選信號,SD0 ~ SD15 分別接處理器的數(shù)據總線,中斷信號INT 接處理器的EINT18 管腳,RX +、RX -、TX + 和TX – 分別是兩對差分收發(fā)信號線接帶有隔離變壓器的HR911105A 的RJ45 座連接,如圖3 所示。訪問網卡以總線形式實現(xiàn),網卡的IO 基址為300H,片選信號接在了NGCS4 上,所以網卡IO 的基址為0x20000300H.由“DM9000 地址端口= 高位片選地址+ 300H + 0; DM9000 數(shù)據端口= 高位片選地址+ 300H + 4”可知,DM9000 端口的端口地址為0×20000300,DM9000 數(shù)據的端口地址為0×20000304.S3C2440 通過數(shù)據端口與地址端口并結合讀/寫信號線就可以對DM9000 進行讀、寫操作了。圖2 中只用了一根地址線LADDR2,這是由DM9000AEP 的特性決定的,DM9000AEP 的地址信號和數(shù)據信號復用,使用CMD 引腳來區(qū)分它們( CMD 為低時數(shù)據總線上傳輸?shù)氖堑刂沸盘?,CMD 為高電平時傳輸?shù)氖菙?shù)據信號) .訪問DM9000AEP 內部寄存器時,需要將CMD 置為低電平,發(fā)出地址信號; 然后將CMD置為高電平,讀/寫數(shù)據。另外,總數(shù)位寬16 位,兩對差分接收與發(fā)送信號線,特別要注意的是:

          在PCB 布線時這兩對線必須走差分線,否則接收和發(fā)送數(shù)據將不穩(wěn)定,模擬地與數(shù)字地也要處理好。

          圖2 網卡接口電路

          2.2 S3C2440 串口模塊電路

          S3C2440 本身自帶三路獨立的UART 接口,在設計嵌入式串口服務器系統(tǒng)時,應用了S3C2440 串口模塊的兩路UART 接口,另外一路UART 接口做開發(fā)時的打印控制臺用。這兩路串行口用三線通信,采用MAX3232 作為電平轉換芯片,分別配置處理器的GPH2、CPH3、CPH4 和CPG5,4 個GPIO 口為TXD0、RXD0、TXD1 和RXD1 串口收發(fā)信號線。RS-232C 接口電路如圖4 所示。

          3 系統(tǒng)軟件

          系統(tǒng)軟件的設計目標: 嵌入式串口服務器能夠接收來自以太網的數(shù)據流,將以太網數(shù)據流轉換為串行口數(shù)據流發(fā)送給指定串口; 實現(xiàn)串口數(shù)據流到以太網數(shù)據流的逆過程。軟件平臺采用擁有完備TCP /IP 協(xié)議棧和豐富源碼資源的Linux作為串口服務器的操作系統(tǒng),在ARM9 上移植并裁剪Linux 系統(tǒng),同時移植完善根文件系統(tǒng),為應用層軟件開發(fā)提供平臺。應用程序軟件的主要任務如圖5 所示,通過Linux 系統(tǒng)調用接口、調用串口函數(shù)讀取數(shù)據,并將數(shù)據通過socket 接口發(fā)往以太網口; 接收socket 端數(shù)據、調用串口設備函數(shù),將數(shù)據發(fā)往指定串口。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關文章:linux教程


          tcp/ip相關文章:tcp/ip是什么



          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();