摘 要: 在簡單介紹嵌入式title="USB">USB芯片SL811HS的基礎(chǔ)上,給出了DSP的嵌入式USB主機(jī)接口軟、硬件設(shè)計(jì)的思路和方法,用以實(shí)現(xiàn)DSP和USB設(shè)備間的數(shù)據(jù)傳輸。
關(guān)鍵詞: 嵌入式USB DSP USB固件 海量存儲器
近年來,通用串行總線(USB)發(fā)展非常迅速,它具有成本低、速度快、總線供電、可熱插拔等特點(diǎn),被認(rèn)為是目前PC和外設(shè)連接的最佳方案,因而得到了廣泛的應(yīng)用。USB技術(shù)規(guī)范將USB數(shù)據(jù)傳輸雙方劃分為2種類型:HOST和SLAVE,即主機(jī)和從屬設(shè)備。目前,USB主機(jī)一般都是由PC擔(dān)任,而市場上各式各樣的USB產(chǎn)品基本上都是SLAVE。USB技術(shù)在PC上應(yīng)用獲得成功的同時(shí),USB開發(fā)者還為USB尋找到了新的應(yīng)用空間——嵌入式系統(tǒng)領(lǐng)域,使嵌入式USB技術(shù)成為USB發(fā)展的新亮點(diǎn)。該技術(shù)可應(yīng)用在多種場合,例如:數(shù)碼相機(jī)可以將拍下的照片隨時(shí)轉(zhuǎn)移到移動存儲器上或者直接在打印機(jī)上輸出,手機(jī)和PDA等手持設(shè)備間可隨意交換音頻、視頻等及其他各類文件……其市場前景巨大。
本文介紹采用TMS320VC54x DSP和嵌入式USB主機(jī)芯片的連接,實(shí)現(xiàn)USB設(shè)備和DSP的數(shù)據(jù)傳輸。
1 SL811HS芯片
SL811HS是Cypress公司的一款低價(jià)位的嵌入式USB主/從二用芯片。SL811HS支持USB1.1規(guī)范,工作在主機(jī)模式下,可以和低速或全速設(shè)備進(jìn)行通信,可以很方便地和MCU、DSP等處理器或者和ISA、PCMCIA等總線建立連接。
SL811HS主機(jī)模式下的功能框圖如圖1所示。在片選信號nCS、讀閘門信號nRD、寫閘門信號nWR等控制信號、地址線A0和數(shù)據(jù)總線D0~D7的作用下,它可以映射到處理器的I/O空間或存儲器空間。SL811HS片內(nèi)有256字節(jié)的RAM,其中低16字節(jié)是控制寄存器和狀態(tài)寄存器,剩下的240字節(jié)用作數(shù)據(jù)緩存。地址線A0的使用比較特殊,訪問芯片時(shí),首先將A0置0,通過D0~D7寫入目標(biāo)RAM地址,然后在下一次讀寫周期中,將A0置1,這樣D0~D7上就變成訪問的數(shù)據(jù)。在每次讀寫操作后,RAM地址指針會自動指向下一個數(shù)據(jù)單元。
SL811HS片內(nèi)寄存器分為二部分,第一部分負(fù)責(zé)USB的傳輸,包括USB主機(jī)控制寄存器(USB Host Control Register)、USB主機(jī)基址寄存器(USB Host Base Address)、USB主機(jī)長度寄存器(USB Host Base Length)、USB主機(jī)令牌、端點(diǎn)寄存器(USB Host PID, Device Endpoint)、USB狀態(tài)寄存器(USB Status)、USB主機(jī)設(shè)備地址寄存器(USB Host Device Address)、USB傳輸計(jì)數(shù)器(USB Transfer Count);第二部分負(fù)責(zé)SL811HS的工作,包括控制寄存器1(Control Register 1)、中斷使能寄存器(Interrupt Enable Register)、中斷狀態(tài)寄存器(Interrupt Status Register)、SOF低位計(jì)數(shù)器(SOF Counter LOW)、硬件版本寄存器(HW Revision Register),SOF高位計(jì)數(shù)器(SOF Counter HIGH)、控制寄存器2(Control Register 2)。
處理器通過訪問上述寄存器來進(jìn)行數(shù)據(jù)傳輸控制和獲取傳輸狀態(tài)。另外,SL811HS提供了USB-A和USB-B二組USB主機(jī)控制寄存器,因此可以采用乒乓方式進(jìn)行USB傳輸。而數(shù)據(jù)的CRC校驗(yàn)則由芯片自動完成。
2 硬件設(shè)計(jì)
本設(shè)計(jì)中采用的DSP是TI公司的TMS320VC5402,它有64KB的I/O空間,映射SL811HS非常簡單。TMS320VC5402與SL811HS的硬件連接圖如圖2所示。
硬件設(shè)計(jì)很簡單,SL811HS的M/S接高電平,工作在主機(jī)模式下;DSP的IOSTRB#作為片選nCS輸入;讀寫信號的邏輯表達(dá)式分別為:nRD=IOSTRB#+(!R/W#),nWR= IOSTRB#+R/W#;二者的地址線A0和數(shù)據(jù)線D0~D7對應(yīng)連接;DSP的輸出XF提供硬件復(fù)位脈沖。此外,由于SL811HS的中斷請求INTR高電平有效,而DSP的中斷是下降沿觸發(fā),所以INTR要經(jīng)過非運(yùn)算后才能接到INT0#上。經(jīng)過如上的映射,DSP向奇地址I/O空間寫數(shù)據(jù)對選擇SL811HS的目標(biāo)RAM,訪問偶地址I/O空間時(shí)則傳輸相應(yīng)的數(shù)據(jù)。
3 軟件設(shè)計(jì)
3.1 SL811HS存儲器讀寫軟件
SL811HS片內(nèi)RAM的訪問可以用2個函數(shù)實(shí)現(xiàn):Wr811hsBuf(u16 address,u16*buffer、u16 length)和Rd811-hsBuf(u16 address,u16*buffer,u16 length),其中的參數(shù)分別為SL811HS的RAM地址、DSP數(shù)據(jù)單元指針和訪問字節(jié)數(shù),以下給出它們的源代碼。
void Wr811hsBuf(u16 address,u16*buffer,u16 length)
{ port0000=address;//選擇SL811HS要寫
//的第1個RAM單元
While(length--)//將DSP緩沖區(qū)的數(shù)據(jù)
//逐一寫入SL811HS
port0001=*buffer++;//每寫1次,SL811HS
//自動指向下一個RAM單元
}
void Rd811hsBuf(u16 address,u16*buffer,u16 length)
{ port0000=address;//選擇SL811HS要讀的
//第1個RAM單元
While(length--) //將SL811HS的數(shù)據(jù)
//逐一讀出放到DSP緩沖區(qū)
*buffer++=port0001;//每讀1次,SL811HS
//自動指向下一個RAM單元
}
3.2 USB主機(jī)的Firmware設(shè)計(jì)
USB的設(shè)計(jì)最困難的就是Firmware(固件)設(shè)計(jì),固件編程要遵循復(fù)雜的USB規(guī)范,所以比硬件設(shè)計(jì)工作量大得多。
主機(jī)端的固件編程可以基于WINCE、VxWorks、Linux等嵌入式操作系統(tǒng)。Cypress公司網(wǎng)站上有SL811HS在這些RTOS平臺上的驅(qū)動源碼。但如果系統(tǒng)資源較少,功能比較簡單,也可以不用RTOS,而直接自己編寫SL811HS的USB底層驅(qū)動。筆者就是采用了這一方法,故工作量并不大。
USB事務(wù)處理一般由3個階段組成:令牌階段、數(shù)據(jù)階段和握手階段。令牌階段定義了事務(wù)處理的類型,包括SETUP、IN和OUT;數(shù)據(jù)階段負(fù)責(zé)運(yùn)送和傳輸相關(guān)的數(shù)據(jù),Data0和Data1二種數(shù)據(jù)包交替使用,以支持雙方的傳輸同步;握手階段由收方向發(fā)方提供反饋,告知數(shù)據(jù)是否正確接收。
在嵌入式USB設(shè)計(jì)中,固件的核心部分是USB傳輸函數(shù)usbXfer。usbXfer管理著USB的事務(wù)處理,其入口參數(shù)有:設(shè)備地址UsbAddr、端點(diǎn)地址Endpoint、令牌包類型PID、端點(diǎn)最大負(fù)荷Payload、傳輸數(shù)據(jù)總長度Length、DSP數(shù)據(jù)緩存區(qū)指針*Buffer。USB傳輸函數(shù)程序流程圖如圖3所示。
USB主機(jī)檢測到設(shè)備連接好后要對其進(jìn)行配置,稱為設(shè)備的枚舉,該部分固件的核心是設(shè)備請求函數(shù)VendorCmd。VendorCmd構(gòu)建在usbXfer函數(shù)之上,通過調(diào)用usbXfer進(jìn)行若干次的控制傳輸來實(shí)現(xiàn)??刂苽鬏斢?個階段組成:建立階段、數(shù)據(jù)階段和狀態(tài)階段。建立階段,主機(jī)進(jìn)行SETUP事務(wù)處理,向目標(biāo)設(shè)備發(fā)送標(biāo)準(zhǔn)設(shè)備請求;數(shù)據(jù)階段,由若干個IN事務(wù)處理或OUT事務(wù)處理組成;狀態(tài)階段,主機(jī)則完成與數(shù)據(jù)階段相反的事務(wù)處理,結(jié)束本次控制傳輸。
設(shè)備的枚舉過程主要包括以下步驟:(1)主機(jī)請求設(shè)備控制端點(diǎn)0,以確定缺省管道支持的最大數(shù)據(jù)量。(2)主機(jī)給USB設(shè)備分配1個惟一的地址。(3)主機(jī)從描述符中讀取配置信息并加以執(zhí)行。(4)主機(jī)驗(yàn)證設(shè)備所需要的資源是否可以獲得。(5)主機(jī)給USB設(shè)備發(fā)送1個配置值,指出如何使用該設(shè)備。
枚舉成功后,主機(jī)和設(shè)備就可根據(jù)設(shè)備接口類型,采用相應(yīng)的接口協(xié)議進(jìn)行數(shù)據(jù)控制和傳輸。USB設(shè)備類型主要劃分為:音頻設(shè)備類、顯示設(shè)備類、人機(jī)接口類、海量存儲器類等。特定的設(shè)備類又劃分為若干個子類,它們又有可能采用不同的接口協(xié)議傳輸指令和數(shù)據(jù)。以U盤為例,類代碼08h(海量存儲器類),子類代碼06h(SCSI指令集子類),傳輸協(xié)議50h(Bulk-Only傳輸協(xié)議)。按照這些標(biāo)準(zhǔn),則U盤的操作過程可分為指令、數(shù)據(jù)和狀態(tài)3個階段,也就是主機(jī)首先向設(shè)備Bulk-Out端點(diǎn)寫包含SCSI的指令塊(CBW),然后從Bulk-In讀數(shù)據(jù)或向Bulk-Out端點(diǎn)寫數(shù)據(jù),最后從Bulk-In端點(diǎn)讀取傳輸狀態(tài)(CSW)。
4 結(jié)束語
DSP加上嵌入式USB主機(jī)接口后,一方面可以和設(shè)備之間傳輸數(shù)據(jù),另一方面又可對數(shù)據(jù)進(jìn)行壓縮和變換等算法處理。這對于音視頻信號等數(shù)據(jù)采集系統(tǒng),是一個很好的接口方案。故該系統(tǒng)非常適用于數(shù)據(jù)采集并進(jìn)行信號處理的場合。
參考文獻(xiàn)
1 Anderson D.USB系統(tǒng)體系.北京:中國電力出版社,2000
2 Universal Serial Bus Specification Revision 1.1.www.usb.
org,1998
3 Cypress Semiconductor Corporation.SL811HS Datasheet.2002