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