文獻標識碼: 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è)與有限的主板插槽和端口之間的矛盾而制定的一種串行通信標準,。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)要求對各路信號的相位嚴格一致,,而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接口芯片。按照不同的標準,,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è)備請求做出適當?shù)捻憫?yīng),,完成對設(shè)備的配置任務(wù),。
(3)對中斷的處理。
(4)數(shù)據(jù)的接收和發(fā)送,。
(5)外圍電路的控制,。
固件程序設(shè)計成中斷驅(qū)動模式,采用模塊化設(shè)計,,其總體結(jié)構(gòu)如圖4所示,。
各模塊的主要功能如下:
(1)主程序:完成DSP及USB接口芯片的初始化、數(shù)據(jù)發(fā)送/接收標志位的判斷及中斷請求等待,。
(2)中斷服務(wù)程序:中斷服務(wù)程序是整個固件程序設(shè)計的重點,。首先通過讀取ISP1581中斷寄存器的值判斷所發(fā)生中斷的類型,然后根據(jù)具體的中斷類型進入相應(yīng)的處理子程序或設(shè)置相應(yīng)的標志位,。中斷服務(wù)程序中需要處理的有總線復(fù)位中斷,、高速狀態(tài)變化中斷、SETUP中斷及端點的IN/OUT中斷,。在所有的中斷處理程序中,EP0SETUP中斷處理是最重要的,它是USB設(shè)備與PC機間建立通信鏈路的基礎(chǔ),。
(3)請求處理程序:USB標準請求處理程序負責處理枚舉階段主機發(fā)給設(shè)備的標準請求,以及正常工作時主機發(fā)送的廠商請求,。USB2.0協(xié)議中規(guī)定了11種USB標準請求,,對這11種標準請求作出正確的響應(yīng)是設(shè)備成功枚舉的重中之重。當固件接收到第1個SETUP中斷后,,就進入USB枚舉過程,,其過程是由主機發(fā)出一系列USB標準設(shè)備請求并要求及時得到設(shè)備響應(yīng),如果不需要進行操作,,也必須指示一個空響應(yīng),,使主機能為該設(shè)備準備其所請求的資源,建立好兩者之間的信息溝通機制,。
(4)數(shù)據(jù)接收/發(fā)送程序:當用戶通過主機端應(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ā)送完畢標志,。
接收數(shù)據(jù):選擇端點索引→讀接收緩沖區(qū)長度寄存器→從數(shù)據(jù)端口寄存器讀取接收到的數(shù)據(jù),。
(5)硬件接口訪問程序:硬件接口程序負責完成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)提供,負責與實際的硬件打交道,,實現(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ū)動程序初學者使用,。
利用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左右,,可以滿足當前系統(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é)議中的令牌,,實際傳輸速度要遠低于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].北京:北京航空航天大學出版社,,2003.
[6] 武安河,,邰銘,于洪濤. Windows 2000/XP WDM 設(shè)備驅(qū)動程序開發(fā)[M].北京:電子工業(yè)出版社,,2002.