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