<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 一種8路串口轉換PCI總線(xiàn)的設計方案

一種8路串口轉換PCI總線(xiàn)的設計方案

作者: 時(shí)間:2011-07-20 來(lái)源:網(wǎng)絡(luò ) 收藏

1 引言

隨著(zhù)Internet的發(fā)展,越來(lái)越多的計算機或設備通過(guò)串口通信方式接入網(wǎng)絡(luò ),實(shí)現信息共享和設備的集中控制和管理。多端口擴展已成為通信設備接入的重要環(huán)節。利用串口進(jìn)行通信具有結構簡(jiǎn)單,線(xiàn)路成本低的優(yōu)點(diǎn),廣泛應用于各個(gè)領(lǐng)域。而,即外圍器件互連總線(xiàn),是目前應用最廣泛、最流行的一種高速同步總線(xiàn)。由于大部分I/O設備是沒(méi)有功能的,開(kāi)發(fā)多端口通用串口和的接口卡也就成為技術(shù)發(fā)展的必然要求。本系統采用專(zhuān)用芯片XR17D158開(kāi)發(fā)了基于PCI總線(xiàn)的8路RS-232高速串行通訊卡,為通信設備提供額外的高性能串行接口,適用于連接各類(lèi)串行設備。

2系統硬件設計

系統硬件主要包括主芯片XR17D158、8路接口和串行配置寄存器EEPROM。2.1 XR17D158模塊介紹

在很多通信系統中,對信號傳輸的帶寬和速度有很很高的要求,而PCI總線(xiàn)非常適合將高速信號經(jīng)接口芯片和主機橋接在一起。本文采用Exar公司推出的一種兼容3.3V和5V的PCI總線(xiàn)芯片XR17D158, 它具有PCI接口和結構,滿(mǎn)足PCI2.3規范,工作頻率為33MHz,32位的數據總線(xiàn)可以充分利用CPU帶寬,傳送/接收更多數據,支持8個(gè)通道UART轉換PCI,減少系統開(kāi)銷(xiāo)、節約了電路板空間。為下載CPU的處理信息,每一個(gè)通道都擁有帶可編程觸發(fā)電平的64字節發(fā)送/接收緩沖,可分別以高達921.6kbps的速率對波特率進(jìn)行編程。

500)this.style.width=500;" border=0>

2.2 XR17D158寄存器配置

XR17D158具有三組不同的寄存器。

(1)PCI局部總線(xiàn)配置空間寄存器 PCI插卡插入系統后,系統BIOS將根據讀到的插卡信息并結合系統情況為插卡分配存儲地址、端口地址和中斷等信息,實(shí)現即插即用的自動(dòng)配置,從而免除了人工操作,這些信息都保存在外接的EEPROM中,在上電時(shí)XR17D158會(huì )檢測EEPROM是否有效,系統以此來(lái)標識PCI卡;

(2)設備配置寄存器 提供從PCI數據總線(xiàn)向每一UART通道的接收/發(fā)送數據緩沖存儲器的傳輸方式,它提供了對UART傳輸和各種功能狀態(tài)的監控。寄存器占用4k PCI總線(xiàn)存儲器地址空間。這些地址由基址加上偏移量得到,偏移量保存在PCI局部總線(xiàn)配置寄存器的BAR寄存器0x10[31:12]。這些寄存器控制或監控所有8通道UART的功能狀態(tài)信息,包括中斷控制和狀態(tài),16位通用定時(shí)器控制和狀態(tài),多用途輸入/輸出控制和狀態(tài),休眠模式控制,軟復位控制以及設備標識和版本號信息等等;

(3)UART[7:0]配置寄存器 每路UART通道都有內部UART配置寄存器作為串行數據傳輸控制和狀態(tài)信息指示,所有8組通道寄存器嵌入設備配置寄存器空間,其寄存器配置偏移地址為:UART[M]=0x00N00,其中M表示通道序號,N=2×M。

XR17D158有8路UART[7:0],每路通道都有深度為64的發(fā)送/接收緩沖,符合16550規范的控制/狀態(tài)寄存器以及為每路UART通道提供發(fā)送/接收時(shí)鐘的波特率發(fā)生器。

每路通道都有單獨的具有預分頻的可編程波特率發(fā)生器(BRG),用以獲得16X或8X的串口數據接收/發(fā)送的采樣時(shí)鐘。預分頻系數可由軟件在MCR寄存器中設置,MCR[7]=0,預分頻系數為1;MCR[7]=1,預分頻系數為4。經(jīng)過(guò)預分頻得到的時(shí)鐘還要經(jīng)過(guò)內置的分頻器分頻,以獲得所需要的發(fā)送/接收時(shí)鐘信號,其中分頻器的分頻系數由每路UART通道的DLM和DLL寄存器編程得到,波特率由下面公式計算得到:

500)this.style.width=500;" border=0>

假設外部輸入時(shí)鐘為14.7456MHz,通過(guò)相應的寄存器設置,使RS-232通道得到最大波特率921.1kps。編程過(guò)程如下:

(1)使能DLM,DLL寄存器 寫(xiě)入0x80到相應UART通道的LCR寄存器;

(2)分頻系數確定 設置DLM=00,DLL=01;

(3)設定預分頻系數相關(guān)寄存器MCR

a.使能MCR[7:5] 設置UART通道EFR寄存器EFR[4]=1;

b.預分頻系數的設定 設置MCR[7]=0;

c.鎖存MCR寄存器設置 設置EFR[4]=0;

2.3 8路UART和XR17D158接口設計

由于RS-232的TTL電平與芯片的CMOS電平不兼容,所以?xún)烧咧g需要加電平轉換電路。本系統采用TI公司的MAX3238芯片實(shí)現電平轉換及串口通信功能;兼容5V邏輯輸入,內含3路接收、5路發(fā)送串行通信接口,最大數據傳輸速率可達250Kbps。具有低功耗、高數據速率、增強型ESD保護等特性。

XR17D158的UART接口就像一個(gè)8位的輸入和輸出端口,它可以從發(fā)送緩沖FIFO或者接收緩沖FIFO中讀寫(xiě)數據。當主機有數據要發(fā)送時(shí),它只需將數據按字節格式(8位寬)發(fā)送到UART即可。當UART接收到來(lái)自外部串行設備的數據時(shí),會(huì )把數據緩存在其FIFO中(同樣是8位寬),然后通過(guò)一個(gè)內部寄存器位或硬件中斷信號向主機指示該數據已可以使用。另外,XR17D158的UART接口還具有完整的調制解調控制功能,包括:容許發(fā)送(CTS);請求發(fā)送(RTS);數據設備準備好(DSR);數據終端準備好(DTR);振鈴指示(RI);載波檢測(DCD)。本文只給出了一路UART和主芯片接口,其他幾路類(lèi)似。

500)this.style.width=500;" border=0>

2.4 UART接口工作過(guò)程

發(fā)送數據過(guò)程 有效數據(64位)由主機寫(xiě)入接口中的輸入緩沖FIFO寄存器,當發(fā)送保持寄存器(THR)清空標志位ISR[1]=1,表示發(fā)送緩沖FIFO中的數據減少到滿(mǎn)足設定的觸發(fā)中斷條件而引起中斷,在輸出移位寄存器(TSR)中,由發(fā)送控制邏輯在待發(fā)送數據加上起始位、奇偶校驗位和停止位,并按設定的時(shí)鐘頻率逐位移出數據。

接收數據過(guò)程 接收移位寄存器(RSR)使用16×或8×時(shí)鐘作為定時(shí)器,當檢測到起始位下降沿時(shí),將計數器清零,并開(kāi)始采用時(shí)鐘計數,當計數器計到8或4時(shí),表示已到達起始位的中間位置,此時(shí)采樣值仍為0,說(shuō)明是真正的起始位,余下的數據位和停止位隨后也被采樣。如果停止位采樣正確(采樣值為1),則字符被接收,并裝入接收保持寄存器(RHR),如果接收到的數據未達到設定的FIFO觸發(fā)條件,RHR產(chǎn)生以接收數據準備好中斷(ISR[2]=1),同時(shí)流向控制信號RTS# / DTR#繼續保持有效,允許UART接口繼續接收外部串行數據。

PCI總線(xiàn)接收/發(fā)送數據

XR17D158支持在映射的存儲器地址進(jìn)行PCI突發(fā)模式讀/寫(xiě),接收緩沖FIFO和發(fā)送緩沖FIFO可以對這些獨立的存儲器進(jìn)行讀/寫(xiě),這些存儲器地址可以通過(guò)計算得到:M=2N+1,其中N為UART通道序號。

主機利用PCI總線(xiàn)從XR17D158的接收緩沖FIFO讀取數據一般有兩種方式:查詢(xún)方式和中斷方式。無(wú)論采取哪種方式,在讀取緩沖FIFO數據之前必須先讀取設備的配置寄存器中設備ID寄存器(DVID),得到確認之后帶有狀態(tài)的FIFO寄存器中的數據才能被讀取。如果在這過(guò)程中,還有其他UART通道寄存器數據需要被讀取,必須重復讀取設備ID寄存器(DVID),確認UART通道類(lèi)型,再進(jìn)行其他操作。這兩種實(shí)現方式編程步驟如下:

(1)查詢(xún)方式

a.讀取線(xiàn)路狀態(tài)寄存器(LSR)

b.讀取設備號(DVID)

c.讀取帶有狀態(tài)信息的FIFO數據

(2)中斷實(shí)現方式

a.讀取全局中斷寄存器INT0(地址0x080)

b.讀取INT1,INT2,INT3寄存器用以確定中斷通道(地址0x081-0x083)

c.讀取設備號(DVID)

d.讀取帶有狀態(tài)信息的接收FIFO數據

特別注意的是,當主機讀取接收到的帶有線(xiàn)路狀態(tài)寄存器(LSR)信息的數據時(shí),主機必須以16位或32字節的形式讀取數據,這樣做的目的是為了保證帶有差錯標記的數據的完整性。

3 驅動(dòng)程序設計

基于Windows NT串口通信驅動(dòng)程序設計中,應用較廣泛的有:利用MSCOMM控件進(jìn)行編程;利用Windows API函數進(jìn)行設計。串口通信Microsoft Communications Control(簡(jiǎn)稱(chēng)為MSComm)是Microsoft公司提供的簡(jiǎn)化Windows下串行通信編程的ActiveX控件,它為應用程序提供了通過(guò)串行接口收發(fā)數據的簡(jiǎn)便方法。MSComm控件通過(guò)串行端口傳輸和接收數據,為應用程序提供串行通訊功能。而用Windows API通信較為復雜,其中要涉及到對Windows內核機制的理解,但Windows API函數用于串口操作流程可以擴展到其他硬件的操作上。本設計選用Windows API函數來(lái)實(shí)現串口操作。

非標準串行驅動(dòng)在I/0管理器中被注冊,以COM5,COM6,COM7……COM12來(lái)命名,對應于XR17D158的CH0,CH1,CH3,……CH7。一般不采用COM1,COM2,COM3,COM4,因為這些端口有可能被其他串口通信設備占用。根據WINDOWS NT DDK,我們可以發(fā)現,通信口在COM9以上命名的,必須以“\\.\COM10”來(lái)定義,我們在寫(xiě)串口驅動(dòng)程序時(shí),首先要調用windows API函數CreateFile打開(kāi)相應的串行口。下一步使用文件句柄訪(fǎng)問(wèn)硬件設備,通信完成時(shí)用CloseHandle關(guān)閉串行口。以下是兩個(gè)關(guān)鍵成員函數,一個(gè)是打開(kāi)串口函數,另外一個(gè)是簡(jiǎn)單串口讀/寫(xiě)函數。

(1)打開(kāi)串口函數

PortHandle=NULL;//初始化端口

If(cPortNo=9)

ComName.Format(“COM%d”,cPortNo);

Else

ComNamel.Format(“\\.\COM%d”,cPortNo);

//如果串口序號大于9則以“\\.\COM10”來(lái)定義

If((PortHandle=CreateFile(ComName,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FILE_

FLAGE_OVERLAPPED,0))= =INVALD_HANDLE_VALUE //非重疊讀/寫(xiě)端口

{

DWORD err=GetLastError();

Return(NULL); //端口建立失敗

}

Else

{

//端口建立成功,初始化端口,對端口進(jìn)行操作

}

(2)串口讀/寫(xiě)函數

//讀數據到緩沖區

ReadFile(PortHandle,(LPVOID)IpReadBuff,dwFileSize,dwBytesRead,osRead);

//寫(xiě)操作

Int bResult=WriteFile(PortHandle,(LPVOID)IpWriteBuff,dwBytesToWrite,dwBytesWritten,osWrite) //重疊IO寫(xiě)操作

函數中各參數定義如下:PortHandle,為待操作串口,(LPVOID)IpReadBuff數據讀緩沖區,dwFileSize待讀字節數,dwBytesRead讀取字節數,osRead溢出緩沖區;,(LPVOID)IpWriteBuff數據寫(xiě)緩沖區,dwBytesToWrite待寫(xiě)字節數,dwBytesWritten已經(jīng)寫(xiě)入字節數,osWrite溢出緩沖區。

4 結論

本文提供了一種8口UART串口轉換PCI總線(xiàn)的方法,介紹了硬件的實(shí)現和驅動(dòng)程序的實(shí)現。經(jīng)測試該適配卡工作穩定,性能可靠,波特率最高可達921.6kb/s,吞吐量達700kb/s,達到了預期設計目標,可廣泛應用于POS機,系統監控,便攜式通訊等系統。

本文作者創(chuàng )新點(diǎn):利用XR17D158芯片實(shí)現PCI總線(xiàn)和 8路串口之間的通信,該適配卡結構緊湊,通信距離可達15米,實(shí)現了PnP(即插即用)功能,驅動(dòng)程序可在Windows /98/2000/ME/XP使用,最多可支持接8個(gè)設備的通訊,解決了大部分I/O設備沒(méi)有PCI總線(xiàn)接口的問(wèn)題。

pos機相關(guān)文章:pos機原理


分頻器相關(guān)文章:分頻器原理


關(guān)鍵詞: 多路串口 PCI總線(xiàn) UART FIFO

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>