USB 2.0接口數(shù)據(jù)采集系統(tǒng)方案設(shè)計(jì)
在圖像處理、瞬態(tài)信號(hào)測(cè)量等一些高速、高精度的應(yīng)用中,需要進(jìn)行高速數(shù)據(jù)采集。USB 2.0接口以其高速率等優(yōu)點(diǎn)漸有取代傳統(tǒng)ISA及PCI數(shù)據(jù)總線的趨勢(shì),熱插拔特性也使其成為各種PC外設(shè)的首選接口。EZ-USB FX2是Cypress公司推出的集成USB 2.0的微處理器,它集成了USB 2.0收發(fā)器、SIE(串行接口引擎)、增強(qiáng)的8051微控制器和可編程的外圍接口。本文將介紹基于EZ-USB FX2系列CY7C68013芯片的高速數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì),該系統(tǒng)具有限幅保護(hù)功能,固件和驅(qū)動(dòng)程序的編寫(xiě)簡(jiǎn)便,能夠完成對(duì)數(shù)據(jù)的高速采集和傳送。
近年來(lái),USB接口由于其傳輸速率高,真正的即插即用等優(yōu)點(diǎn)正在逐漸取代傳統(tǒng)的計(jì)算機(jī)接口如:RS232,EPP等。目前,許多的芯片生產(chǎn)商都推出了符合USB協(xié)議的芯片,如Philips公司的PDIUSBD12,NS公司的USBN9602等。在眾多的USB2.0芯片中,Cypress公司的EZ-USB FX2(CY7C68013)芯片是一個(gè)不錯(cuò)的選擇。本文設(shè)計(jì)了一種基于EZ-USB FX2和MAX1195的數(shù)據(jù)采集系統(tǒng),該系統(tǒng)符合USB2.0協(xié)議標(biāo)準(zhǔn),通過(guò)與高精度激光縱模分析儀連接進(jìn)行調(diào)試,證明該系統(tǒng)達(dá)到了預(yù)定目的。
2. CY7C68013芯片和MAX1195芯片介紹
2.1 CY7C68013介紹:
CY7C68013在一塊芯片上同時(shí)集成了USB2.0收發(fā)器,串行接口引擎SIE,增強(qiáng)型的8051微控制器以及一個(gè)可編程外圍接口GPIF(General Programmable Interface)。CY7C68013的“量子FIFO”(FIFO,先進(jìn)先出存儲(chǔ)器)特性使得無(wú)需8051CPU的任何干預(yù),數(shù)據(jù)即可從外設(shè)上傳到主機(jī),這種數(shù)據(jù)傳輸模式徹底解決了USB2.0收發(fā)器與一般8051微控制器連接時(shí)由于8051的時(shí)鐘頻率低而導(dǎo)致的傳輸速率瓶頸問(wèn)題。CY7C68013芯片的另一個(gè)突出優(yōu)點(diǎn)是其“‘軟’配置”,代碼和數(shù)據(jù)能夠直接通過(guò)USB接口下載到片內(nèi)的RAM上,這一功能通過(guò)Cypress公司獨(dú)創(chuàng)的“重枚舉”(ReNumerationTM)功能實(shí)現(xiàn)。CY7C68013芯片有四個(gè)可編程的批量、中斷、同步傳輸端點(diǎn),可以分別設(shè)置為雙緩沖,三緩沖和四緩沖模式,8位或者16位的外部數(shù)據(jù)接口,該接口可以根據(jù)需要工作在 GPIF或者SLAVEFIFO模式。其中GPIF能夠和絕大部分并行接口如FIFO等實(shí)現(xiàn)“無(wú)膠”連接,即無(wú)需外加任何微控制器或CPLD、FPGA 等。本文的設(shè)計(jì)中采用了GPIF方式。
2.2 MAX1195介紹:
MAX1195是由MAXIM公司推出的一款低功耗、雙路、高速、八位模數(shù)轉(zhuǎn)換芯片,采用流水線(Pipeline)結(jié)構(gòu),最高采樣率40Mbps,內(nèi)部集成了兩個(gè) ADC,真正實(shí)現(xiàn)兩路同步采樣轉(zhuǎn)換。其工作電壓范圍是2.7V-3.6V,具有減小功耗的休眠模式和關(guān)斷(Shut-Down)模式,單端或者差分輸入方式,片上采樣保持(T/H)電路,內(nèi)部或者外部參考電壓,含有用戶可選擇的數(shù)據(jù)輸出格式:二的補(bǔ)碼格式或者補(bǔ)償二進(jìn)制碼格式,具有輸出使能控制,可以將輸出置為高阻態(tài)。此外MAXIM還提供了與MAX1195引腳、封裝完全兼容的10位、更高采樣率的模數(shù)轉(zhuǎn)換芯片,如MAX1197、MAX1198等,因此系統(tǒng)升級(jí)非常方便。在本文的工作中,采用了內(nèi)部參考電壓、雙路單端模擬輸入、補(bǔ)償二進(jìn)制碼輸出格式。
數(shù)據(jù)采集系統(tǒng)方案設(shè)計(jì)
數(shù)據(jù)采集系統(tǒng)的框圖如圖1所示,硬件電路如圖2所示。其中,AD1674是l2位模數(shù)轉(zhuǎn)換芯片,采用逐次比較方式工作。CPLD主要用于控制ADC以及FIFO的時(shí)序、控制ADC的啟動(dòng)與停止和查詢ADC的狀態(tài)等。FIFO主要起著高速數(shù)據(jù)緩沖的作用。

圖1 數(shù)據(jù)采集系統(tǒng)框圖

圖2 系統(tǒng)硬件電路
CY7C68013和AD1674之間通過(guò)CPLD連接,實(shí)現(xiàn)相關(guān)控制線和數(shù)據(jù)線的譯碼。在CY7C68013的控制下,首先對(duì)AD1674進(jìn)行間隔采樣,然后把結(jié)果傳送到FIFO中,當(dāng)采集到一定量的數(shù)據(jù)后,CY7C68013將數(shù)據(jù)打包通過(guò)USB總線傳到PC,由高級(jí)應(yīng)用程序進(jìn)行數(shù)據(jù)處理。擴(kuò)展的 RS232接口可以和外部設(shè)備進(jìn)行通信。上電時(shí),CY7C68013從外部的E2PROM中通過(guò)I2C總線自動(dòng)裝載到內(nèi)部的RAM中,便于固件的修改和升級(jí)。
數(shù)據(jù)采集前端的調(diào)理電路如圖3所示,本設(shè)計(jì)采用了限幅、降壓、濾波和增加輸入阻抗的措施來(lái)保護(hù)后端的轉(zhuǎn)換芯片。
驅(qū)動(dòng)程序和固件設(shè)計(jì)
USB設(shè)備驅(qū)動(dòng)程序基于WDM。WDM型驅(qū)動(dòng)程序是內(nèi)核程序,與標(biāo)準(zhǔn)的Win32用戶態(tài)程序不同,采用了分層處理的方法。通過(guò)它用戶無(wú)須直接與硬件打交道,只需通過(guò)下層驅(qū)動(dòng)程序提供的接口訪問(wèn)硬件。因此,USB設(shè)備驅(qū)動(dòng)程序不必具體對(duì)硬件編程,所有的USB命令、讀寫(xiě)操作通過(guò)總線驅(qū)動(dòng)程序轉(zhuǎn)給USB設(shè)備。但是,USB設(shè)備驅(qū)動(dòng)程序必須定義與外部設(shè)備的通信接口和通信的數(shù)據(jù)格式,也必須定義與應(yīng)用程序的接口。Cypress公司提供了完整的 CY7C68013驅(qū)動(dòng)程序源碼、控制面板程序及固件的框架,這大大加快了用戶開(kāi)發(fā)的進(jìn)度。用戶只需稍加修改或無(wú)須任何修改即可使用現(xiàn)有驅(qū)動(dòng)程序,軟件開(kāi)發(fā)者大量的時(shí)間主要集中在應(yīng)用程序和固件的開(kāi)發(fā)。根據(jù)用戶自己的需求,一般只需修改DeviceIoControl例程。本設(shè)計(jì)主要增加了控制數(shù)據(jù)傳輸函數(shù)、啟動(dòng)和停止ADC、復(fù)位FIFO等。Cypress為CY7C68013提供了開(kāi)發(fā)框架,其中兩個(gè)程序如下。
FW.C:FW.C中包含了程序框架的MAIN函數(shù),管理整個(gè)51內(nèi)核的運(yùn)行,因?yàn)檫@部分的功能已經(jīng)進(jìn)行了精心劃分,一般是不用改動(dòng)的。

圖3 調(diào)理電路
PERIPH.C:用戶必須將PERIPH.C實(shí)例化,它負(fù)責(zé)系統(tǒng)周邊器件的互聯(lián)。固件的設(shè)計(jì)主要針對(duì)這個(gè)文件,用戶必須根據(jù)自己系統(tǒng)的需要,實(shí)例化這個(gè)文件,以實(shí)現(xiàn)所需的功能。在固件程序中,最重要的是TD_init()和TD_poll()這兩個(gè)函數(shù)。以TD_poll()函數(shù)為例,在 TD_poll()中主要完成外部FIFO狀態(tài)的檢測(cè)和數(shù)據(jù)的傳輸,程序主體部分如下。固件調(diào)試時(shí),可以使用Cypress提供的EZ-USB control panel。
Void TD_Poll(void)
{
If(GPIFTRIG & 0x80) //判斷GPIF是否空閑
{
If(EXTFIFONOTEMPTY ) //判斷外部FIFO是否非空
{
If(!(EP24FIFOFLGS & 0x01)) //判斷FIFO是否不滿
{
IF(enum_high_speed)
{
SYNCDELAY;
GPIFTCB1=0x02; //設(shè)置處理計(jì)數(shù)
SYNCDELAY;
GPIFTCB0=0x00;
SYNCDELAY;
}
Else
{
SYNCDELAY;
GPIFTCB1=0x00;
SYNCDELAY;
GPIFTCB0=0x20;
SYNCDELAY;
}
Setup_FLOWSTATE_Read();
SYNCDELAY;
GPIFTRIG=GPIFTRIGRD|GPIF_EP2;
SYNCDELAY;
While(!(GPIFTRIG & 0x80))
{;}
SYNCDELAY;
}
}
}
}