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