文獻(xiàn)標(biāo)識(shí)碼: A
數(shù)據(jù)采集廣泛應(yīng)用于信號(hào)檢測(cè),、信號(hào)處理、儀器儀表等領(lǐng)域,。目前,,有各種數(shù)據(jù)采集卡或采集系統(tǒng)可供選擇,但由于數(shù)據(jù)源以及用戶需求的多樣性,,有時(shí)并不能滿足要求,。特別是在某些應(yīng)用中,需要同時(shí)高速采集多個(gè)通道的數(shù)據(jù),,而且為了分析比較各通道信號(hào)間的相互關(guān)系,,常常要求所有通道的采集必須同步。目前常用的數(shù)據(jù)采集卡是具有ISA總線,、PCI總線等接口形式的A/D采集卡,,雖然數(shù)據(jù)傳輸率很高,但是還存在整個(gè)系統(tǒng)笨重,,缺乏靈活性,,不能實(shí)現(xiàn)即插即用,不適合小型,、便攜設(shè)備應(yīng)用等缺點(diǎn),。通用串行總線(USB)是為了解決日益增加的PC機(jī)外設(shè)與有限的主板插槽和端口之間的矛盾而制定的一種串行通信標(biāo)準(zhǔn)。USB的出現(xiàn)很好地解決了以上問題,。USB不僅具有快速的傳輸性能,,而且USB協(xié)議本身具有其糾錯(cuò)能力,它的即插即用模式和易擴(kuò)展性能都具有很強(qiáng)的發(fā)展前途和應(yīng)用價(jià)值[1],。根據(jù)項(xiàng)目實(shí)際需求,,本文設(shè)計(jì)了一種基于ISP1581的高速USB多通道數(shù)據(jù)采集系統(tǒng),系統(tǒng)最高采樣率每通道可達(dá)500 K字,并且具有增益控制調(diào)節(jié),、外觸發(fā)同步采集等功能,目前該系統(tǒng)已成功地應(yīng)用于某水下定位系統(tǒng)[2],。
1 系統(tǒng)硬件組成
如圖1所示,系統(tǒng)由信號(hào)調(diào)理電路模塊,、A/D采集模塊,、USB數(shù)據(jù)傳輸模塊三個(gè)部分組成。
1.1 信號(hào)調(diào)理電路模塊
由于從傳感器進(jìn)來的信號(hào)一般都比較小(大約在微伏量級(jí)),,A/D無法直接對(duì)這些信號(hào)進(jìn)行采集,,需要通過信號(hào)調(diào)理電路模塊對(duì)其進(jìn)行放大,以滿足A/D采集的量程范圍,。另外,由于信號(hào)容易受到外界噪聲以及電噪聲的干擾,,通過信號(hào)調(diào)理電路所具有的濾波功能,可以濾除信號(hào)頻帶外的噪聲,。
1.2 A/D采集模塊
A/D采集模塊由1片F(xiàn)PGA和2片A/D組成,,完成4路信號(hào)的模/數(shù)轉(zhuǎn)換。模數(shù)轉(zhuǎn)換器選擇的是AD7655芯片,。AD7655是一款高速,、低功耗4通道16位模數(shù)轉(zhuǎn)換器,采用5 V單電源供電,模擬輸入信號(hào)范圍為0 V~5 V;高輸入阻抗,,可對(duì)4路模擬輸入同時(shí)高速采樣并進(jìn)行數(shù)字化轉(zhuǎn)換,,采樣速率最高可達(dá)1 MS/s,,支持并行或串行接口,。由于本采集系統(tǒng)要求對(duì)各路信號(hào)的相位嚴(yán)格一致,而AD7655只能同時(shí)對(duì)4個(gè)通道中的2路信號(hào)同時(shí)進(jìn)行采樣,,因此,,1片A/D僅連接了2路模擬信號(hào)。另外,為了保證所有通道信號(hào)的相位一致性,,2片A/D需要使用同一個(gè)轉(zhuǎn)換信號(hào)來控制轉(zhuǎn)換的進(jìn)行,,故在電路連接時(shí),把每個(gè)A/D芯片的轉(zhuǎn)換信號(hào)(CNVST)管腳連接在一起,,然后連接到FPGA上的轉(zhuǎn)換信號(hào)輸出管腳上,,由FPGA輸出的轉(zhuǎn)換信號(hào)驅(qū)動(dòng)。FPGA與A/D之間的數(shù)據(jù)讀取采用總線的方式,,將每一片A/D的讀控制信號(hào)都獨(dú)立連接到FPGA上,,由FPGA控制各路采樣數(shù)據(jù)的讀取。采集電路連接如圖2所示,。
1.3 USB數(shù)據(jù)傳輸模塊
USB數(shù)據(jù)傳輸模塊是本系統(tǒng)的核心,。要開發(fā)USB功能設(shè)備,首先需要對(duì)設(shè)計(jì)產(chǎn)品的功能進(jìn)行全面了解,包括數(shù)據(jù)傳輸速率,、傳輸類型,、所需要的硬件資源等。在充分了解設(shè)計(jì)的產(chǎn)品后,,要選擇合適的USB接口芯片,,如果選擇得好,可以大大節(jié)省開發(fā)時(shí)間和費(fèi)用,。
USB接口芯片是一種集成了USB協(xié)議的微處理器,,能自動(dòng)對(duì)各種USB事件作出響應(yīng),以處理USB總線上的數(shù)據(jù)傳輸,。所有的主機(jī)和設(shè)備上都至少含有1塊實(shí)現(xiàn)其功能的USB接口芯片,。按照不同的標(biāo)準(zhǔn),USB接口芯片有如下幾種分類方式,,以功能分類則可以分為:主控制器芯片,、集線器芯片、功能設(shè)備芯片,;以使用方式進(jìn)行分類則可以分為:帶USB接口的專用MCU,、帶USB接口的通用MCU、純粹的USB接口芯片,。
本設(shè)計(jì)中選用了Philips公司的USB2.0接口芯片ISP1581,,該芯片屬于純粹的USB接口芯片。這類USB接口芯片價(jià)格較低,,接口方便,,靈活性高,針對(duì)不同的硬件環(huán)境可以配合多種MCU使用,,如單片機(jī),、DSP、FPGA[3-4],。ISP1581支持2種工作模式:通用處理器模式和斷開總線模式,。本設(shè)計(jì)中采用DSP來控制ISP1581,連接方式選用通用處理器模式,,原理圖如圖3所示,。
2 USB接口軟件開發(fā)
軟件分為USB固件程序開發(fā)和USB設(shè)備驅(qū)動(dòng)程序開發(fā)兩大部分。
2.1 USB固件程序開發(fā)
所有基于微處理器及其外圍電路的功能設(shè)備的正常工作都離不開固件的參與,,固件的作用就是輔助硬件,即控制硬件來完成預(yù)期的功能,,如沒有固件的參與和控制,硬件設(shè)備只是芯片簡(jiǎn)單的堆砌,,無法實(shí)現(xiàn)預(yù)期的功能,如同一臺(tái)沒有安裝操作系統(tǒng)的計(jì)算機(jī),,無法正常工作,。因此,用戶必須編寫固件程序來輔助硬件完成USB通信任務(wù)[5],。具體如下:
(1)初始化,。主要是設(shè)置一些特殊寄存器的初值,以實(shí)現(xiàn)所需的設(shè)備屬性或功能,,例如開中斷,、使能端點(diǎn)、配置端口等,。
(2)輔助硬件完成設(shè)備的重新枚舉(ReNumeration)過程,。包括模擬設(shè)備的斷開與重新連接,對(duì)收到的設(shè)置包進(jìn)行分析判斷,,從而對(duì)主設(shè)備請(qǐng)求做出適當(dāng)?shù)捻憫?yīng),,完成對(duì)設(shè)備的配置任務(wù)。
(3)對(duì)中斷的處理,。
(4)數(shù)據(jù)的接收和發(fā)送,。
(5)外圍電路的控制。
固件程序設(shè)計(jì)成中斷驅(qū)動(dòng)模式,,采用模塊化設(shè)計(jì),,其總體結(jié)構(gòu)如圖4所示。
各模塊的主要功能如下:
(1)主程序:完成DSP及USB接口芯片的初始化,、數(shù)據(jù)發(fā)送/接收標(biāo)志位的判斷及中斷請(qǐng)求等待,。
(2)中斷服務(wù)程序:中斷服務(wù)程序是整個(gè)固件程序設(shè)計(jì)的重點(diǎn)。首先通過讀取ISP1581中斷寄存器的值判斷所發(fā)生中斷的類型,,然后根據(jù)具體的中斷類型進(jìn)入相應(yīng)的處理子程序或設(shè)置相應(yīng)的標(biāo)志位,。中斷服務(wù)程序中需要處理的有總線復(fù)位中斷、高速狀態(tài)變化中斷,、SETUP中斷及端點(diǎn)的IN/OUT中斷,。在所有的中斷處理程序中,EP0SETUP中斷處理是最重要的,它是USB設(shè)備與PC機(jī)間建立通信鏈路的基礎(chǔ),。
(3)請(qǐng)求處理程序:USB標(biāo)準(zhǔn)請(qǐng)求處理程序負(fù)責(zé)處理枚舉階段主機(jī)發(fā)給設(shè)備的標(biāo)準(zhǔn)請(qǐng)求,,以及正常工作時(shí)主機(jī)發(fā)送的廠商請(qǐng)求。USB2.0協(xié)議中規(guī)定了11種USB標(biāo)準(zhǔn)請(qǐng)求,,對(duì)這11種標(biāo)準(zhǔn)請(qǐng)求作出正確的響應(yīng)是設(shè)備成功枚舉的重中之重,。當(dāng)固件接收到第1個(gè)SETUP中斷后,就進(jìn)入U(xiǎn)SB枚舉過程,,其過程是由主機(jī)發(fā)出一系列USB標(biāo)準(zhǔn)設(shè)備請(qǐng)求并要求及時(shí)得到設(shè)備響應(yīng),,如果不需要進(jìn)行操作,也必須指示一個(gè)空響應(yīng),,使主機(jī)能為該設(shè)備準(zhǔn)備其所請(qǐng)求的資源,,建立好兩者之間的信息溝通機(jī)制,。
(4)數(shù)據(jù)接收/發(fā)送程序:當(dāng)用戶通過主機(jī)端應(yīng)用程序向設(shè)備索要數(shù)據(jù)或向設(shè)備發(fā)送數(shù)據(jù)時(shí),DSP調(diào)用數(shù)據(jù)發(fā)送/接收子程序完成數(shù)據(jù)的發(fā)送/接收,。數(shù)據(jù)的發(fā)送和接收過程如下:
發(fā)送數(shù)據(jù):選擇端點(diǎn)索引→寫發(fā)送緩沖區(qū)長度寄存器→寫發(fā)送數(shù)據(jù)到數(shù)據(jù)端口寄存器→等待發(fā)送完畢標(biāo)志,。
接收數(shù)據(jù):選擇端點(diǎn)索引→讀接收緩沖區(qū)長度寄存器→從數(shù)據(jù)端口寄存器讀取接收到的數(shù)據(jù)。
(5)硬件接口訪問程序:硬件接口程序負(fù)責(zé)完成DSP對(duì)ISP1581的讀寫操作,,它是整個(gè)固件程序中最底層也是使用最頻繁的部分,,在這里主要定義了2種類型的函數(shù):ISP1581常用寄存器訪問函數(shù)和數(shù)據(jù)端口寄存器訪問函數(shù)。
常用寄存器訪問函數(shù):
void outport(unsigned int *reg_addr, unsigned short value),;
unsigned short inport(unsigned int *reg_addr),;
數(shù)據(jù)端口寄存器訪問函數(shù):
void write_ep(unsigned short *addr, unsigned short size);
unsigned short read_ep(unsigned short *addr),;
write_ep為寫端點(diǎn)發(fā)送緩沖區(qū)函數(shù),,其中參數(shù)*addr為指向待發(fā)送緩沖區(qū)的起始地址指針,參數(shù)size為要發(fā)送數(shù)據(jù)的字節(jié)數(shù),;read_ep為讀端點(diǎn)接收緩沖區(qū)函數(shù),,參數(shù)含義與write_ep函數(shù)相同,返回值為接收數(shù)據(jù)的字節(jié)數(shù),。
2.2 驅(qū)動(dòng)程序開發(fā)
Windows環(huán)境下驅(qū)動(dòng)程序有3種模型:VxD模型,、KMD模型、WDM模型,。WDM模型是微軟力推的全新驅(qū)動(dòng)程序模型,,現(xiàn)在主流的操作系統(tǒng)都是采用基于WDM模型的驅(qū)動(dòng)程序,因此本采集系統(tǒng)也采用WDM驅(qū)動(dòng)程序模型來開發(fā)USB設(shè)備的驅(qū)動(dòng)程序[6],。
對(duì)于USB設(shè)備,,其WDM驅(qū)動(dòng)程序分為USB底層(總線)驅(qū)動(dòng)程序和USB功能(設(shè)備)驅(qū)動(dòng)程序。USB底層驅(qū)動(dòng)程序由操作系統(tǒng)提供,,負(fù)責(zé)與實(shí)際的硬件打交道,,實(shí)現(xiàn)底層通信。USB功能驅(qū)動(dòng)程序由設(shè)備開發(fā)者編寫,,不對(duì)實(shí)際的硬件進(jìn)行操作,,而是通過向USB底層驅(qū)動(dòng)程序發(fā)送包含請(qǐng)求塊URB(USB Request Block)的IRP,,以實(shí)現(xiàn)對(duì)USB設(shè)備信息的發(fā)送和接收。
目前,WDM驅(qū)動(dòng)程序開發(fā)工具有3種:Microsoft公司的DDK,、Numega公司的DriverStudio和Jungo公司的WinDriver,。其中,,DDK的開發(fā)難度較大,,開發(fā)者需要對(duì)整個(gè)體系結(jié)構(gòu)和WDM規(guī)范有很好的理解和把握,還要熟悉上千個(gè)DDK函數(shù)的功能和使用場(chǎng)合,,且測(cè)試流程繁瑣,;DriverStudio的開發(fā)難度低一些,,它將DDK函數(shù)按照邏輯功能進(jìn)行組織,把很多常用功能封裝成類,,建立了一個(gè)基于C++語言的面向?qū)ο蟮木幊汰h(huán)境,,開發(fā)者面對(duì)的不再是上千個(gè)復(fù)雜凌亂的DDK函數(shù),而是邏輯清晰的類庫,;WinDriver的開發(fā)幾乎沒有難度,,開發(fā)者所編寫的只是定制和調(diào)用它提供的通用驅(qū)動(dòng),開發(fā)周期較短,,特別適合于驅(qū)動(dòng)程序初學(xué)者使用,。
利用WinDriver開發(fā)設(shè)備驅(qū)動(dòng)程序,有2種方法:(1)用Wizard自動(dòng)生成驅(qū)動(dòng)程序的框架代碼,,根據(jù)實(shí)際要求修改代碼,,加入定制的功能,再在用戶態(tài)執(zhí)行和調(diào)試代碼,,并將性能要求苛刻的部分插入到核心態(tài),,從而完成整個(gè)驅(qū)動(dòng)程序的編寫。在使用這種方法時(shí),,WinDriver已經(jīng)完成了驅(qū)動(dòng)程序編寫的大部分工作,,減少了工作量,使編寫驅(qū)動(dòng)成為相對(duì)較簡(jiǎn)單,。但此方法生成的設(shè)備驅(qū)動(dòng)程序,,其通用性和可移植性較差;(2)完全用WinDriver提供的API函數(shù)來寫驅(qū)動(dòng)程序,。這樣要比修改由Wizard生成的框架代碼靈活得多,,并且編寫的程序更簡(jiǎn)短。但這要求開發(fā)者熟悉驅(qū)動(dòng)程序的框架,,能熟練運(yùn)用WinDriver API函數(shù),。
為了縮短開發(fā)周期,在實(shí)際應(yīng)用中選用了第1種方法生成驅(qū)動(dòng)程序,。具體步驟如下:
(1) 啟動(dòng)Driver Wizard,,檢測(cè)連接的USB設(shè)備,生成inf文件,,這個(gè)inf文件和WinDriver包含的windrvr6.sys一起,,就是新開發(fā)USB設(shè)備的驅(qū)動(dòng)程序,。
(2) 點(diǎn)擊Next按鈕,,進(jìn)入資源列表窗口,窗口中顯示了管道(Pipe)的一些基本信息,。此窗口還可以用于對(duì)外設(shè)進(jìn)行讀寫,,測(cè)試硬件資源的正確性,,窗口中的Log部分即為測(cè)試結(jié)果。
(3) 點(diǎn)擊Next按鈕,,進(jìn)入代碼生成窗口,,在窗口中選擇生成C語言代碼。之后Driver Wizard將自動(dòng)生成針對(duì)ISP1581的樣本程序和工程文件(包括代碼文件,、說明文件以及適用于VC++編譯器的項(xiàng)目文件),。
(4)重新安裝這個(gè)USB設(shè)備的驅(qū)動(dòng)程序,利用DriverWizard生成的文件,就可開發(fā)應(yīng)用程序了,。
經(jīng)過反復(fù)測(cè)試發(fā)現(xiàn),,在現(xiàn)有硬件上批量傳輸?shù)乃俣仍?0 Mb/s左右,可以滿足當(dāng)前系統(tǒng)采樣頻率為500 kHz時(shí)的數(shù)據(jù)采集要求,,即500K×4路×16=32 Mb/s,。但與USB2.0規(guī)范的極限速度相比,現(xiàn)有的批量傳輸速度還不及其13%,分析其原因:
(1) USB2.0規(guī)范定義的最大速度為480 Mb/s,,但它是包含令牌包在內(nèi)的傳輸,,因此,若扣除通信協(xié)議中的令牌,實(shí)際傳輸速度要遠(yuǎn)低于480 Mb/s,。
(2) 從訪問寄存器的時(shí)序參數(shù)可以看出,,讀/寫周期最小為80 ns,即DSP對(duì)ISP1581讀寫的最高頻率是12.5 MHz,,由于每次讀寫操作的數(shù)據(jù)為2 B,,所以DSP與接口芯片之間數(shù)據(jù)傳輸?shù)淖罡咚俾适?5 MB/s,最后的實(shí)際值應(yīng)該小于此值,。
(3) 利用WinDriver開發(fā)驅(qū)動(dòng),,事實(shí)上它只是定制和調(diào)用WinDriver提供的通用驅(qū)動(dòng)而已,所以并非有針對(duì)性地對(duì)特定硬件編程,,程序執(zhí)行效率上也不免大打折扣,。
(4) 計(jì)算機(jī)與USB設(shè)備的通信中還包含對(duì)計(jì)算機(jī)硬盤的寫操作,使用測(cè)試軟件對(duì)所用機(jī)器硬盤進(jìn)行寫測(cè)試,,測(cè)得平均速度在22~25 MB/s之間,,因此硬盤的寫速度也是影響USB數(shù)據(jù)傳輸速度的原因之一。
因此若想在現(xiàn)有硬件平臺(tái)上獲得更高的速度可以在以下幾個(gè)方面進(jìn)行:采用端點(diǎn)的雙緩沖模式,、采用ISP1581的DMA模式,、采用效率更高的驅(qū)動(dòng)開發(fā)方式及優(yōu)化固件程序以提高硬件的工作效率等。
參考文獻(xiàn)
[1] 廖濟(jì)林.USB2.0應(yīng)用系統(tǒng)開發(fā)實(shí)例精講[M].北京:電子工業(yè)出版社,,2006.
[2] 張建鵬,解國明,李剛.基于ISP1581型接口電路的USB2.0接口設(shè)計(jì)[J].國外電子元器件,, 2005(9).
[3] 黎美. 基于USB2.0的接口芯片ISP1581的應(yīng)用與設(shè)計(jì)[J].集成電路應(yīng)用,2005(7).
[4] Compaq, Intel, Lucent, Microsoft, NEC, Philips.Universal serial bus specification, Revision2.0[S].2000.
[5] 周立功.PDIUSBD12 USB固件編程與驅(qū)動(dòng)開發(fā)[M].北京:北京航空航天大學(xué)出版社,,2003.
[6] 武安河,,邰銘,,于洪濤. Windows 2000/XP WDM 設(shè)備驅(qū)動(dòng)程序開發(fā)[M].北京:電子工業(yè)出版社,2002.