傳統的USB設備驅動(dòng)程序編寫(xiě)異常復雜,程序員往往很難入手。SILICON Laboratories公司提供的USBXpress開(kāi)發(fā)包大大簡(jiǎn)化了USB通信的應用和相關(guān)驅動(dòng)程序的開(kāi)發(fā),只要做好開(kāi)發(fā)前的準備工作,USBXpress開(kāi)發(fā)包完全可以實(shí)現USB通信的所有功能。本文介紹USB通信開(kāi)發(fā)的全過(guò)程,以及在開(kāi)發(fā)過(guò)程中需要注意的事項。(主要針對設備端USB通信進(jìn)行講解) 1 USBXpress簡(jiǎn)介 由SILICON Laboratories公司推出的USBXpress開(kāi)發(fā)包涵蓋了主機端和設備端的所有函數功能,支持C8051F32X、C8051F34X和CP210X設備的USB通信。USBXpress開(kāi)發(fā)包中包含主機端的設備驅動(dòng)、主機端設備驅動(dòng)安裝程序、主機端的動(dòng)態(tài)鏈接庫(DLL)和設備端的函數庫文件。 設備端的函數庫文件提供了支持C805IF32X和C8051F34X設備USB通信的API函數,這些函數可以在Keil uVision3編譯環(huán)境下被編譯通過(guò)。編譯前需要在工程中添加相關(guān)的文件,詳見(jiàn)下文。 設備端函數庫中主要的API函數如下: USB Clock Start() -初始化USB時(shí)鐘 USB Init()-USB接口初始化 Block Write() -向Buffer中寫(xiě)數據 Block Read() -從Buffer中讀數據 Get Interrupt Source()-獲取API函數的中斷標志值 USB Int Enable() -允許API函數中斷 USB Int Disable() -不允許API函數中斷 USB Disable() -不允許USB接口通信 USB Suspend() -延緩USB中斷 2 設備端的電路設計 (1)USB插座引腳識別 在沒(méi)備端電路設計的過(guò)程中,對USB插座引腳必須對應連接,否則將直接影響到與主機端的通信。USB插座一般分為A型插座和B型插座,如圖1所示,其引腳說(shuō)明如表1所列。 (2)基于C8051F340的USB通信電路 基于C8051F340的USB通信電路如圖2所示。 (3)USB通信電路說(shuō)明 ①電路中的D-和D+不應連接其他負載電路,因為任何負載將影響數據線(xiàn)路上的電流,從而影響數據傳輸,直接后果將導致主機端無(wú)法識別設備。 ②JTAG口線(xiàn)中的VDD引腳為+3 V輸入,輸入電壓過(guò)大將損壞器件。USB插口引腳與C8051F340引腳應對應連接,不要有誤。 ③C8051F340的VBUS、REGIN和VDD引腳的連接有多種方式(穩壓器配置),詳見(jiàn)表2。 3 設備端的驅動(dòng)程序設計 在Keil uVision3編譯環(huán)境下,用USBXpress 工具包中的API函數設計設備端的USB通信,前提是在工程中添加C8051F340.h、USB_API.h和USBX_F34X.LIB文件(USBXpress工具包提供相關(guān)文件)。 下面介紹設備端USB的數據傳輸。在進(jìn)行數據傳輸之前,必須對USB時(shí)鐘和USB接口初始化: (1)USB接口初始化參數定義 ①USB_VID,16位二進(jìn)制賣(mài)主ID號,一般用SILICONLab的ID號(OXl0C4)。 ②USB_PID,16位二進(jìn)制產(chǎn)品ID號,一般USBXpress規定為OXEA61。 ③USB_MfrStr,BYTE型指針,指向描述廠(chǎng)商的字符串,不能為空。 若定義BYTE USB MfrStr[]={ },數組中第1個(gè)數說(shuō)明數組中元素的個(gè)數(元素個(gè)數=字符串元素個(gè)數*2+2),第2個(gè)數說(shuō)明字符串描述符的類(lèi)型,0起間隔作用。以下的字符串定義同上。 ④USB_ProductStr,BYTE型指針,指向描述產(chǎn)品的字符串,不能為空。 ⑤USB_SerialStr,BYTE型指針,指向描述序列號的字符串,不能為空。 ⑥USB_MaxPower,BYTE型,說(shuō)明總線(xiàn)最大電流,極限為500 mA。若取值0x32,則表示最大電流為100 mA。 ⑦USB_PwAttributes,BYTE型,用于供電配置。如果設備自己供電第6位置“1”,若為總線(xiàn)供電則為“O”。如果設備提供弱上拉作用,第5位置“l(fā)”,位0~4必須為“O”,位7必須為“1”。 ⑧USB_bcdDevice,無(wú)符號int型,用BCD碼表示設備的版本號,如2.13版為Ox0213。 (2)USB中斷函數 設備端USB通信中API函數的功能,都在一個(gè)中斷模塊里面實(shí)現,為此必須提供一個(gè)中斷向量。其中,0x008B(Interrupt 17)是F34X設備的中斷向量。在main函數中,只有允許了USB中斷(調用USB Int Enable函數),才能進(jìn)入中斷。一旦進(jìn)入中斷服務(wù)程序,必須先獲得中斷標志(調用Get_Interrupt_Source函數,返回BYTE型中斷標志),后續操作根據獲得的中斷標志值與工具包自定義的中斷標志值判斷執行。自定義的中斷標志值主要有:USB_RESET(復位中斷)、TX_COMPLETE(發(fā)送完成中斷)、RX_COMPLETE(允許接收中斷)、DEVICEOPEN(設備實(shí)例在主機端打開(kāi))、DEVICE SUSPEND(延緩信號)等。 中斷函數如下: 在main函數中進(jìn)行初始化之后,若中斷允許,通過(guò)函數Block_write來(lái)發(fā)送數據,發(fā)送數據的字節數不能超過(guò)4096。發(fā)送結束后將觸發(fā)中斷,從而進(jìn)入中斷服務(wù)程序進(jìn)行判斷操作。如果主機端向設備端的Buffer寫(xiě)入數據完成,也將觸發(fā)中斷,判斷執行Block_Read操作將Buffer中的數據存入指定的存儲單元。 發(fā)送數據的函數原型為:Block_write(數據存儲單元首地址,發(fā)送的字節數)。 (3)主機端USB應用程序設計 在VC++6.O編譯環(huán)境下開(kāi)發(fā)主機端的USB通信應用程序,需要注意在編譯之前向工程中添加開(kāi)發(fā)包提供的SiUSBXp.dll、SiUSBXp.h和SiUSBXp.lib文件。 為了能讓主機端識別USB設備并與之通信,在運行應用程序之前,要安裝主機端的驅動(dòng)程序(開(kāi)發(fā)包已提供)。安裝了驅動(dòng)程序,主機端才能識別USB設備,在設備管理器中可以找到USB設備的相關(guān)描述信息。 對USB設備的描述信息,除了可以修改設備端發(fā)送過(guò)來(lái)的描述符之外,還可以修改在主機端驅動(dòng)安裝目錄下*.inf文件中的信息。 結語(yǔ) 本文詳細介紹了USB通信的開(kāi)發(fā)過(guò)程、電路設計和設備端的驅動(dòng)設計,簡(jiǎn)單說(shuō)明了USBXpress開(kāi)發(fā)包在主機端應用的條件設置。所有設計思路和方法都通過(guò)了實(shí)驗驗證,可以直接用于工程項目開(kāi)發(fā)。通過(guò)此方法,程序員可以很容易地進(jìn)行一系列USB通信應用的設計和編程。 |