摘 要:以EZ-USB FX2作為USB接口芯片設計一種數據采集系統。該系統應用EZ-USB FX2芯片構建單片機和主機的數據管道,接口符合USB2.0協議。詳細介紹該系統的硬件組成和軟件設計,包括FX2的固件設計和主機用戶程序。EZ-USB FX2芯片工作在從屬FIFO方式下,通過適當的配置可與單片機方便地進行連接,單片機可以像訪問外部存儲器一樣訪問FX2的端點。主機應用程序通過USB接口向設備發送相應的命令來控制采樣過程。該系統硬件擴展方便、編程簡單。
關鍵詞:FX2;Slave FIFO;USB;數據采集
中圖分類號:TP334 文獻標識碼:B 文章編號:1004-373X(2009)04-065-03
Design of Data Acquisition System Based on Single Chip Computer and USB Interface
LI Guozhu
(Xi′an University of Arts and Science,Xi′an,710065,China)
Abstract:A data acquisition system is designed based on the USB interface chip EZ-USB FX2.The system uses EZ-USB FX2 chip to form the data pipeline between microprocessor and computer.The interface conforms to the USB2.0 protocol.EZ-USB FX2 chip works in the slave FIFO way.The chip can be connected with microprocessor conveniently by suitable configure.The microprocessor can access to FX2′s endpoint by the same way as access to external memory.The user′s application program controls the sampling process through USB interface by transmission corresponding command to the equipment.To the system,the expansion of hardware is convenient and the programming is simple.In this paper,both hardware design and software design of the system are discussed in great detail,including the firmware of FX2 and user′s application program of the computer side.
Keywords:FX2;Slave FIFO;USB;data acquisition
在工業生產和科學技術研究中,常利用PC或工控機對各種數據進行采集,以獲得所需要的控制信息和實驗數據。傳統的數據采集系統多以ISA,EISA或PCI插卡的形式完成數據傳輸,這種方式存在安裝麻煩,受計算機插槽數量、地址、中斷資源限制,可擴展性差等缺點[1]。由于通用串行總線(Universal Serial Bus,USB)具有自動被系統識別,自動安裝驅動程序、自行進行系統配置,以及支持不同速率的同步和異步傳輸方式,支持熱插拔和即插即用(Plug and Play,PNP)等優點,已逐漸成為現代數據傳輸的發展趨勢。
目前實現USB數據傳送多采用專用的USB接口芯片,文獻[1,2]采用的PDIUSBD12可支持USB1.1協議,文獻[3]采用的接口芯片為USB100也僅支持USB1.1協議,文獻[4]采用CP2102符合USB2.0協議,其通用的驅動程序可將設備作為虛擬的COM端口設備進行操作,文獻[5]采用Philips公司ISP1581芯片作為USB2.0的接口芯片。這里采用Cypress公司的CY7C68013作為USB接口芯片,設計實現了基于單片機和USB2.0的數據采集系統。該系統可實現單通道模擬信號的采集,主機應用程序負責啟動和停止采樣,采樣間隔時間由主機應用程序設置調整,采樣數據傳給主機應用程序顯示并保存。
1 系統硬件設計
1.1 系統硬件組成
整個系統的硬件結構如圖1所示。AT89C52為主控單片機,負責控制A/D轉換、上傳采集數據、接收并執行主機的命令。CY7C68013為USB接口芯片。A/D轉換芯片采用TI公司生產的TLC549,AD780是一款高精度參考電壓芯片,可為TLC549提供2.5 V或者3.0 V的參考電壓。系統+5 V電源由主機的USB接口提供,CY7C68013所需的電源為+3.3 V,由+5 V電源接穩壓芯片AP1117提供,圖中沒有畫出。
1.2 TLC549
TLC549[6]是以8位開關電容逐次逼近A/D轉換器為基礎而構造的CMOS A/D轉換器,將其設計成能通過三態輸出與微處理器或外圍設備串行接口。TLC549用輸入/輸出時鐘(I/O CLOCK)和芯片選擇(CS)輸入作數據控制,轉換結果由 DATAOUT 引腳輸出。I/O CLOCK 端的最高頻率可達1.1 MHz。TLC-549片內系統時鐘工作在4 MHz(不需要外部時鐘)。片內系統時鐘使內部器件的操作獨立于串行輸入/輸出時序并允許TLC549像許多軟件和硬件所要求的那樣工作。I/O CLOCK和內部系統時鐘可以實現高速數據傳送,使得TLC549可實現40 kHz的采樣頻率。TLC549具有通用控制邏輯及自動工作或在微處理器控制下工作的片內采樣/保持電路,差分高阻抗基準電壓輸入端,易于實現比例轉換的高速轉換器,定標及隔離電路。整個開關電容逐次逼近轉換器電路的設計允許在小于17 μs的時間內,以最大誤差±0.5為最低有效位的精度實現轉換。

1.3 CY7C68013及其固件程序
EZ-USB FX2系列芯片CY7C68013是業界第一個支持USB2.0,同時向下兼容USB1.1規范的單片機,為描述方便以下簡稱該芯片為FX2。FX2支持全速傳輸(12 Mb/s)和高速傳輸(480 Mb/s),該芯片將USB2.0收發器、串行接口引擎SIE、增強的8051內核、GPIF等集成于一體。FX2內含4 KB的端點緩沖區FIFO,可以被配置為具有不同大小緩沖區的IN或OUT端點(EP2,EP4,EP6,EP8),具有USB協議所規定的4種傳輸方式,即控制方式、中斷方式、批量傳輸、和同步傳輸方式[7]。Cypress公司為FX2提供了完善的軟件開發工具包,降低了開難度,加快了開發進度。
FX2可以工作在3種不同的模式下完成USB數據的傳輸,即Ports模式、GPIF模式和Slave FIFO模式。Ports模式[8]下其USB數據的傳輸主要在FX2的8051內核參與下完成,數據傳輸通過執行指令實現,因此數據的傳輸率比較低,對大批量數據傳輸一般采用后兩種方式。GPIF方式,稱為通用可編程接口方式,在此模式下,FX2的FIFO是由內部的GPIF控制的,FX2利用由軟件編程輸出讀寫控制波形讀取FIFO標志,控制FIFO的選通,并且對外部設備提供了用戶專用接口,可以對許多通用總線接口進行訪問,如ASIC,DSP和存儲器等。文獻[9,10]利用FX2的GPIF方式構建了USB數據傳輸通道。Slave FIFO方式是將FX2的FIFO作為外部控制器(如FPGA或單片機)的從屬FIFO,外部控制器可像普通FIFO操作一樣對FX2的FIFO進行讀寫,而不考慮該包的大小,傳輸速率可明顯提高,文中FX2在Slave FIFO模式下工作。FX2有3種封裝形式:128引腳、100引腳和56引腳,這里選用FX2的56引腳的封裝形式。
FX2芯片在使用時必須先下載固件程序,固件程序主要負責完成芯片初始化,對芯片進行必要的配置、處理設備請求、進行數據傳輸等相應工作。用戶通過編寫適當的固件程序完成對FX2的設置。Cypress公司提供了一個固件程序開發框架可以大大簡化FX2芯片固件程序的開發難度。通過編寫用戶初始化函數TD_Init(),用戶可以規定各種端點資源的使用以及配置外圍接口的輸入/輸出等。其主要配置語句如下:
IFCONFIG = 0xCB;//FX2配置為異步Slave FIFO方式,內部時鐘48 MHz
EP2CFG = 0xA0;//EP2,4×512 B,BULK,OUT
EP2FIFOCFG = 0x10; //EP2自動OUT,8位
EP6CFG = 0xE0; //EP6,4×512 B,BULK,IN
EP6FIFOCFG = 0x08;//EP6自動IN,8位
EP4CFG = 0x20;//EP4無效
EP8CFG = 0x60;//EP8無效
PINFLAGSAB = 0x8E;//FLAGA固定為EP6FF,FLAGB固定為EP2EF
PINFLAGSCD = 0x04;//FLAGC固定為EP2PF
PORTACFG |= 0x40;//PA7引腳配置為SLCS
FIFOPINPOLAR = 0x00;//所有引腳低電平有效
EP2FIFOPFH = 0x00;//FP2端點的整個FIFO大于等于1時,
FP2的可編程標志激活
EP2FIFOPFL = 0x01;
固件程序將FX2配置為異步Slave FIFO模式,總線寬度8位,在4個端點中,EP4和EP8未被使用,EP2和EP6的配置如表1所示。由于采用自動輸入/輸出模式,主機和單片機通過旁路FX2的CPU直接連接,所有數據被直接通過FIFO管道提交,不需固件程序干預。在FX2的Slave FIFO模式下,FIFOADR[1∶0]引腳作為地址線選擇某個端點,SLCS相當于片選信號,SLWR(寫)與單片機的WR引腳相連,SLRD(讀)和SLOE(輸出使能)與單片機的RD引腳相連。單片機通過訪問地址為0x00的外部存儲器的方式就可以實現對EP2的訪問,同理可訪問EP6端點。

單片機通過FX2的3個標志引腳(FALGA,FLAGB,FLAGC)來全面掌握FX2的各端點FIFO的狀況。FLAGA定義為輸入端點EP6的滿標志,當輸入數據滿時該引腳為低電平;FLAGB被定義為輸出端點EP2的空標志,當主機傳來的數據被讀空時該引腳為低電平;FLAGC定義為當EP2端點整個FIFO中的字節數大于等于1時為低電平。假設當前主機沒有傳送命令,則FLAGC為高電平,當主機發送命令后,EP2的字節數大于等于1,則FLAGC變為低電平。這樣在FALGC引腳上產生了一個下降沿,將此引腳與單片機的INT0引腳相連,則當主機發送命令后單片機會觸發INT0中斷,在INT0的中斷處理程序中單片機讀取并執行傳來的命令。
2 系統軟件設計
2.1 驅動程序
在EZ-USB FX2開發包中,提供有通用的驅動程序包,對該程序包稍加修改就可生成一個具有下載固件并完成設備重枚舉功能的設備驅動程序。文獻[7]對驅動程序的開發步驟有詳細的記述,這里采用的就是這個通用驅動程序(GPD)。
2.2 主機應用程序
主機應用程序主要實現向設備發送命令數據包,接收設備傳送的數據并進行顯示,主機應用程序通過通用驅動程序來完成對設備的控制和通信。應用程序采用VC6.0編寫,與設備通信時,首先通過調用Win32函數CreateFile()來取得訪問設備驅動程序的句柄。該函數的語句實例如下:
HANDLE DeviceHandle;
DeviceHandle = CreateFile("\\\\.\\ezusb-0",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
用戶得到設備句柄后,就可以使用Win32函數DeviceIoControl()來向設備提交相應的IOCTL控制碼,進行讀寫和控制操作,完成相應操作后應用程序通過Win32函數CloseHandle()關閉設備句柄結束1次操作。以下是部分操作的代碼實例:
//讀操作
BOOL status = FLASE;//執行結果
status = DeviceIoControl (g_hDevice,//輸入設備句柄
IOCTL_EZUSB_BULK_READ,//批量讀取數據的IOCTL控制碼
&bulkControl;,//輸入緩沖區,指向BULK_TRANSFER_CONTROL
//結構的指針,該結構主要用來提供管道號
sizeof(BULK_TRANSFER_CONTROL),//輸入緩沖區長度
inBuffer,//保存讀取數據的緩沖區指針
FX2_BufferSize,//USB傳送數據的總長度,必須小于64 KB
&BytesReturned;,//實際返回的字節數
NULL);
//寫操作
status = DeviceIoControl (g_hDevice,//輸出設備句柄
IOCTL_EZUSB_BULK_WRITE,//批量寫數據的IOCTL控制碼
&bulkControl;,//輸入緩沖區,指向BULK_TRANSFER_CONTROL結構的指針
sizeof(BULK_TRANSFER_CONTROL),//輸入緩沖區長度
outBuffer,//保存要寫到設備的數據緩沖區指針
nBufferSize,//USB傳送數據的總長度,必須小于64 KB
&BytesReturned;,//實際返回的字節數
NULL);
//關閉設備
CloseHandle(g_hDevice);
應用程序中有兩個線程,輔助線程為采樣線程,采樣線程的流程如圖2所示。

采樣線程負責從設備讀取數據,并通過消息傳送機制與主線程通信;主線程負責采樣數據的顯示、存盤,向設備發送命令數據包,以及啟動/停止采樣線程。當執行啟動采樣命令時,主線程先向設備發送啟動命令數據包,然后啟動采樣線程準備接收數據;當執行停止采樣命令時,主線程先向設備發送停止命令數據包,然后停止采樣線程結束數據的接收。命令數據包大小為4 B,包含有命令字和采樣間隔時間參數等信息。
2.3 單片機程序
如上所述,單片機的INT0中斷一旦觸發,表示主機有命令數據包傳送到。在INT0的中斷處理程序中,單片機讀取EP2端點的數據直到EP2端點為空(FLAGB為低電平),獲得上位機發送的命令數據包。若接收到啟動命令,則根據命令數據包的采樣間隔時間參數來設置計數變量和定時器T0的初值并啟動T0;若接收到的命令為停止命令,則停止定時器T0。在T0的中斷處理程序中若相應的計數變量達到設定值,則完成A/D轉換、讀取數據以及將數據寫入EP6端點的操作。計數變量和T0的初值均根據命令數據包的參數進行設置,因此設備的采樣間隔時間可以由主機程序進行調整。
3 結 語
工作于Slave FIFO方式下的FX2相當于在外部控制和主機之間構造了一個的數據管道。通過對FX2的FIFO標志引腳FLAGA,FALGB,FLAGC的配置,使該芯片可以方便地與單片機進行連接,單片機通過外部中斷獲知主機數據的到達,通過其他標志引腳獲得端點FIFO的信息,單片機和主機通信時,感覺不到FX2的存在。基于單片機和FX2的數據采集系統擴展方便、編程簡單、無需外接電源、采樣間隔時間由主機調整,實現了數據采集系統的小型化和便攜化,在現場信號采集,教學實驗,儀器儀表等領域具有一定的應用前景。
參 考 文 獻
[1]張樹明,方昌林.基于USB總線的數據采集系統[J].機床與液壓,2005(12):132-134.
[2]周興,戴勝華.基于單片機的USB數據采集系統設計[J].儀器儀表標準化與計量,2006(1):25-27.
[3]石曉瑛,許智榜.基于AT90S8515和USB接口數據采集系統[J].微計算機信息,2005,21(10):90-92.
[4]叢偉波,楊勇,韓清凱.低功耗數據采集系統的USB接口設計[J].單片機與嵌入式系統應用,2005(1):25-27.
[5]張建鵬,解國明,李剛.基于ISP1581型接口電路的USB2.0接口設計[J].國外電子元器件,2005(9):7-10.
[6]李國厚.串行A/D轉換器TLC548/549及其應用[J].儀表技術,2001(3):35-36.
[7]錢峰.EZ-USB FX2單片機原理、編程及應用[M].北京:北京航空航天大學出版社,2006.
[8]袁衛,趙小明,張建奇.Ports模式下CY7C68013和FPGA的數據通信[J].單片機與嵌入式應用系統,2006(7):49-51.
[9]賈寶金,王寶珠,李曉玲.基于USB的數據采集系統的設計與研究[J].現代電子技術,2007,30(24):187-190.
[10]岳躍平,霍玉晶,何淑芳.基于USB2.0 技術的高速雙路數據采集系統[J].微計算機信息,2007,23(7):104-105.
作者簡介 李國柱 男,1976年出生,山西長治人,講師,碩士。研究方向微機控制。