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