一種8路串口轉(zhuǎn)換PCI總線的設(shè)計(jì)方案
1 引言
隨著Internet的發(fā)展,越來(lái)越多的計(jì)算機(jī)或設(shè)備通過(guò)串口通信方式接入網(wǎng)絡(luò),實(shí)現(xiàn)信息共享和設(shè)備的集中控制和管理。多端口擴(kuò)展已成為通信設(shè)備接入的重要環(huán)節(jié)。利用串口進(jìn)行通信具有結(jié)構(gòu)簡(jiǎn)單,線路成本低的優(yōu)點(diǎn),廣泛應(yīng)用于各個(gè)領(lǐng)域。而PCI總線,即外圍器件互連總線,是目前應(yīng)用最廣泛、最流行的一種高速同步總線。由于大部分I/O設(shè)備是沒有PCI總線功能的,開發(fā)多端口通用串口和PCI總線的接口卡也就成為技術(shù)發(fā)展的必然要求。本系統(tǒng)采用專用芯片XR17D158開發(fā)了基于PCI總線的8路RS-232高速串行通訊卡,為通信設(shè)備提供額外的高性能串行接口,適用于連接各類串行設(shè)備。
2系統(tǒng)硬件設(shè)計(jì)
系統(tǒng)硬件主要包括主芯片XR17D158、8路UART接口和串行配置寄存器EEPROM。2.1 XR17D158模塊介紹
在很多通信系統(tǒng)中,對(duì)信號(hào)傳輸?shù)膸捄退俣扔泻芎芨叩囊?,而PCI總線非常適合將高速信號(hào)經(jīng)接口芯片和主機(jī)橋接在一起。本文采用Exar公司推出的一種兼容3.3V和5V的PCI總線UART芯片XR17D158, 它具有PCI接口和UART結(jié)構(gòu),滿足PCI2.3規(guī)范,工作頻率為33MHz,32位的數(shù)據(jù)總線可以充分利用CPU帶寬,傳送/接收更多數(shù)據(jù),支持8個(gè)通道UART轉(zhuǎn)換PCI,減少系統(tǒng)開銷、節(jié)約了電路板空間。為下載CPU的處理信息,每一個(gè)通道都擁有帶可編程觸發(fā)電平的64字節(jié)發(fā)送/接收緩沖FIFO,可分別以高達(dá)921.6kbps的速率對(duì)波特率進(jìn)行編程。
500)this.style.width=500;" border=0>
2.2 XR17D158寄存器配置
XR17D158具有三組不同的寄存器。
(1)PCI局部總線配置空間寄存器 PCI插卡插入系統(tǒng)后,系統(tǒng)BIOS將根據(jù)讀到的插卡信息并結(jié)合系統(tǒng)情況為插卡分配存儲(chǔ)地址、端口地址和中斷等信息,實(shí)現(xiàn)即插即用的自動(dòng)配置,從而免除了人工操作,這些信息都保存在外接的EEPROM中,在上電時(shí)XR17D158會(huì)檢測(cè)EEPROM是否有效,系統(tǒng)以此來(lái)標(biāo)識(shí)PCI卡;
(2)設(shè)備配置寄存器 提供從PCI數(shù)據(jù)總線向每一UART通道的接收/發(fā)送數(shù)據(jù)FIFO緩沖存儲(chǔ)器的傳輸方式,它提供了對(duì)UART傳輸和各種功能狀態(tài)的監(jiān)控。寄存器占用4k PCI總線存儲(chǔ)器地址空間。這些地址由基址加上偏移量得到,偏移量保存在PCI局部總線配置寄存器的BAR寄存器0x10[31:12]。這些寄存器控制或監(jiān)控所有8通道UART的功能狀態(tài)信息,包括中斷控制和狀態(tài),16位通用定時(shí)器控制和狀態(tài),多用途輸入/輸出控制和狀態(tài),休眠模式控制,軟復(fù)位控制以及設(shè)備標(biāo)識(shí)和版本號(hào)信息等等;
(3)UART[7:0]配置寄存器 每路UART通道都有內(nèi)部UART配置寄存器作為串行數(shù)據(jù)傳輸控制和狀態(tài)信息指示,所有8組通道寄存器嵌入設(shè)備配置寄存器空間,其寄存器配置偏移地址為:UART[M]=0x00N00,其中M表示通道序號(hào),N=2×M。
XR17D158有8路UART[7:0],每路通道都有深度為64的發(fā)送/接收緩沖FIFO,符合16550規(guī)范的控制/狀態(tài)寄存器以及為每路UART通道提供發(fā)送/接收時(shí)鐘的波特率發(fā)生器。
每路通道都有單獨(dú)的具有預(yù)分頻的可編程波特率發(fā)生器(BRG),用以獲得16X或8X的串口數(shù)據(jù)接收/發(fā)送的采樣時(shí)鐘。預(yù)分頻系數(shù)可由軟件在MCR寄存器中設(shè)置,MCR[7]=0,預(yù)分頻系數(shù)為1;MCR[7]=1,預(yù)分頻系數(shù)為4。經(jīng)過(guò)預(yù)分頻得到的時(shí)鐘還要經(jīng)過(guò)內(nèi)置的分頻器分頻,以獲得所需要的發(fā)送/接收時(shí)鐘信號(hào),其中分頻器的分頻系數(shù)由每路UART通道的DLM和DLL寄存器編程得到,波特率由下面公式計(jì)算得到:
500)this.style.width=500;" border=0>
假設(shè)外部輸入時(shí)鐘為14.7456MHz,通過(guò)相應(yīng)的寄存器設(shè)置,使RS-232通道得到最大波特率921.1kps。編程過(guò)程如下:
(1)使能DLM,DLL寄存器 寫入0x80到相應(yīng)UART通道的LCR寄存器;
(2)分頻系數(shù)確定 設(shè)置DLM=00,DLL=01;
(3)設(shè)定預(yù)分頻系數(shù)相關(guān)寄存器MCR
a.使能MCR[7:5] 設(shè)置UART通道EFR寄存器EFR[4]=1;
b.預(yù)分頻系數(shù)的設(shè)定 設(shè)置MCR[7]=0;
c.鎖存MCR寄存器設(shè)置 設(shè)置EFR[4]=0;
2.3 8路UART和XR17D158接口設(shè)計(jì)
由于RS-232的TTL電平與芯片的CMOS電平不兼容,所以兩者之間需要加電平轉(zhuǎn)換電路。本系統(tǒng)采用TI公司的MAX3238芯片實(shí)現(xiàn)電平轉(zhuǎn)換及串口通信功能;兼容5V邏輯輸入,內(nèi)含3路接收、5路發(fā)送串行通信接口,最大數(shù)據(jù)傳輸速率可達(dá)250Kbps。具有低功耗、高數(shù)據(jù)速率、增強(qiáng)型ESD保護(hù)等特性。
XR17D158的UART接口就像一個(gè)8位的輸入和輸出端口,它可以從發(fā)送緩沖FIFO或者接收緩沖FIFO中讀寫數(shù)據(jù)。當(dāng)主機(jī)有數(shù)據(jù)要發(fā)送時(shí),它只需將數(shù)據(jù)按字節(jié)格式(8位寬)發(fā)送到UART即可。當(dāng)UART接收到來(lái)自外部串行設(shè)備的數(shù)據(jù)時(shí),會(huì)把數(shù)據(jù)緩存在其FIFO中(同樣是8位寬),然后通過(guò)一個(gè)內(nèi)部寄存器位或硬件中斷信號(hào)向主機(jī)指示該數(shù)據(jù)已可以使用。另外,XR17D158的UART接口還具有完整的調(diào)制解調(diào)控制功能,包括:容許發(fā)送(CTS);請(qǐng)求發(fā)送(RTS);數(shù)據(jù)設(shè)備準(zhǔn)備好(DSR);數(shù)據(jù)終端準(zhǔn)備好(DTR);振鈴指示(RI);載波檢測(cè)(DCD)。本文只給出了一路UART和主芯片接口,其他幾路類似。
500)this.style.width=500;" border=0>
2.4 UART接口工作過(guò)程
發(fā)送數(shù)據(jù)過(guò)程 有效數(shù)據(jù)(64位)由主機(jī)寫入接口中的輸入緩沖FIFO寄存器,當(dāng)發(fā)送保持寄存器(THR)清空標(biāo)志位ISR[1]=1,表示發(fā)送緩沖FIFO中的數(shù)據(jù)減少到滿足設(shè)定的觸發(fā)中斷條件而引起中斷,在輸出移位寄存器(TSR)中,由發(fā)送控制邏輯在待發(fā)送數(shù)據(jù)加上起始位、奇偶校驗(yàn)位和停止位,并按設(shè)定的時(shí)鐘頻率逐位移出數(shù)據(jù)。
接收數(shù)據(jù)過(guò)程 接收移位寄存器(RSR)使用16×或8×?xí)r鐘作為定時(shí)器,當(dāng)檢測(cè)到起始位下降沿時(shí),將計(jì)數(shù)器清零,并開始采用時(shí)鐘計(jì)數(shù),當(dāng)計(jì)數(shù)器計(jì)到8或4時(shí),表示已到達(dá)起始位的中間位置,此時(shí)采樣值仍為0,說(shuō)明是真正的起始位,余下的數(shù)據(jù)位和停止位隨后也被采樣。如果停止位采樣正確(采樣值為1),則字符被接收,并裝入接收保持寄存器(RHR),如果接收到的數(shù)據(jù)未達(dá)到設(shè)定的FIFO觸發(fā)條件,RHR產(chǎn)生以接收數(shù)據(jù)準(zhǔn)備好中斷(ISR[2]=1),同時(shí)流向控制信號(hào)RTS# / DTR#繼續(xù)保持有效,允許UART接口繼續(xù)接收外部串行數(shù)據(jù)。
PCI總線接收/發(fā)送數(shù)據(jù)
XR17D158支持在映射的存儲(chǔ)器地址進(jìn)行PCI突發(fā)模式讀/寫,接收緩沖FIFO和發(fā)送緩沖FIFO可以對(duì)這些獨(dú)立的存儲(chǔ)器進(jìn)行讀/寫,這些存儲(chǔ)器地址可以通過(guò)計(jì)算得到:M=2N+1,其中N為UART通道序號(hào)。
主機(jī)利用PCI總線從XR17D158的接收緩沖FIFO讀取數(shù)據(jù)一般有兩種方式:查詢方式和中斷方式。無(wú)論采取哪種方式,在讀取緩沖FIFO數(shù)據(jù)之前必須先讀取設(shè)備的配置寄存器中設(shè)備ID寄存器(DVID),得到確認(rèn)之后帶有狀態(tài)的FIFO寄存器中的數(shù)據(jù)才能被讀取。如果在這過(guò)程中,還有其他UART通道寄存器數(shù)據(jù)需要被讀取,必須重復(fù)讀取設(shè)備ID寄存器(DVID),確認(rèn)UART通道類型,再進(jìn)行其他操作。這兩種實(shí)現(xiàn)方式編程步驟如下:
(1)查詢方式
a.讀取線路狀態(tài)寄存器(LSR)
b.讀取設(shè)備號(hào)(DVID)
c.讀取帶有狀態(tài)信息的FIFO數(shù)據(jù)
(2)中斷實(shí)現(xiàn)方式
a.讀取全局中斷寄存器INT0(地址0x080)
b.讀取INT1,INT2,INT3寄存器用以確定中斷通道(地址0x081-0x083)
c.讀取設(shè)備號(hào)(DVID)
d.讀取帶有狀態(tài)信息的接收FIFO數(shù)據(jù)
特別注意的是,當(dāng)主機(jī)讀取接收到的帶有線路狀態(tài)寄存器(LSR)信息的數(shù)據(jù)時(shí),主機(jī)必須以16位或32字節(jié)的形式讀取數(shù)據(jù),這樣做的目的是為了保證帶有差錯(cuò)標(biāo)記的數(shù)據(jù)的完整性。
3 驅(qū)動(dòng)程序設(shè)計(jì)
基于Windows NT串口通信驅(qū)動(dòng)程序設(shè)計(jì)中,應(yīng)用較廣泛的有:利用MSCOMM控件進(jìn)行編程;利用Windows API函數(shù)進(jìn)行設(shè)計(jì)。串口通信Microsoft Communications Control(簡(jiǎn)稱為MSComm)是Microsoft公司提供的簡(jiǎn)化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過(guò)串行接口收發(fā)數(shù)據(jù)的簡(jiǎn)便方法。MSComm控件通過(guò)串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通訊功能。而用Windows API通信較為復(fù)雜,其中要涉及到對(duì)Windows內(nèi)核機(jī)制的理解,但Windows API函數(shù)用于串口操作流程可以擴(kuò)展到其他硬件的操作上。本設(shè)計(jì)選用Windows API函數(shù)來(lái)實(shí)現(xiàn)串口操作。
非標(biāo)準(zhǔn)串行驅(qū)動(dòng)在I/0管理器中被注冊(cè),以COM5,COM6,COM7……COM12來(lái)命名,對(duì)應(yīng)于XR17D158的CH0,CH1,CH3,……CH7。一般不采用COM1,COM2,COM3,COM4,因?yàn)檫@些端口有可能被其他串口通信設(shè)備占用。根據(jù)WINDOWS NT DDK,我們可以發(fā)現(xiàn),通信口在COM9以上命名的,必須以“\\.\COM10”來(lái)定義,我們?cè)趯懘隍?qū)動(dòng)程序時(shí),首先要調(diào)用windows API函數(shù)CreateFile打開相應(yīng)的串行口。下一步使用文件句柄訪問硬件設(shè)備,通信完成時(shí)用CloseHandle關(guān)閉串行口。以下是兩個(gè)關(guān)鍵成員函數(shù),一個(gè)是打開串口函數(shù),另外一個(gè)是簡(jiǎn)單串口讀/寫函數(shù)。
(1)打開串口函數(shù)
PortHandle=NULL;//初始化端口
If(cPortNo=9)
ComName.Format(“COM%d”,cPortNo);
Else
ComNamel.Format(“\\.\COM%d”,cPortNo);
//如果串口序號(hào)大于9則以“\\.\COM10”來(lái)定義
If((PortHandle=CreateFile(ComName,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FILE_
FLAGE_OVERLAPPED,0))= =INVALD_HANDLE_VALUE //非重疊讀/寫端口
{
DWORD err=GetLastError();
Return(NULL); //端口建立失敗
}
Else
{
//端口建立成功,初始化端口,對(duì)端口進(jìn)行操作
}
(2)串口讀/寫函數(shù)
//讀數(shù)據(jù)到緩沖區(qū)
ReadFile(PortHandle,(LPVOID)IpReadBuff,dwFileSize,dwBytesRead,osRead);
//寫操作
Int bResult=WriteFile(PortHandle,(LPVOID)IpWriteBuff,dwBytesToWrite,dwBytesWritten,osWrite) //重疊IO寫操作
函數(shù)中各參數(shù)定義如下:PortHandle,為待操作串口,(LPVOID)IpReadBuff數(shù)據(jù)讀緩沖區(qū),dwFileSize待讀字節(jié)數(shù),dwBytesRead讀取字節(jié)數(shù),osRead溢出緩沖區(qū);,(LPVOID)IpWriteBuff數(shù)據(jù)寫緩沖區(qū),dwBytesToWrite待寫字節(jié)數(shù),dwBytesWritten已經(jīng)寫入字節(jié)數(shù),osWrite溢出緩沖區(qū)。
4 結(jié)論
本文提供了一種8口UART串口轉(zhuǎn)換PCI總線的方法,介紹了硬件的實(shí)現(xiàn)和驅(qū)動(dòng)程序的實(shí)現(xiàn)。經(jīng)測(cè)試該適配卡工作穩(wěn)定,性能可靠,波特率最高可達(dá)921.6kb/s,吞吐量達(dá)700kb/s,達(dá)到了預(yù)期設(shè)計(jì)目標(biāo),可廣泛應(yīng)用于POS機(jī),系統(tǒng)監(jiān)控,便攜式通訊等系統(tǒng)。
本文作者創(chuàng)新點(diǎn):利用XR17D158芯片實(shí)現(xiàn)PCI總線和 8路串口之間的通信,該適配卡結(jié)構(gòu)緊湊,通信距離可達(dá)15米,實(shí)現(xiàn)了PnP(即插即用)功能,驅(qū)動(dòng)程序可在Windows /98/2000/ME/XP使用,最多可支持接8個(gè)設(shè)備的通訊,解決了大部分I/O設(shè)備沒有PCI總線接口的問題。
pos機(jī)相關(guān)文章:pos機(jī)原理
分頻器相關(guān)文章:分頻器原理
評(píng)論