基于USB2.0的高速數(shù)據(jù)通信接口設(shè)計
掃描二維碼
隨時隨地手機看文章
關(guān)鍵詞:EZ-USB FX2; CY7C68013; TMS320C6203B; 數(shù)據(jù)傳輸
ABSTRACT: Using CY7C6801 as the control chip, the communication between DSP and PC in the voice signals processing system is realized. A brief introduction of the basic features of EZ2USB CY7C68013 and the designing of interface to TMS320C6203B is provided. The development of Programming Firmware、device driver and application are thoroughly researched.
Key words: EZ-USB FX2; CY7C68013; TMS320C6203B; data transmission
0 引言
由于DSP的工作頻率較高,如TMS320C6203B時鐘頻率高達250MHZ,故其數(shù)據(jù)讀寫周期很短,然而PC機串口讀寫速度較低,最大數(shù)據(jù)吞吐量約為115kbps,盡管DSP在與這些慢速外設(shè)進行數(shù)據(jù)交換時可以加入額外的等待周期,但是在實時性要求苛刻,算法復(fù)雜的場合,將DSP從這些冗長的等待周期中解放出來,將其時間重點放在處理關(guān)鍵的實時任務(wù)中去,有著重要的實際意義[1]。為了提高系統(tǒng)的實時性, 高速接口電路設(shè)計顯得尤為重要。目前流行的EZ-USB FX2芯片的傳輸速率為480Mbps,較好地解決了DSP與PC機間高速數(shù)據(jù)傳輸時的帶寬瓶勁問題。本文設(shè)計并實現(xiàn)了TMS320C6000 系列DSP上, 利用EZ-USB FX2系列芯片CY7C68013 的接口技術(shù), 實現(xiàn)了DSP 與計算機之間的高速數(shù)據(jù)傳輸。
1 CY7C68013結(jié)構(gòu)特點
CY7C68013是Cypress公司研制開發(fā)的EZ-USB FX2系列芯片,該芯片符合USB2.0規(guī)范,同時兼容USB1.0的全速工作模式[2],它的功能框圖主要包括5個部分(圖1):
(1)收發(fā)器。USB和PC機通過D+和D-兩根信號線進行數(shù)據(jù)傳輸,數(shù)據(jù)以480Mbit/s的全速信號或者以240Mbit/s的半速信號在D+和D-信號線上差分傳輸。
(2)智能接口引擎(SIE)。SIE通過包排序、信號產(chǎn)生、信號檢測、CRC產(chǎn)生、CRC校驗、NRZI數(shù)據(jù)編碼、位填充、包標(biāo)識產(chǎn)生和解碼等功能來處理USB通信協(xié)議,并保證傳送到USB電纜上的數(shù)據(jù)字節(jié)以LSB開頭。
(3)通用微控制器以及片上RAM。USB控制器采用通用的8051微控制器,即編程語言為51系列單片機的通用語言,可使實際操作更加靈活方便。
(4)I2C總線控制器。主要為完成將USB控制器作為主設(shè)備時必須的配置。
(5)片內(nèi)FIFO。其容量為4KB,可以快速實現(xiàn)與不同速度的外設(shè)通信。
2 CY7C68013與TMS320C6203B的接口電路設(shè)計
CY7C68013是一個非常方便的USB2.0實現(xiàn)方案,它提供與DSP連接的接口,連接方式有兩種:Slave FIFOs和Master可編程接口GPIF[3]。本文采用Slave FIFOs異步讀寫方式。Slave FIFOs方式是從機方式,DSP可以象讀寫普通FIFO一樣對CY7C68013內(nèi)部的多層緩沖進行讀寫。具體的電路連接如圖2所示:
圖1 CY7C68013功能框圖
圖2 CY7C68013與TMS320C6203B電路連接圖
FLAGA、FLAGB和FLAGC是CY7C68013內(nèi)部FIFO的狀態(tài)標(biāo)志,TMS320C6203B通過通用I/O口獲得CY7C68013內(nèi)部FIFO的空、半滿(由用戶設(shè)定半滿閾值)和滿這3個狀態(tài)信號,EMIF接口的CE2空間對CY7C68013進行讀寫操作。其工作過程為:DSP通過USB向PC發(fā)送數(shù)據(jù)時,首先查看空、半滿和滿這3個狀態(tài)信號,然后向USB寫入適當(dāng)大小的數(shù)據(jù),以保證數(shù)據(jù)不會溢出;PC機通過USB向DSP發(fā)送命令字時,USB通過中斷方式通知DSP讀取命令字。
3 軟件設(shè)計
系統(tǒng)的軟件設(shè)計包括3部分:C8051固件設(shè)計、設(shè)備驅(qū)動程序沒計和應(yīng)用軟件設(shè)計。CY7C68013的功能具體實現(xiàn)過程如下:
(1)當(dāng)設(shè)備連接時,Windows的設(shè)備管理器自動檢測到該設(shè)備,并讀取由CY7C68013核心(并非C805l固件)傳回的設(shè)備描述符,根據(jù)它提供的廠商和產(chǎn)品ID號VID/PID(存放在FX2外接E2PROM中)與.inf文件進行比較,找到固件下載驅(qū)動程序(ezloader.sys),從主機將C8051固件下載到CY7C68013的RAM中。
(2)C8051固件下載到RAM后,CY7C68013仿真一個脫離再連接至USB總線的過程,執(zhí)行重新枚舉過程,讓C805l固件控制USB傳輸。Windows的設(shè)備管理器會檢測到新的USB設(shè)備的連接,并根據(jù)C8051固件提供的廠商ID(VID)/產(chǎn)品ID(PID)(不同于CY7C68013核心提供的VID/PID)來加載該USB設(shè)備的設(shè)備驅(qū)動程序。
(3)應(yīng)用軟件調(diào)用CreateFile()API函數(shù),使用識別該設(shè)備的符號鏈接來取得該設(shè)備的代號。取得設(shè)備的句柄后,應(yīng)用軟件通過DeviceIoControl()向I/O系統(tǒng)服務(wù)發(fā)出要求傳入數(shù)據(jù)的I/O請求,I/O管理器將此請求構(gòu)造成一個合適的IRP傳遞給CY7C68013設(shè)備驅(qū)動程序。CY7C68013設(shè)備驅(qū)動程序根據(jù)該IRP中包含的具體操作來構(gòu)造相應(yīng)的USB請求塊,并據(jù)此形成新的IRP傳遞給USB總線驅(qū)動程序。USB總線驅(qū)動程序根據(jù)該USB請求塊從CY7C68013設(shè)備讀取數(shù)據(jù)。操作的結(jié)果再用IRP一層一層地返回給應(yīng)用程序,應(yīng)用程序再對數(shù)據(jù)進行分析和處理[4]。
3.1 C8051固件設(shè)計
Cypress公司為了簡化固件開發(fā),縮短時間,加速USB外圍的開發(fā),在EZ-USB FX2軟件開發(fā)包里提供了固件架構(gòu)。該固件架構(gòu)利用C8051的程序代碼來實現(xiàn)CY7C68013芯片起始設(shè)置、USB標(biāo)準(zhǔn)設(shè)備請求的處理以及USB閑置模式的電源管理服務(wù)。用戶僅需提供其USB描述符表(即dscr.a51)及實現(xiàn)外圍功能的程序代碼(periph.c),即可完成完全兼容的USB設(shè)備。
固件的編譯在Kei的集成開發(fā)環(huán)境中進行,在建立的項目中包含5個文件ez_usb.lib、
usbjmptb.obj、dscr.a51和periph.c,其中:
固件架構(gòu)程序流程如圖3所示。該程序首先初始化所有的內(nèi)部狀態(tài)變量,然后調(diào)用TD_Init函數(shù)進行初始化,初始化主要包括:
(1)使CY7C68013工作于異步從FIFO模式。相應(yīng)的寄存器操作為IFCONFIG=0xCB。
(2)將4KB的FIFO對應(yīng)到兩個端點(EndPoint),即EndPoint2和EndPoint6。相應(yīng)的寄存器操作為:EP2(:FG=0xA0,EP6(:FG=0xE2。EndPoint2與EndPoint6分別對應(yīng)21kB的內(nèi)部FIFO(下面分別稱作FIF02,F(xiàn)IF06),存放LJSB需要上傳與接收的數(shù)據(jù)。其中EndPoint2為OUT型,負(fù)責(zé)從主機接收數(shù)據(jù);EndPoint6為IN型,負(fù)責(zé)向主機發(fā)送數(shù)據(jù)。另外EndPoint2
與EndPoint6均采用批量(BULK)傳輸方式,這種方式相對于其他LJSB2.0定義的傳輸方式
具有數(shù)據(jù)可靠、傳輸速率高等特點,是最常用的傳輸方式。www.51kaifa.com/
(3)對FIF0進行配置。相應(yīng)的寄存器操作為E192FIFO(:FG=0xl 1,EP6FIFOCFG=0x0D。本案例將FIF02,F(xiàn)IF06設(shè)置成自動方式。
圖3 固件架構(gòu)程序流程
初始化完成后,打開中斷,之后固件程序開始枚舉USB設(shè)備,直至端點0上接收到通信建立包時為止[5]。一旦收到通信建立包,將重復(fù)執(zhí)行下面的任務(wù)分配過程:
(1)調(diào)用TD_Poll()函數(shù),以完成用戶指定的任務(wù)。
(2)判斷是否有USB設(shè)備請求?如果有,則調(diào)用ParseControlTransfer()函數(shù)進行相應(yīng)的處理;如果沒有,則繼續(xù)向下執(zhí)行。
(3)檢測USB總線是否空閑。如果空閑,則調(diào)用TD_Suspend()函數(shù),交由用戶處理。在TD_Suspend返回真值后,8051處于空閑狀態(tài)。這時,只有USB總線活動或芯片Wakeup管腳活動,才能將8051重新激活。
(4)8051被激活后,固件程序?qū)⑹紫日{(diào)用TD_Resume()函數(shù),以使8051從空閑狀態(tài)中恢復(fù)出來,然后再處理用戶指令。
3.2 設(shè)備驅(qū)動程序設(shè)計
開發(fā)USB設(shè)備驅(qū)動程序,可采用Numege公司的開發(fā)包DriverWorks和Mitmsoft公司的
Windows 2000 DDK.并以VC++6 0作為輔助開發(fā)環(huán)境。
CY7C68013的設(shè)備驅(qū)動程序有兩種:一種用來在設(shè)備接人時從主機下載困件到RAM中,稱為固件下載驅(qū)動程序(ezloader.sys);另一種是在設(shè)備重新枚舉后加載的設(shè)備驅(qū)動程序(ezusb.sys),應(yīng)用軟件通過該設(shè)備驅(qū)動程序與CY7C68013通信。固件的程序代碼既可以通過外部E2PROM下載,也可通過主機下載。本文以從主機下載為例進行說明,若選擇主機下載方式,則此時外接E2PROM中存放的是固件下載的PID/VID,且第1個字節(jié)是0xC0H,系統(tǒng)通過該PID/VID找到固件下載驅(qū)動程序(ezloader.sys),將相應(yīng)的固件代碼下載到FX2的RAM中。
在將固件下載到RAM中后,系統(tǒng)清除內(nèi)存中的固件下載驅(qū)動程序.并進行重新枚舉,讓C8051固件控制CY7C68013。此時,系統(tǒng)獲得由C8051固件提供的PID/VID(與E2PROM中的不同),認(rèn)為有新的USB設(shè)備接入,并據(jù)此加載相應(yīng)的設(shè)備驅(qū)動程序。
3.3 應(yīng)用軟件設(shè)計
應(yīng)用軟件滿足系統(tǒng)與用戶的接口,它通過通用驅(qū)動程序完成對外設(shè)的控制和通信,如開啟/關(guān)閉USB設(shè)備、檢測USB設(shè)備、設(shè)置USB數(shù)據(jù)管道等。它由動態(tài)鏈接庫和應(yīng)用程序兩部分組成:動態(tài)鏈接庫負(fù)責(zé)與USB設(shè)備驅(qū)動程序通信,響應(yīng)應(yīng)用程序的各種請求;應(yīng)用程序則則以定時查詢的方式將TMS320C6203B后的數(shù)據(jù)讀入計算機事先開辟的大容量內(nèi)存緩沖區(qū), 同時從緩沖區(qū)讀出數(shù)據(jù)實時顯示, 處理結(jié)束后再將內(nèi)存緩沖區(qū)的數(shù)據(jù)存盤以及向TMS320C6203B發(fā)送控制命令。
動態(tài)鏈接庫對設(shè)備驅(qū)動程序的訪問都是通過I/O Control調(diào)用來實現(xiàn)。首先調(diào)用Win32函數(shù)CreatFile()得到設(shè)備驅(qū)動程序的句柄,然后調(diào)用Win32函數(shù)DeviceIocontrol (),通過得到的句柄把IOCTL和相關(guān)的輸入輸出緩沖區(qū)提交給驅(qū)動程序。當(dāng)應(yīng)用軟件退出時,用
CloseHandle()函數(shù)關(guān)閉設(shè)備。
在編寫應(yīng)用程序時,先建立與外沒的連接,然后實施數(shù)據(jù)的傳輸。在系統(tǒng)啟動信號處理算法后,為保證不丟失數(shù)據(jù),用戶程序應(yīng)建立一個新的工作線程專門獲取外沒傳來的數(shù)據(jù)。程序中主要用到兩個API函數(shù)CreateFile()和DeviceIoControl()。CreatFile()取得設(shè)備句柄后,DeviceIoControl()根據(jù)該句柄完成數(shù)據(jù)傳輸。,
部分程序代碼如下:
hDevice=CreateFile(“.EZUSB_0”,
GENERIC_READ| GENERIC_WRITE,
FILE_SHARP_WRITE,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORAL,NULL);
If(hDevice= =INVALID_HANDLE_VALUE)
{ Application->MessageBoxA(“創(chuàng)建設(shè)備失敗,請確認(rèn)設(shè)備是否連接上!”,NULL,IDOK);}
else{DeviceControl(hDevice,IOCTL_ EZUSB_BULK_WRITE,
&blkctl,sizeof(BULK_TRANSFER_CONTROL),
&inBUFFER,
sizeof(inBuffer),
&nBytes,
NULL);
…}
4 結(jié)論
采用兩種方法對本系統(tǒng)的數(shù)據(jù)傳輸速度進行測試:
(1) DSP 將ADC 采集的語音信號進行處理后,將其頻率、相位等數(shù)據(jù)上傳給計算機進行分析處理;
(2)計算機將控制指令傳給DSP。結(jié)果顯示, 兩種方法的傳輸速度均可達到64Mb/s以上, 完全可以滿足實時數(shù)據(jù)處理的需要。
該接口電路在本人開發(fā)的基于DSP的語音信號采集與處理系統(tǒng)中, 實現(xiàn)了數(shù)據(jù)高速傳輸?shù)娜蝿?wù), 工作性能良好。
本文作者創(chuàng)新點:傳統(tǒng)的信號處理系統(tǒng)中數(shù)據(jù)傳輸接口在低速時常采用標(biāo)準(zhǔn)串行口或并行口, 高速時一般采用PCI總線接口。但標(biāo)準(zhǔn)串行口或并行口數(shù)據(jù)傳輸速率較低; PCI總線盡管數(shù)據(jù)傳輸速率可以達到1Gbps , 但是硬件設(shè)計和驅(qū)動開發(fā)難度較大,USB總線具有快速、雙向、低價并可熱插撥等特性,而且支持各種PC與外設(shè)之間的連接,本文將USB2.0接口芯片CY7C68013用于信號處理系統(tǒng)中,處理后的數(shù)據(jù)經(jīng)USB 向計算機傳輸,速度得到了大大提高, 并且系統(tǒng)可靠性也達到了理想效果。本文所述的方法具有一定的普遍性, 可用于多種微處理擴展USB 接口的方案中。
參考文獻:
[1] 徐慶元,張?zhí)煨?鐘勝. 基于USB 總線的高速視頻采集系統(tǒng)設(shè)計[J].微計算機信息,2006,22(10-1):247-249.
[2] Cypress Semiconductor Corporation. EZ2 USB Technical Reference Manual[R]. 2002.
[3] Cypress Semiconductor Corporation. EZ2 USB Series FX2 Getting Started[R]. 2002.
[4] 李爽,張鳴瑞. 一種帶USB接口的便攜式語音采集卡的設(shè)計[J].計算機應(yīng)用研究,2001,18 (5):146-148.
[5] 劉少峰,韋克平. USB 軟件系統(tǒng)的開發(fā)[J].計算機應(yīng)用研究,2002,19(3):102-104.