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