基于DSP的PCI高速測(cè)控系統(tǒng)結(jié)構(gòu)的研究設(shè)計(jì)
PC219054提供了三個(gè)物理總線接口:PCI總線接口、EEPROM接口、局部總線接口。PCI總線接口依照PCI擴(kuò)展板上定義的引腳分配情況將彼此對(duì)應(yīng)的信號(hào)連接在一起即可。本系統(tǒng)采用的EEPROM為4K、3.3V串行的93LC66B,通過(guò)對(duì)PCI時(shí)鐘分頻來(lái)產(chǎn)生EEPROM時(shí)鐘,內(nèi)部存放PCI9054的配置信息,系統(tǒng)加電時(shí)PCI9054自動(dòng)加載EEPROM中的配置信息,并由BIOS通過(guò)PCI總線對(duì)配置寄存器讀寫(xiě),來(lái)完成各種控制功能。接口電路如圖3所示。
PCI9054在DMA傳輸方式下,通過(guò)設(shè)置其DMA控制器內(nèi)部的寄存器即可實(shí)現(xiàn)兩總線之間的數(shù)據(jù)傳送。傳輸過(guò)程由以下幾個(gè)步驟實(shí)現(xiàn):
1.設(shè)置傳輸方式寄存器:通過(guò)寄存器DMA MODE0或DMAMODE1的位9來(lái)設(shè)置DMA通道的傳輸方式,置0表示Block傳輸,置1表示Scatter/Gather傳輸;
2.設(shè)置命令/狀態(tài)寄存器:?jiǎn)?dòng)/停止DMA操作,并讀此寄存器返回DMA狀態(tài);
3.設(shè)置描述寄存器:設(shè)置DMA的傳輸方向;
4.設(shè)置傳輸計(jì)數(shù)寄存器:以字節(jié)為單位設(shè)置傳輸數(shù)據(jù)量;
5.設(shè)置PCI地址寄存器:設(shè)置PCI總線側(cè)的地址空問(wèn);
6.設(shè)置局部地址寄存器:設(shè)置局部總線側(cè)的地址空間。
當(dāng)進(jìn)行數(shù)據(jù)采集時(shí),由應(yīng)用程序或通過(guò)DSP的外部引腳(pin21)向DSP發(fā)出采集命令,同時(shí)復(fù)位FIFO,在13SP內(nèi)部程序和CPLD的控制下,數(shù)據(jù)經(jīng)DO-31源源不斷地輸入到FIFO中,當(dāng)FIFO半滿時(shí)發(fā)出半滿標(biāo)志信號(hào)(HF#),CPLD接到半滿信號(hào)后,立即向PCI9054發(fā)出中斷請(qǐng)求信號(hào)(LINT),驅(qū)動(dòng)程序響應(yīng)中斷,在中斷響應(yīng)程序內(nèi),發(fā)出讀命令、要讀取的字節(jié)數(shù)、傳輸方向、地址信號(hào)等,PCI9054設(shè)定DMA傳輸開(kāi)始位啟動(dòng)數(shù)據(jù)傳輸,當(dāng)ADS#為低(有效),BLAST為高(無(wú)效),LW/R為低(有效)時(shí),表明PCI9054開(kāi)始一個(gè)有效的讀數(shù)據(jù)周期,CPLD產(chǎn)生一個(gè)低電平信號(hào)REN#給FIFO,同時(shí)作為Ready信號(hào)返回給PCI9054, 表明已準(zhǔn)備就緒。直到ADS#為高(無(wú)效)且BLAST#為低(有效)時(shí),表明PCI9054已經(jīng)開(kāi) 始最后一個(gè)周期,同時(shí)設(shè)定D M A傳輸結(jié)束位結(jié)束DMA操作,此時(shí)REN#信號(hào)再次變高電平(無(wú)效),完成一次數(shù)據(jù)突發(fā)傳輸。接口電路如圖4所示。
該系統(tǒng)的軟件設(shè)計(jì)主要包括DSP測(cè)控程序、PCI設(shè)備驅(qū)動(dòng)程序和Windows應(yīng)用程序三個(gè)部分。驅(qū)動(dòng)程序是連接硬件系統(tǒng)和應(yīng)用程序的橋梁,是整個(gè)測(cè)控系統(tǒng)開(kāi)發(fā)中的關(guān)鍵一步。在此簡(jiǎn)單介紹一下PCI設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)過(guò)程。
在Windows環(huán)境下共有三種類(lèi)型的驅(qū)動(dòng)程序,分別是VXD、NT、WDM。因?yàn)閃DM可以應(yīng)用在windows98/2000/XP下,支持即插即用、電源管理、WMI等功能,是Windows NT驅(qū)動(dòng)體系基礎(chǔ)上發(fā)展起來(lái)的未來(lái)主流驅(qū)動(dòng)程序體系,所以為這里選擇設(shè)計(jì)WDM驅(qū)動(dòng)程序。
開(kāi)發(fā)工具選擇Compuware公司提供的DriverStudio完~成驅(qū)動(dòng)程序的開(kāi)發(fā),DriverWorks是DriverStudio中的一個(gè)部分,DriverWorks中的類(lèi)庫(kù)封裝了針對(duì)驅(qū)動(dòng)程序的各種通用操作,使用其中的DriverWizard向?qū)Чδ?,能夠非常方便地?shí)現(xiàn)WDM驅(qū)動(dòng)程序的開(kāi)發(fā)。
其中PCI配置空間的訪問(wèn)采用KPciConfiguration實(shí)現(xiàn)。I/O訪問(wèn)采用DriverStudio中的KIoRange類(lèi)實(shí)現(xiàn)。硬件中斷響應(yīng)的處理可以采用Kinterrupt類(lèi)實(shí)現(xiàn)。DMA讀主要是利用三個(gè)類(lèi)來(lái)實(shí)現(xiàn)數(shù)據(jù)傳輸,分別為:KDmaTransfer、KdmaAdapter和K C o m m o n D m a B U ff e r。KDmaTransfer用于DMA傳輸控制。KdmaAdapter用于建立一個(gè)DMA適配器來(lái)說(shuō)明DMA通道的特性。KCommonDmaBuffer用于申請(qǐng)系統(tǒng)提供的公用緩沖區(qū)。
執(zhí)行過(guò)程中驅(qū)動(dòng)程序首先設(shè)置PCI9054的工作方式和中斷寄存器、DMA配置寄存器,然后等待本地中斷的到來(lái)。當(dāng)FIFO半滿時(shí)表明本地中斷到來(lái),在設(shè)備成員函數(shù)Isr_IrqO中屏蔽本地中斷,在設(shè)備成員函數(shù)DpcFor_Irq()中調(diào)用KDmaTransfer:Continue()函數(shù)進(jìn)行DMA傳輸。一次數(shù)據(jù)傳輸完畢后,驅(qū)動(dòng)程序通過(guò)操作系統(tǒng)將內(nèi)核中的數(shù)據(jù)拷貝到用戶態(tài)內(nèi)存,交給應(yīng)用軟件處理。
結(jié)語(yǔ)
在實(shí)驗(yàn)室中利用PCI9054作為接口芯片的高速測(cè)控系統(tǒng),可實(shí)現(xiàn)持續(xù)數(shù)據(jù)傳輸速率達(dá)50MB/s,且系統(tǒng)運(yùn)行穩(wěn)定,具有廣泛的應(yīng)用前景。
評(píng)論