基于USB2.0總線(xiàn)的高速數據采集系統設計
作者Email: cai_yang@etang.com
摘要:本文主要介紹支持USB2.0高速傳輸的EZ-USBFX2單片機CY7C68013,并詳細說(shuō)明用此芯片實(shí)現高速數據采集系統和相應的Windows驅動(dòng)程序及底層固件程序的開(kāi)發(fā)過(guò)程。
關(guān)鍵詞:CY7C68013USB2.0數據采集固件
1引言
現代工業(yè)生產(chǎn)和科學(xué)研究對數據采集的要求日益提高,在瞬態(tài)信號測量、圖像處理等一些高速、高精度的測量中,需要進(jìn)行高速數據采集?,F在通用的高速數據采集卡一般多是PCI卡或ISA卡,存在以下缺點(diǎn):安裝麻煩、價(jià)格昂貴;受計算機插槽數量、地址、中斷資源限制,可擴展性差;在一些電磁干擾性強的測試現場(chǎng),無(wú)法專(zhuān)門(mén)對其做電磁屏蔽,導致采集的數據失真。
通用串行總線(xiàn)USB是1995年康柏、微軟、IBM、DEC等公司為解決傳統總線(xiàn)不足而推廣的一種新型的通信標準。該總線(xiàn)接口具有安裝方便、高帶寬、易于擴展等優(yōu)點(diǎn),已逐漸成為現代數據傳輸的發(fā)展趨勢?;赨SB的高速數據采集卡充分利用USB總線(xiàn)的上述優(yōu)點(diǎn),有效解決了傳統高速數據采集卡的缺陷。
2硬件設計
2.1支持USB2.0高速傳輸的CY7C68013
CypressSemiconductor公司的EZ-USBFX2是世界上第一款集成USB2.0的微處理器,它集成了USB2.0收發(fā)器、SIE(串行接口引擎)、增強的8051微控制器和可編程的外圍接口。FX2這種獨創(chuàng )性結構可使數據傳輸率達到56Mbytes/s,即USB2.0允許的最大帶寬。在FX2中,智能SIE可以硬件處理許多USB1.1和USB2.0協(xié)議,從而減少了開(kāi)發(fā)時(shí)間和確保了USB的兼容性。GPIF(GeneralProgrammableInterface)和主/從端點(diǎn)FIFO(8位或16位數據總線(xiàn))為ATA、UTOPIA、EPP、PCMCIA和DSP等提供了簡(jiǎn)單和無(wú)縫連接接口。
CY7C68013的GPIF引擎具有自動(dòng)傳輸數據結構的特性,這種特性使得外圍設備和主機通過(guò)CY7C68013可以無(wú)縫的、高速的傳輸數據。為了實(shí)現高速的數據傳輸,CY7C68013CPU不會(huì )直接參與數據的傳輸,而是直接利用GPIF的自動(dòng)傳輸數據模式。圖1和圖2說(shuō)明了主機IN和OUT數據傳輸過(guò)程。
2.1.1 端點(diǎn)緩沖區
FX2包含3個(gè)64字節端點(diǎn)緩沖區和4K可配置成不同方式的緩沖,其中3個(gè)64字節的緩沖區為EP0、EP1IN和EP1OUT。EP0作為控制端點(diǎn)用,它是一個(gè)雙向端點(diǎn),既可為IN也可為OUT。當需要控制傳輸數據時(shí),FX2固件讀寫(xiě)EP0緩沖區,但是8個(gè)SETUP字節數據不會(huì )出現在這64字節EP0端點(diǎn)緩沖區中。EP1IN和EP1OUT使用獨立的64字節緩沖區,FX2固件可配置這些端點(diǎn)為BULK、INTERRUPT或ISOCHRONOUS傳輸方式,這兩個(gè)端點(diǎn)和EP0一樣只能被固件訪(fǎng)問(wèn)。這一點(diǎn)與大端點(diǎn)緩沖區EP2、EP4、EP6和EP8不同,這四個(gè)端點(diǎn)緩沖區主要用來(lái)和片上或片外進(jìn)行高帶寬數據傳輸而無(wú)需固件的參與。EP2、EP4、EP6和EP8是高帶寬、大緩沖區。它們可被配置成不同的方式來(lái)適應帶寬的需求。
2.1.2 接口信號
在利用GPIF進(jìn)行高速數據傳輸系統設計時(shí),GPIF waveforms的編輯是非常重要的,它控制著(zhù)整個(gè)數據傳輸過(guò)程的讀寫(xiě)時(shí)序。此時(shí)CPU的作用已經(jīng)非常小了,它只起著(zhù)下載代碼到內部RAM以及在固件中如何觸發(fā)GPIF waveforms的作用。FX2專(zhuān)門(mén)為GPIF提供了外圍接口信號,如8位或16位的數據線(xiàn)、控制信號、Ready信號以及地址線(xiàn)。
IFCLK(雙向時(shí)鐘信號):IFCLK是一個(gè)參考時(shí)鐘,可以配置成輸入或輸出。當配置為輸出時(shí),IFCLK被FX2驅動(dòng)為30MHz或48MHz;當配置為輸入時(shí),時(shí)鐘范圍為5-48MHz。
GPIFADR[8:0](輸出):GPIF使用GPIFADR信號為外部設備提供地址線(xiàn),在總線(xiàn)上地址值是自增的。
FD[15:0](雙向):這是USB主機通過(guò)FX2和外部設備進(jìn)行數據傳輸的數據線(xiàn),它可配置成8位或16位。當16位時(shí),FD[7:0]代表端點(diǎn)FIFO中的第一個(gè)字節,FD[15:8]代表第二個(gè)字節。
CTL[5:0](輸出):FX2為外部設備提供了幾個(gè)控制信號,如讀寫(xiě)選通、使能等。
RDY[5:0](輸入):FX2提供了幾個(gè)狀態(tài)檢測信號,它可以檢測外部設備的狀態(tài),如FIFO的空、滿(mǎn)、半滿(mǎn)等。
GSTATE[2:0](輸出):這是調試信號,表示GPIF波形執行的狀態(tài),通常連接到邏輯分析儀上。
2.2 AD9238
AD9238是一個(gè)雙通道的12位A/D轉換器,采用單3V供電,速度可以是20MSPS、40MSPS和65MSPS;低功耗,工作在20MSPS時(shí),功耗為180mW,40MSPS時(shí),功耗為330mW,65MSPS時(shí),功耗為600mW;具有500MHz 3dB帶寬的差分輸入;片上參考源及SHA;靈活的模擬輸入范圍:1Vp-p~2Vp-p;適用于:超聲波設備,射頻通訊,電池電源儀器,低價(jià)示波器等。本系統采用20MSPS的AD9238,可充分發(fā)揮USB在高速傳輸模式下的數據傳輸優(yōu)勢。
2.3 數據采集系統
該數據采集系統整個(gè)框圖如圖3所示,該系統由以下幾部份組成:USB控制器、FIFO、CPLD、AD9238以及數據采集前端電路。
圖3數據采集系統框圖
CPLD主要是控制時(shí)序,時(shí)鐘分頻等。FIFO主要是起著(zhù)高速數據緩沖作用,當FIFO半滿(mǎn)時(shí),數據開(kāi)始向USB主機發(fā)送。我們采用的是同步FIFO,時(shí)鐘信號接IFCLK,當FIFO的/RD信號和/OE信號有效時(shí),每個(gè)IFCLK上升沿就輸出一個(gè)數據;當FIFO的/WR信號有效時(shí),IFCLK上升沿就讀進(jìn)一個(gè)數據。AD9238的20MHz時(shí)鐘信號是通過(guò)CPLD分頻所得。當程序使能AD9238的/OEB_A和/OEB_B信號時(shí),AD9238雙通道開(kāi)始進(jìn)行數據采集并向FIFO寫(xiě)數據。
系統前端的調理電路采用的是AD公司的AD8138,該放大器具有較寬的模擬帶寬(320MHz,-3dB,增益1),而且可以實(shí)現將單端輸入變成差分輸出的功能。此項功能在現代高速模數變換電路中非常有用,因為幾乎所有的高速A/D芯片都要求模擬信號為差分輸入,雖然部分芯片的手冊中提到對于單端輸入信號也可使用,但這樣一來(lái)會(huì )使A/D轉換結果的二次諧波增大,降低信噪比(SNR)。AD8138很好的解決了這個(gè)問(wèn)題,用戶(hù)可以很容易的將單端信號轉換成差分輸出而不必使用變壓器,并且它的輸入阻抗高達6MΩ,可以直接與輸入信號相連而省略隔離放大器,大大精簡(jiǎn)了電路結構。圖4為AD8138的典型應用電路。
圖4AD8138典型應用電路
3軟件設計
3.1Windows驅動(dòng)程序設計
USB設備驅動(dòng)程序基于WDM。WDM型驅動(dòng)程序是內核程序,與標準的Win32用戶(hù)態(tài)程序不同。采用了分層處理的方法。通過(guò)它,用戶(hù)不需要直接與硬件打它道(在USB驅動(dòng)程序中尤為明顯),只需通過(guò)下層驅動(dòng)程序提供的接口號訪(fǎng)問(wèn)硬件。因此,USB設備驅動(dòng)程序不必具體對硬件編程,所有的USB命令、讀寫(xiě)操作通過(guò)總線(xiàn)驅動(dòng)程序轉給USB設備。但是,USB設備驅動(dòng)程序必須定義與外部設備的通訊接口和通訊的數據格式,也必須定義與應用程序的接口。
Cypress公司提供了完整的CY7C68013驅動(dòng)程序源碼、控制面板程序及固件的框架,這大大提高了用戶(hù)開(kāi)發(fā)的進(jìn)度。用戶(hù)只需稍加修改或不需任何修改即可使用所帶驅動(dòng)程序,軟件開(kāi)發(fā)者大量的時(shí)間主要集中在應用程序和固件的開(kāi)發(fā)。本文所述的數據采集系統驅動(dòng)程序就在原來(lái)的基礎上進(jìn)行了簡(jiǎn)單的修改來(lái)滿(mǎn)足我們的需要。根據我們自己的需求,一般只需修改DeviceIoControl例程,如我們主要增加了控制數據傳輸函數、啟動(dòng)和停止AD、復位FIFO等,即IOCTL_START_AD、IOCTL_STOP_AD、IOCTL_RESET_FIFO。
3.2底層固件設計
要實(shí)現USB2.0的高帶寬數據傳輸,必須使用它特有的GPIF特性,在開(kāi)發(fā)固件前,首先必須根據實(shí)際需要對GPIFwaveform進(jìn)行編輯。CY7C68013開(kāi)發(fā)工具中帶有一個(gè)GPIFDesigner,如圖5所示,編輯完waveform后,選擇Tools->ExporttoGPIF.cFile來(lái)輸出GPIF.c文件,然后將該文件加入keilc工程進(jìn)行編譯。
由于CY7C68013的EP2、EP4、EP6、EP8四個(gè)端點(diǎn)共享4KFIFO緩沖區,所以在該系統中,我們將EP2配置成4K的緩沖區,并設置為IN。用EP1OUT作為AD的控制參數傳遞,如啟動(dòng)和停止AD數據輸出、復位FIFO等。在固件程序中,最重要的就是TD_Init()和TD_Poll()兩個(gè)函數。
圖5GPIFDesigner
在TD_Init()中主要完成GPIF相應寄存器的初始化,如下:
voidTD_Init(void)//Calledonceatstartup
{
//settheCPUclockto48MHz
CPUCS=((CPUCS~bmCLKSPD)|bmCLKSPD1);
SYNCDELAY;
EP2CFG=0XE8;//EP2IN,bulk,size1024,4xbuffered
SYNCDELAY;
EP4CFG=0x00;//EP4notvalid
SYNCDELAY;
EP6CFG=0x00;//EP6notvalid
SYNCDELAY;
EP8CFG=0x00;//EP8notvalid
SYNCDELAY;
FIFORESET=0x80;//setNAKALLbittoNAKalltransfersfromhost
SYNCDELAY;
FIFORESET=0x02;//resetEP2FIFO
SYNCDELAY;
FIFORESET=0x00;//clearNAKALLbittoresumenormaloperation
SYNCDELAY;
EP2FIFOCFG=0x01;//allowcoretoseezerotoonetransitionofautooutbit
SYNCDELAY;
EP2FIFOCFG=0x11;//autooutmode,disablePKTENDzerolengthsend,wordops
SYNCDELAY;
EP6FIFOCFG=0x09;//autoinmode,disablePKTENDzerolengthsend,wordops
SYNCDELAY;
GpifInit();//initializeGPIFregisters
SYNCDELAY;
EP2GPIFFLGSEL=0x02;//ForEP2IN,GPIFusesFFflag
SYNCDELAY;
//globalflowstateregisterinitializations
FLOWLOGIC=FlowStates[19];//00110110b-LFUNC[1:0]=00(AANDB),//TERMA/B[2:0]=110(FIFOFlag)
SYNCDELAY;
FLOWSTB=FlowStates[23];//00000100b-MSTB[2:0]=100(CTL4),not//usedasstrobe
SYNCDELAY;
GPIFHOLDAMOUNT=FlowStates[26];//holddataforonehalfclock(10ns)assuming//48MHzIFCLK
SYNCDELAY;
FLOWSTBEDGE=FlowStates[24];//movedataonbothedgesofclock
SYNCDELAY;
FLOWSTBHPERIOD=FlowStates[25];//20.83nshalfperiod
SYNCDELAY;
//resettheexternalFIFO
OEA|=0x07;//turnonPA0、PA1、PA2asoutputpin
IOA|=0x07;//pullPA0、PA1、PA2highinitially
IOA=0xFB;//bringPA2low
EZUSB_Delay(1);//keepPA2lowfor~1ms,morethanenoughtime
IOA|=0x04;//bringPA2highandexitreset
IOA=0xFC;//bringPA0、PA1lowandenableAD
}
在TD_Poll()中主要完成外部FIFO狀態(tài)的檢測和數據的傳輸,主要程序部分如下:
voidTD_Poll(void)
{
if(GPIFTRIG0x80)//ifGPIFinterfaceIDLE
{
if(EXTFIFONOTEMPTY)//ifexternalFIFOisnotempty
{
if(!(EP24FIFOFLGS0x01))//ifEP2FIFOisnotfull
{
if(enum_high_speed)
{
SYNCDELAY;
GPIFTCB1=0x02;//setuptransactioncount(1024//bytes/2forwordwide->0x0100)
SYNCDELAY;
GPIFTCB0=0x00;
SYNCDELAY;
}
else
{
SYNCDELAY;
GPIFTCB1=0x00;//setuptransactioncount(64bytes/2
//forwordwide->0x20)
SYNCDELAY;
GPIFTCB0=0x20;
SYNCDELAY;
}
Setup_FLOWSTATE_Read();//setupFLOWSTATEregistersfor
//FIFOReadoperation
SYNCDELAY;
GPIFTRIG=GPIFTRIGRD|GPIF_EP2;//launchGPIFFIFOREAD
//TransactiontoEP2FIFO
SYNCDELAY;
while(!(GPIFTRIG0x80))//pollGPIFTRIG.7GPIFDonebit
{
;
}
SYNCDELAY;
}
}
}
}
4結束語(yǔ)
筆者通過(guò)對該高速數據采集系統軟硬件的設計,實(shí)現了雙通道AD采集,采集速度可以達到20MSPS,但在此基礎上還可以提高AD采集速度。
評論