摘 要: 一種基于PCI總線的高速數(shù)據(jù)采集傳輸系統(tǒng)的實(shí)現(xiàn)方法。概述了PCI總線控制專用芯片CH365的主要特點(diǎn)及其本地硬件地址的實(shí)現(xiàn)方法,并給出了在12通道數(shù)據(jù)采集系統(tǒng)中的應(yīng)用實(shí)例。
關(guān)鍵詞: PCI總線 本地硬件地址 工作模式
PCI 總線是先進(jìn)的高性能32/64位局部總線,可同時(shí)支持多組外圍設(shè)備,不受制于處理器,數(shù)據(jù)吞吐量大,并能完全兼容現(xiàn)有的ISA/EISA/MCA等擴(kuò)充總線。PCI總線以其高性能、高效率以及與現(xiàn)有標(biāo)準(zhǔn)的兼容性和預(yù)置的發(fā)展空間,被計(jì)算機(jī)界認(rèn)為是最具發(fā)展?jié)摿Φ木植靠偩€標(biāo)準(zhǔn)。
PCI總線是32位并可升級(jí)到64位的獨(dú)立于CPU的總線結(jié)構(gòu),總線速度高達(dá)33/66MHz,同步控制、猝發(fā)(burst)傳送使得數(shù)據(jù)傳送速率高達(dá)132Mbps位(32位總線)、264Mbps(64位總線)。線性猝發(fā)、成組數(shù)據(jù)傳輸是PCI總線的基本傳輸機(jī)制。一次猝發(fā)傳輸通常由1個(gè)地址周期和1個(gè)或多個(gè)數(shù)據(jù)周期組成。它解決了總線的速度問題,為PCI外設(shè)提供了一個(gè)高帶寬的數(shù)據(jù)通道,將外設(shè)從I/O總線上移下來,不需處理器的介入便可進(jìn)行數(shù)據(jù)傳輸。PCI總線可進(jìn)行隱式仲裁。當(dāng)前主設(shè)備正在執(zhí)行數(shù)據(jù)傳送時(shí),PCI機(jī)理允許總線仲裁發(fā)生。如果仲裁器決定將下一次總線所有權(quán)授予某個(gè)主設(shè)備,而不是當(dāng)前交易的主設(shè)備,則它將從當(dāng)前主設(shè)備取回GNT(仲裁信號(hào)允許主設(shè)備使用總線低電平有效)并將其發(fā)給總線的下一個(gè)所有者,直到當(dāng)前主設(shè)備讓總線空閑時(shí),下一個(gè)所有者才能取得總線所有權(quán)。這樣,在執(zhí)行仲裁總線周期的時(shí)間內(nèi)沒有浪費(fèi)總線時(shí)間,提高了總線的效率。
PC機(jī)中包含3種空間:存儲(chǔ)器空間、I/O空間和配置空間。存儲(chǔ)器空間主要包括內(nèi)存、顯存、擴(kuò)展ROM和設(shè)備緩沖區(qū)等,一般用于存放大量數(shù)據(jù)和進(jìn)行數(shù)據(jù)塊交換。I/O空間主要包括設(shè)備的控制寄存器和狀態(tài)寄存器,一般用于控制和查詢?cè)O(shè)備的工作狀態(tài)以及少量數(shù)據(jù)的交換。目前PC機(jī)的存儲(chǔ)器空間為4GB,地址范圍是00000000H~FFFFFFFFH,而I/O空間為64KB,地址范圍是0000H~FFFFH。配置空間主要用于向系統(tǒng)提供設(shè)備自身的基本信息,并接受系統(tǒng)對(duì)設(shè)備全局狀態(tài)的控制和查詢。
1 系統(tǒng)結(jié)構(gòu)
本系統(tǒng)是一個(gè)12路溫度數(shù)據(jù)采集控制系統(tǒng)。該系統(tǒng)具有良好的實(shí)時(shí)性,可以隨機(jī)選擇任何一路作為輸入,而不會(huì)影響到其他數(shù)據(jù)采集的結(jié)果。整個(gè)系統(tǒng)由1臺(tái)586工業(yè)控制計(jì)算機(jī)控制,采用基于PCI插卡的形式,輔以一系列外圍電路協(xié)同工作。系統(tǒng)結(jié)構(gòu)框圖如圖1所示。
2 新型PCI接口芯片CH365
2.1 CH365的特點(diǎn)
PCI總線比其他總線要復(fù)雜得多,它有嚴(yán)格復(fù)雜的時(shí)序要求。為了實(shí)現(xiàn)自動(dòng)配置和擴(kuò)展需要,PCI接口有一個(gè)256字節(jié)的配置空間。所以,對(duì)于一般的PCI總線應(yīng)用設(shè)計(jì)工程師,為了縮短開發(fā)設(shè)計(jì)周期,不必去設(shè)計(jì)復(fù)雜的接口模塊,甚至不必完全理解PCI規(guī)范的細(xì)節(jié),就能進(jìn)行PCI用戶設(shè)備的設(shè)計(jì),因?yàn)榭芍苯硬捎脤S玫腜CI接口芯片。通過使用專用芯片,設(shè)計(jì)者只需要使用相關(guān)的地址線、數(shù)據(jù)線以及幾個(gè)控制信號(hào),就能實(shí)現(xiàn)PCI 總線與PCI用戶設(shè)備之間的連接。目前,國外已有比較成熟的PCI專用集成電路芯片的設(shè)計(jì)技術(shù),如美國的PLX公司的PCI90xx 系列產(chǎn)品已被廣泛采用。這類芯片的通用性較強(qiáng),但是同時(shí)也帶來成本高和開發(fā)周期長的問題。而我們已經(jīng)初步開發(fā)了基于ISA插槽的多路數(shù)據(jù)采集控制卡。在這樣的前提條件下要能使其工作在PCI總線,可采用PCI90xx芯片(每片價(jià)格一般在150元以上)或者AMCC公司的S59XX系列芯片(如常用的S5933,價(jià)格500多元/片)。這二種芯片價(jià)格都比較貴,而且雖然S5933支持DMA傳輸,但本系統(tǒng)中并不需要此功能即可完成工作要求。因此從降低開發(fā)成本和充分利用現(xiàn)有資源的角度考慮,本設(shè)計(jì)選擇了沁恒電子出品的一種新型PCI快速簡易接口芯片CH36X(價(jià)格只需24元/片)。CH36X系列PCI接口芯片不同于目前市場上運(yùn)用的常規(guī)接口芯片,它是一種低成本、快速、簡易的接口芯片,能完成大部分的PCI接口工作,尤其是這種芯片具有本地硬件地址的功能,使原工作在ISA8位總線上的電路能夠平滑移植到PCI總線上而不需要非常大的硬件改動(dòng),而且底層驅(qū)動(dòng)軟件的改動(dòng)也較小,這將給上層控制軟件的優(yōu)化提供更多的時(shí)間,而不需要再花費(fèi)大量時(shí)間在底層調(diào)試上。
2.2 CH365功能簡介
CH365是一個(gè)連接PCI總線的通用接口芯片,支持I/O端口映射、存儲(chǔ)器映射、擴(kuò)展ROM以及中斷;可將32位高速PCI總線轉(zhuǎn)換為簡便易用的類似于ISA總線的8位主動(dòng)并行接口,用于制作低成本的基于PCI總線的計(jì)算機(jī)板卡;CH365的存儲(chǔ)器空間占用32KB,偏移地址0000H~7FFFH,且可以全部提供給外部設(shè)備使用(實(shí)際存儲(chǔ)器地址是存儲(chǔ)器基址加上偏移地址);CH365的I/O空間占用256B,由于偏移地址F0~FFH是CH365芯片自身的專用寄存器,所以可以提供240B給外部設(shè)備使用,偏移地址是00H~EFH,實(shí)際的I/O地址是I/O基址加上偏移地址。
CH365的地址線A15~A0用于提供相對(duì)于基址的偏移地址;數(shù)據(jù)總線D7~D0在讀操作時(shí)用于輸入數(shù)據(jù),在寫操作時(shí)用于輸出數(shù)據(jù);IOP_RD、IOP_WR分別為I/O讀、I/O寫提供選通脈沖信號(hào),而MEM_RD、MEM_WR分別為存儲(chǔ)器讀和存儲(chǔ)器寫提供選通脈沖信號(hào)。CH365提供的地址線、數(shù)據(jù)總線和讀寫選通信號(hào)線類似于ISA總線的信號(hào)線,而提供的讀寫選通信號(hào)只在CH365的基址映射范圍內(nèi)有效,相當(dāng)于經(jīng)過片選之后的選通信號(hào),所以外部設(shè)備可以省去片選信號(hào)。
在I/O讀寫操作期間,CH365的A7~A0輸出I/O偏移地址,提供給外部設(shè)備的有效偏移地址范圍是00H~EFH,且CH365的A15~A10保持不變,而A9~A8輸出PCI總線的地址。如果使用本地硬件定址的功能,則應(yīng)該對(duì)CH365 的A9~A0進(jìn)行地址譯碼,以實(shí)現(xiàn)與ISA 總線相兼容的000H~3FFH地址范圍內(nèi)的I/O 端口定址。
在存儲(chǔ)器讀寫操作期間,CH365的A14~A0輸出存儲(chǔ)器偏移地址,提供給外部設(shè)備的有效偏移地址范圍是0000H~7FFFH,且CH365的A15保持不變,但可以事先設(shè)定為高電平或者低電平,用于存儲(chǔ)器地址線的擴(kuò)展或者頁面選擇。由于擴(kuò)展ROM屬于存儲(chǔ)器的一種,所以其操作方式以及操作時(shí)序與存儲(chǔ)器相同。
CH365支持PC機(jī)程序以單字節(jié)、雙字節(jié)(字)、4字節(jié)(雙字)為單位對(duì)I/O端口或者存儲(chǔ)器進(jìn)行讀寫。在多字節(jié)連續(xù)讀寫操作期間,CH365 每讀寫完1個(gè)字節(jié)數(shù)據(jù),就會(huì)自動(dòng)將偏移地址加1,以指向下一字節(jié)的偏移地址。
3 硬件實(shí)現(xiàn)
3.1 采集部分
當(dāng)8255接收到計(jì)算機(jī)的采集控制數(shù)據(jù)后,即將數(shù)據(jù)傳輸給4線/16線譯碼器(此處選擇了HCF4514BEY作為譯碼器),譯碼器輸出1路選擇信號(hào)選中12路達(dá)林頓管(MC1413)驅(qū)動(dòng)的一路,之后MC1413一路繼電器吸合,將溫度數(shù)據(jù)傳輸給下一步驟。在對(duì)12路溫度數(shù)據(jù)采集時(shí),雖然可以考慮采用比電磁繼電器體積小得多的集成塊式的模擬數(shù)據(jù)選擇器,但考慮到工業(yè)現(xiàn)場電磁干擾比較強(qiáng)烈,為了使系統(tǒng)能更加穩(wěn)定地工作,所以選擇了電磁繼電器進(jìn)行選擇測量。
3.2 斷偶檢測、冷端補(bǔ)償及放大
熱電偶在工業(yè)現(xiàn)場使用中有可能發(fā)生斷線故障,因此很有必要設(shè)置斷偶保護(hù)電路。冷端補(bǔ)償采用的是半導(dǎo)體PN結(jié)補(bǔ)償法,采用了美國NS公司的LM335作為二端齊納管工作。LM335是結(jié)構(gòu)精密、容易校準(zhǔn)的集成溫度傳感器,在+10mV/°K下,具有一個(gè)與絕對(duì)溫度直接成正比的擊穿電壓,其動(dòng)態(tài)阻抗低于1Ω,工作在400?滋A~5mA的電流范圍時(shí),其性能并無變化。對(duì)微弱熱電偶信號(hào)進(jìn)行處理之前應(yīng)將其放大,并根據(jù)K型熱電偶的特性,放大倍數(shù)可選40,此時(shí)放大后的電壓為52mV×40=2V,符合A/D轉(zhuǎn)換器MC14433的輸入電壓要求。
3.3 A/D轉(zhuǎn)換電路
A/D轉(zhuǎn)換主要有二大接口:模擬輸入端和數(shù)據(jù)輸出端。在A/D數(shù)據(jù)轉(zhuǎn)換系統(tǒng)的設(shè)計(jì)中,其很大程度上依賴于內(nèi)部或外部的DC電壓基準(zhǔn)所建立的電壓精度。因此設(shè)計(jì)基準(zhǔn)電壓最關(guān)鍵的問題是精度要高和溫漂要小。本設(shè)計(jì)選擇了ADI公司的ADR29X系列的基準(zhǔn)電壓源。
3.4 基于PCI接口的傳輸
本系統(tǒng)采用PCI總線,利用其高達(dá)33MHz(32 位)的傳輸速率完成連續(xù)采樣。并從快速方便,且能盡最大可能降低成本的角度考慮,本系統(tǒng)選擇了沁恒電子公司的CH36X系列芯片。該芯片完全可滿足系統(tǒng)的要求。
3.5 CH365及外圍輔助工作電路的實(shí)現(xiàn)原理框圖
CH365外圍輔助工作電路具體接線框圖如圖2所示。圖2中用了2塊型號(hào)為ATF16LV8C-10PC的16V8。一塊用來實(shí)現(xiàn)本地硬件地址,另一塊用來設(shè)置板卡ID。
3.6 本地硬件地址的實(shí)現(xiàn)
CH365提供了一種可以由產(chǎn)品制造商選定PCI設(shè)備I/O 地址的方法,即本地硬件定址。其原理是將PCI設(shè)備的部分I/O 地址譯碼通過外圍的二級(jí)譯碼電路實(shí)現(xiàn)。外圍的二級(jí)譯碼電路比較簡單,與ISA總線的I/O地址譯碼類似。CH365將PCI總線I/O操作的地址同步提供給外圍電路,當(dāng)外圍電路對(duì)地址譯碼匹配后,則向CH365請(qǐng)求本地硬件定址, 再由CH365請(qǐng)求PCI總線在該I/O地址進(jìn)行I/O 操作。
CH365 內(nèi)部已經(jīng)限定了本地硬件定址的地址范圍是03FFH~0000H,它對(duì)應(yīng)于ISA板卡的I/O地址范圍。當(dāng)PC機(jī)進(jìn)行I/O操作時(shí),CH365的A9~A0總是同步輸出操作地址,外圍的二級(jí)譯碼電路只需要對(duì)地址A9~A0進(jìn)行匹配比較。CH365要求外圍的二級(jí)譯碼延時(shí)不超過20ns,也就是說,外圍電路對(duì)地址譯碼比較后產(chǎn)生本地硬件定址請(qǐng)求的時(shí)間不能超過20ns。實(shí)際的外圍譯碼電路通常選用可編程器件16V8。在本例中選擇了ATF16LV8C-10PC,可以自行對(duì)ATF16LV8C-10PC的編程數(shù)據(jù)進(jìn)行修改,使CH365定位到指定的I/O端口地址。使用本地硬件定址功能后,CH365不僅在該硬件定址范圍響應(yīng)I/O操作,同時(shí)也在計(jì)算機(jī)自動(dòng)分配的I/O地址范圍內(nèi)響應(yīng)I/O操作。
3.7 CH365的工作模式的指定
為了在不增加引腳的前提下提供更多可用功能,CH365對(duì)部分引腳進(jìn)行復(fù)用,通過“工作模式設(shè)定”進(jìn)行功能選擇。“工作模式設(shè)定”的具體方法是:將本地端8 位數(shù)據(jù)信號(hào)線D7~D0采用上拉或下拉的方式設(shè)定為所需的高電平或低電平,CH365被復(fù)位后則根據(jù)這些信號(hào)線的默認(rèn)狀態(tài)設(shè)定工作模式及參數(shù)。而這些信號(hào)線在作為8位數(shù)據(jù)總線被驅(qū)動(dòng)時(shí),因?yàn)橐话阃獠吭O(shè)備的驅(qū)動(dòng)電流不小于1mA,所以上拉或下拉都不會(huì)影響其對(duì)數(shù)據(jù)總線的驅(qū)動(dòng)。另外,CH365僅在被復(fù)位后的1?滋s內(nèi)一次性設(shè)定工作模式以及參數(shù)。所以,如果外部設(shè)備的驅(qū)動(dòng)能力很小或者是OC集電極開路驅(qū)動(dòng),則只可以在復(fù)位后的短時(shí)間內(nèi)實(shí)現(xiàn)下拉,而在其余時(shí)間屏蔽下拉或者轉(zhuǎn)換成上拉。CH365的具體設(shè)定工作模式如表1所示。
4 軟件實(shí)現(xiàn)
CH365提供了CH365DLL.H和CH365DLL.LIB 2個(gè)文件來設(shè)計(jì)Windows下的應(yīng)用程序。對(duì)于一般的VC編譯環(huán)境,將上述2個(gè)文件放置在應(yīng)用程序同一目錄下,然后將CH365DLL.LIB添加到應(yīng)用程序的鏈接庫中。當(dāng)應(yīng)用程序被編譯時(shí)就會(huì)自動(dòng)鏈接。
4.1 初始化CH365的源代碼
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <winioctl.h>
#include″CH365DLL.H″ //如果在DOS下使用,請(qǐng)
//使用DOS庫
#define DIN_PORT 0xef//數(shù)據(jù)輸入端口
mPCH365_IO_REG mIoBase;//I/O基址
UCHAR Read_data( ); //讀(上傳)1個(gè)字節(jié)數(shù)據(jù)的
//子程序
void Write_data(UCHAR data);//寫(下傳)1個(gè)字
//節(jié)數(shù)據(jù)的子程序和主程序
void main( ) {
UCHAR data,Input_data;
int i;
//若要使用DLL則需要先加載
if (LoadLibrary(″CH365DLL.DLL″)==NULL ) return;
//加載DLL失敗
if(CH365OpenDevice(FALSE,F(xiàn)ALSE)==INVALID_HANDLE_
VALUE ) return; //打開CH365設(shè)備
CH365GetIoBaseAddr(&mIoBase);
//使用系統(tǒng)為CH365自動(dòng)分配的I/O基址
for (i=0;i<=30;i++) { //測試
Input_data=rand( )%0x0100; //隨機(jī)數(shù)0~255
printf(″*****WRITE DATA=%2x″,Input_data);
Write_data(Input_data);
//少量延時(shí),等待處理1個(gè)字節(jié)的數(shù)據(jù)
data=Read_data( );
//少量延時(shí),等待處理1個(gè)字節(jié)的數(shù)據(jù)
printf(″*****READ DATA=%2x″,data);
if(data==Input_data) printf(″*****test correct!\n″);
else printf(″*****test wrong!\n″);
}
}
4.2 I/O端口讀寫程序的編寫
CH365 的輸入、輸出信號(hào)與TTL電平和CMOS電平兼容,可以連接ADC/DAC/MCU等芯片。輸出引腳的驅(qū)動(dòng)電流大于10mA,可以在串接限流電阻后直接驅(qū)動(dòng)LED顯示。CH365提供了用于I/O 地址譯碼的8 根地址線A7~A0,有效偏移地址范圍是0EFH~00H,長度不超過240 字節(jié)。一般情況下,外部電路無需片選線或者直接強(qiáng)制片選。
基于CH365的通用驅(qū)動(dòng)程序WDM和動(dòng)態(tài)鏈接庫DLL,則上述操作的C 語言程序如下:
UCHAR mByte;//數(shù)據(jù)單元,用于保存從I/O端口中
//讀出的數(shù)據(jù)或者準(zhǔn)備寫入I/O的數(shù)據(jù)
mPCH365_IO_REG mIoBase;//I/O端口基址,實(shí)際數(shù)據(jù)
//單元的地址等于基址加上偏移地址
CH365GetIoBaseAddr(&mIoBase);//獲取I/O端口的基址,
//這是可選操作,不必執(zhí)行;如果不獲取I/O基址則可以
//在I/O操作中只指定偏移地址,相當(dāng)于I/O 基址為0;
//在調(diào)用CH365的DLL后,DLL會(huì)自動(dòng)將偏移地址加上
//基址再進(jìn)行I/O操作;存儲(chǔ)器與此類似,如果存儲(chǔ)器操
//作中只指定偏移地址,則DLL會(huì)自動(dòng)加上存儲(chǔ)器基址
CH365ReadIoByte(& mIoBase -> mCh365IoPort[0x00],&mByte);
//上述操作從I/O端口的00H偏移地址讀取1個(gè)字節(jié)的
//數(shù)據(jù),即讀入第1組緩沖輸入
CH365WriteIoByte(& mIoBase -> mCh365IoPort[0x01],0x47);
//上述操作將數(shù)據(jù)47H寫到I/O端口的01H偏移地址,即
//作為第2組鎖存輸出
CH365SetA15_A8(0x24); //設(shè)置A13為高電平,A10為高
//電平,其余引腳為低電平
5 結(jié)束語
本系統(tǒng)采用新型PCI接口芯片CH365完成采集卡的設(shè)計(jì),并采用了本地硬件地址的快速實(shí)現(xiàn)方法。CH365以其強(qiáng)大的功能和簡單的用戶接口,為PCI總線接口的開發(fā)提供了一種簡潔快速的方法。設(shè)計(jì)者只需設(shè)計(jì)出本地接口硬件外圍電路,就可以通過CH365快速掛接到PCI總線上。系統(tǒng)經(jīng)測試能夠高速地進(jìn)行數(shù)據(jù)的采集和傳送,可應(yīng)用于高速數(shù)據(jù)采集卡、網(wǎng)卡及視頻采集卡等設(shè)備的研發(fā)中。隨著PCI總線的普及,基于PCI總線的采集傳輸系統(tǒng)將有十分廣闊的應(yīng)用前景。
參考文獻(xiàn)
1 李貴山.PCI局部總線開發(fā)者指南.西安:西安電子科技大學(xué)出版社,1996
2 Shanley T,Anderson D.PCI系統(tǒng)結(jié)構(gòu).北京:電子工業(yè)出版社,2000
3 WinChiphead Corp.PCI Bus Interface Chip CH365 UserBook(Ver.1).2003
4 聞伍椿.運(yùn)算放大器在電測技術(shù)中的應(yīng)用.北京:機(jī)械工業(yè)出版社,1989