基于DSP的USB設(shè)備固件程序開(kāi)發(fā)
關(guān)鍵詞:TMS320VC5509A;CSL;DSP;USB;固件程序
1.引言
通用串行總線(USB)是一種高傳輸速率的串行接口總線,由于它具有即插即用、易于擴(kuò)展、傳輸速率高、連接簡(jiǎn)單、使用方便的特點(diǎn),被廣泛的應(yīng)用于各種計(jì)算機(jī)外設(shè)、數(shù)據(jù)采集、數(shù)字設(shè)備以及工業(yè)控制等領(lǐng)域中。選取合適的USB控制芯片是USB數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)的重要環(huán)節(jié),目前常采用USB控制芯片有兩類(lèi),一類(lèi)是不帶MCU的控制芯片,如PDIUSBD12;而另一類(lèi)是帶MCU的,如EZ―USB系列等。這兩類(lèi)專(zhuān)用的控制芯片都需要通過(guò)芯片所提供的接口來(lái)與系統(tǒng)處理器進(jìn)行通信,而本文介紹的USB接口方案沒(méi)有采用專(zhuān)用的USB控制芯片,而是采用DSP芯片TMS320VC5509A內(nèi)部集成的USB模塊來(lái)完成USB通信,使系統(tǒng)硬件設(shè)計(jì)和調(diào)試難度都大大降低,同時(shí)也提高了系統(tǒng)的集成度和穩(wěn)定性。
2.USB接口設(shè)計(jì)
2.1 TMS320VC5509A簡(jiǎn)介
TMS320VC5509A是TI推出的高性能、低功耗的定點(diǎn)DSP處理器,CPU頻率最高可以運(yùn)行在200MHz(內(nèi)核電壓工作在1.6v),每個(gè)時(shí)鐘周期可執(zhí)行一到兩條指令,有兩個(gè)算術(shù)邏輯單元(ALU),兩個(gè)硬件乘法器,是一款具有較高性?xún)r(jià)比、高集成度、低功耗的DSP芯片,適用于便攜式設(shè)備中。TMS320VC5509A集成了128K 16Bits RAM、32K 16Bits的ROM,且?guī)в蠩MIF接口, 可實(shí)現(xiàn)與多種存儲(chǔ)器之間的無(wú)縫連接。片內(nèi)還有豐富的外設(shè):2個(gè)20位的定時(shí)器;3個(gè)多通道緩沖串口(McBSP);USB全速接口(12Mbps);I2C接口;實(shí)時(shí)時(shí)鐘等[1]。
2.2 TMS320VC5509A的USB模塊介紹
TMS320VC5509A自帶的USB模塊支持USB1.1協(xié)議全速標(biāo)準(zhǔn),該USB模塊有兩個(gè)控制端點(diǎn)(僅用于控制傳輸)和14個(gè)通用端點(diǎn),通用端點(diǎn)支持中斷、批量和同步傳輸。DSP的USB模塊由串行接口引擎(SIE)、USB緩沖管理單元(UBM)、緩沖器RAM、USB的DMA控制器和緩沖器RAM仲裁器組成。DSP存儲(chǔ)器與USB主機(jī)之間的數(shù)據(jù)傳輸模型如圖(1)所示:在IN事務(wù)中,CPU或USB的DMA控制器將準(zhǔn)備發(fā)送到主機(jī)的數(shù)據(jù)放到緩沖器RAM中,等待USB緩沖管理單元將數(shù)據(jù)取出后送到串行接口引擎(SIE),由SIE負(fù)責(zé)數(shù)據(jù)的發(fā)送;在OUT事務(wù)中,SIE接收到由主機(jī)發(fā)來(lái)的數(shù)據(jù)后送到UBM,再送入到緩沖器RAM中,等待CPU或USB的DMA控制器將數(shù)據(jù)取出后送到DSP的存儲(chǔ)器中。
圖(1)DSP存儲(chǔ)器與USB主機(jī)之間的數(shù)據(jù)傳輸
2.3 USB 模塊的時(shí)鐘發(fā)生器:
USB模塊有專(zhuān)門(mén)的時(shí)鐘發(fā)生器,獨(dú)立于CPU的時(shí)鐘發(fā)生器,如圖(2)所示,由DSP時(shí)鐘發(fā)生器輸出的時(shí)鐘送入到CPU和其他外設(shè)(不包括USB模塊),而USB模塊的時(shí)鐘由單獨(dú)的時(shí)鐘發(fā)生器為它提供。USB模塊的時(shí)鐘可選擇用模擬鎖相環(huán)(APLL)或數(shù)字鎖相環(huán)(DPLL)來(lái)產(chǎn)生[3]。模擬鎖相環(huán)與數(shù)字鎖相環(huán)相比有它獨(dú)特的優(yōu)勢(shì),TI推薦使用模擬鎖相環(huán)來(lái)產(chǎn)生USB模塊的時(shí)鐘。提供給USB模塊的時(shí)鐘必須設(shè)置為48MHz。
圖(2)時(shí)鐘發(fā)生器
2.4 USB接口硬件設(shè)計(jì)
如圖(3)所示,DP、DN和PU端口接到5509A的USB模塊端口引腳上,DSP的DP、DN端口以差分方式傳送數(shù)據(jù),PU端口通過(guò)1.5k的上拉電阻接到USB總線的D+端,DSP可以通過(guò)編程來(lái)控制PU端口,從而控制設(shè)備與USB總線的連接與斷開(kāi)。主機(jī)USB接口提供的電源經(jīng)電阻分壓后送入DSP,供DSP檢測(cè)是否與主機(jī)的USB接口連接上。
圖(3)USB接口硬件連接圖
3.USB設(shè)備固件程序設(shè)計(jì)與實(shí)現(xiàn)
USB驅(qū)動(dòng)程序主要包括兩個(gè)部分:設(shè)備固件程序和主機(jī)端的設(shè)備驅(qū)動(dòng)程序,設(shè)備固件程序是指運(yùn)行在設(shè)備端CPU中的程序,它主要完成USB協(xié)議的處理及設(shè)備與主機(jī)的數(shù)據(jù)交換, 設(shè)備固件程序設(shè)計(jì)是重點(diǎn)也是難點(diǎn),本文主要介紹設(shè)備固件程序的編寫(xiě)。
3.1 DSP 的CSL編程
在DSP系統(tǒng)軟件設(shè)計(jì)中,一般會(huì)大量涉及到對(duì)片上外設(shè)的操作,而這往往要消耗過(guò)多的時(shí)間和精力。TI為5000系列和6000系列的DSP提供了各自的片級(jí)支持庫(kù)CSL(chip support library),CSL庫(kù)函數(shù)主要用于配置和控制DSP片上外設(shè),使片上外設(shè)更容易使用,縮短開(kāi)發(fā)時(shí)間,增加可移植性。用CSL來(lái)配置和管理DSP的USB模塊可以使USB固件程序的開(kāi)發(fā)變得更加方便和快捷。CSL已集成到CCS中,我們可利用CCS提供的圖形用戶(hù)接口(GUI)來(lái)對(duì)USB模塊進(jìn)行相應(yīng)的初始化配置,或者直接調(diào)用CSL庫(kù)函數(shù)來(lái)配置。
3.2 USB設(shè)備枚舉過(guò)程
當(dāng)主機(jī)檢測(cè)到有設(shè)備連接到USB總線時(shí),主機(jī)要向USB設(shè)備發(fā)出一系列的設(shè)備請(qǐng)求,獲取USB設(shè)備的一些屬性,如設(shè)備支持的最大傳輸速率、設(shè)備接口特性、設(shè)備端點(diǎn)個(gè)數(shù)以及每個(gè)端點(diǎn)支持的傳輸方式等。接著主機(jī)為USB設(shè)備分配一個(gè)唯一的設(shè)備地址,然后USB設(shè)備才可以正常使用,這個(gè)過(guò)程叫做枚舉[4]。USB設(shè)備的枚舉過(guò)程分以下幾步:
1. USB設(shè)備加電,并連接上USB總線。
2. 主機(jī)檢測(cè)到USB設(shè)備,總線復(fù)位,集線器發(fā)送復(fù)位信號(hào)并維持至少10毫秒。
3. 復(fù)位完成,USB設(shè)備處于缺省狀態(tài),此時(shí)設(shè)備將以缺省地址0響應(yīng)主機(jī)請(qǐng)求
4. 主機(jī)發(fā)出請(qǐng)求,從缺省地址0讀取USB設(shè)備的設(shè)備描述符。
5. 主機(jī)為該USB設(shè)備分配一個(gè)新的設(shè)備地址。
6. 主機(jī)從新的設(shè)備地址再次讀取USB設(shè)備的設(shè)備描述符。
7. 主機(jī)讀取設(shè)備的配置,包括配置描述符、該配置的所有接口描述符、接口的所有端點(diǎn)描述符以及字符串描述符號(hào)。
8. 主機(jī)加載設(shè)備驅(qū)動(dòng)程序,USB枚舉過(guò)程結(jié)束,USB設(shè)備可以正常使用了。
3.3 USB設(shè)備固件程序設(shè)計(jì)
USB設(shè)備固件程序主要包括兩個(gè)部分:USB模塊的初始化和USB中斷服務(wù)程序,下面分別對(duì)這兩個(gè)部分的實(shí)現(xiàn)做個(gè)簡(jiǎn)單的介紹。
3.3.1 USB模塊的初始化
USB模塊初始化流程為:首先關(guān)閉中斷,然后設(shè)置API函數(shù)指針向量,設(shè)置USB模塊時(shí)鐘,初始化USB設(shè)備的端點(diǎn),調(diào)用函數(shù)USB_init( )初始化USB模塊,用函數(shù)IRQ_plug( )初始化中斷向量表,再打開(kāi)中斷,最后調(diào)用函數(shù)USB_connectDev( )使USB的D+端通過(guò)1.5k電阻上拉,從而使設(shè)備接入U(xiǎn)SB總線,隨后開(kāi)始USB設(shè)備的枚舉過(guò)程[5]。下面對(duì)USB模塊初始化過(guò)程中涉及到的部分CSL庫(kù)函數(shù)做個(gè)簡(jiǎn)單介紹:
USB模塊時(shí)鐘設(shè)置函數(shù)USB_initPLL( ),該函數(shù)有三個(gè)參數(shù),分別是USB模塊的輸入時(shí)鐘、USB模塊的輸出時(shí)鐘(必須設(shè)置為48MHz)、輸入時(shí)鐘的分頻數(shù)(該參數(shù)在USB模塊的寄存器中用2 bit 來(lái)設(shè)置,即分頻數(shù)只能設(shè)定為1,2,3或4,所以在硬件設(shè)計(jì)時(shí)需考慮好DSP的外部輸入時(shí)鐘頻率,使USB模塊的時(shí)鐘能夠設(shè)置為48MHz)。
端點(diǎn)初始化函數(shù)USB_initEndptObj( )有七個(gè)參數(shù),該函數(shù)用于對(duì)端點(diǎn)的端點(diǎn)號(hào)、端點(diǎn)的傳輸方式(控制傳輸,中斷傳輸,批量傳輸和同步傳輸)、端點(diǎn)能夠接收的包的最大值、引發(fā)該端點(diǎn)產(chǎn)生中斷的中斷事件、產(chǎn)生該端點(diǎn)中斷后去執(zhí)行的函數(shù)等屬性進(jìn)行相應(yīng)的設(shè)置。
初始化中斷向量表函數(shù)IRQ_plug( )有兩個(gè)參數(shù)[6],第一個(gè)參數(shù)為中斷事件ID(DSP中各種類(lèi)型的中斷在CSL的頭文件中都定義了不同的ID值),第二個(gè)參數(shù)為中斷函數(shù)地址(產(chǎn)生與事件ID對(duì)應(yīng)的中斷時(shí)轉(zhuǎn)而執(zhí)行的中斷函數(shù)的地址)。USB模塊初始化的部分代碼如下:
USB_EpObj usbEpObjOut0, usbEpObjIn0………; //創(chuàng)建USB端點(diǎn)
USB_EpHandle myUsbConfig[] = {usbEpObjOut0, usbEpObjIn0,……,NULL};
void USB_Init()
{ ……
CSL_init( ); //CSL 初始化
INT_DisableGlobal(); //關(guān)中斷
USB_setAPIVectorAddress(); //初始化USB模塊API函數(shù)向量指針
USB_initPLL(12,48,0); //設(shè)置USB模塊時(shí)鐘,必須設(shè)置為48MHz
event_mask = USB_EVENT_RESET | …...;//引發(fā)端點(diǎn)中斷的事件
/////端點(diǎn)初始化
USB_initEndptObj(USB0, usbEpObjOut0, USB_OUT_EP0, USB_CTRL,0x40, event_mask, USB_ctl);
USB_initEndptObj(USB0, usbEpObjIn0, USB_IN_EP0, USB_CTRL,0x40, event_mask, USB_ctl);
…… //其它端點(diǎn)初始化程序
USB_init(USB0, myUsbConfig, 0x40); //USB模塊初始化
IRQ_plug(usbId,USB_isr); //初始化中斷向量表
IRQ_globalEnable(); //開(kāi)中斷
USB_connectDev(USB0); //設(shè)備連接到USB總線上
……
}
3.3.2 USB中斷服務(wù)程序
當(dāng)產(chǎn)生USB中斷時(shí),程序會(huì)執(zhí)行相應(yīng)的USB中斷程序,在USB中斷程序中我們可以調(diào)用函數(shù)USB_evDispatch( )來(lái)處理中斷事務(wù),該函數(shù)會(huì)清除相應(yīng)的中斷標(biāo)志位,并且發(fā)布USB中斷事件,從而去執(zhí)行相應(yīng)的端點(diǎn)中斷函數(shù)。若是控制端點(diǎn)0中斷,則執(zhí)行控制端點(diǎn)0的中斷函數(shù),完成相應(yīng)的復(fù)位、掛起、SETUP(設(shè)備請(qǐng)求包)等操作。若是其他通用端點(diǎn)中斷則按照該端點(diǎn)初始化時(shí)定義的傳輸方式來(lái)完成數(shù)據(jù)傳輸。USB中斷函數(shù)及端點(diǎn)中斷函數(shù)的部分程序如下:
interrupt void USB_isr() //USB中斷
{ USB_evDispatch( ); }
//控制端點(diǎn)0中斷處理函數(shù)
void USB_ctl(USB_DevNum DevNum, USB_EpHandle hEp0In,USB_EpHandle hEp0Out)
{ ……
if(USB_ctl_events USB_EVENT_RESET) {…… } //復(fù)位處理
if(USB_ctl_events USB_EVENT_SUSPEND) {…… } //掛起處理
if((USB_ctl_events USB_EVENT_SETUP) == USB_EVENT_SETUP) //收到SETUP包
{
if(USB_getSetupPacket(DevNum,USB_Setup) == USB_TRUE)
{…… } //處理SETUP包,完成相應(yīng)的USB設(shè)備枚舉操作
}
……
}
…… //其它端點(diǎn)中斷函數(shù)
3.4 USB設(shè)備固件程序流程圖
如圖(4)所示,DSP及其USB模塊的初始化完成后進(jìn)入主循環(huán),等待USB中斷。若是控制端點(diǎn)中斷則進(jìn)入控制端點(diǎn)中斷服務(wù)程序,完成設(shè)備枚舉的相關(guān)操作;若是通用端點(diǎn)中斷,則按照通用端點(diǎn)定義的傳輸方式來(lái)完成數(shù)據(jù)的傳輸。然后中斷返回,進(jìn)入主循環(huán)。
4.結(jié)論
本文介紹的采用TMS320VC5509A自帶的USB接口來(lái)完成USB數(shù)據(jù)傳輸?shù)姆桨?,使系統(tǒng)硬件設(shè)計(jì)的復(fù)雜度和系統(tǒng)調(diào)試的難度都大大的降低,同時(shí)也提高了系統(tǒng)的集成度和穩(wěn)定性,減小了系統(tǒng)體積和功耗,適合于在便攜式產(chǎn)品中應(yīng)用。
圖(4)USB設(shè)備固件程序流程圖 |
參考文獻(xiàn):
[1] TMS320VC5509A Fixed-Point Digital Signal Processor Texas Instruments Incorporated June 2006
[2] 滕巖峰 周雪峰 帶USB接口的100MHZ高速數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息 2006.22.7-2
[3] Using the USB APLL on the TMS320VC5509A Texas Instruments Incorporated February 2004
[4] 陳啟美、丁傳鎖編著 計(jì)算機(jī)USB接口技術(shù) 南京大學(xué)出版社 2003
[5] TMS320C55x CSL USB Programmer’s Reference Guide Texas Instruments Incorporated October 2001
[6] TMS320C55x Chip Support Library API Reference Guide Texas Instruments Incorporated September 2004
評(píng)論