LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(八)USB
這3種芯片的功能非常多,到此基本上我們已經(jīng)介紹完成,只有AD、WDT等沒有介紹,鑒于其難度不大這方面的內(nèi)容就不再說明。下面將進(jìn)行終極篇的學(xué)習(xí)----USB學(xué)習(xí),由于USB難度非常大,這一貼可能會(huì)編寫很長時(shí)間,這里將主要學(xué)習(xí)HID的應(yīng)用。
LPC1114沒有USB功能,所以這里只能針對LPC1343和LPC11U14進(jìn)行說明。對于這兩種有USB功能的芯片其還是區(qū)別,LPC1343內(nèi)部集成了USB驅(qū)動(dòng),而LPC11U14沒有此功能,所以LPC1343USB開發(fā)比較簡單一點(diǎn),價(jià)格也要貴一點(diǎn)。為了編寫出通用的USB驅(qū)動(dòng)代碼,這里將先對LPC11U14 USB進(jìn)行學(xué)習(xí),之后在移植到LPC1343。
鑒于USB開發(fā)難度,這里將不會(huì)從零開始開發(fā)USB驅(qū)動(dòng),我們將對NXP設(shè)計(jì)的USB驅(qū)動(dòng)進(jìn)行學(xué)習(xí),并改進(jìn)成一個(gè)自定義的HID,應(yīng)用在自己的項(xiàng)目中。
USB HID(NXP原廠代碼).rar
對于USB的硬件設(shè)計(jì)非常簡單,具體設(shè)計(jì)如下圖所示:
1. 除了連接好USB的兩路差分信號線外,還必須連接好電源,對于P0_3是非常重要,不管是否使用USB電源供電,此管腳必須接高電平,否則無法設(shè)別USB設(shè)備。而且,如果要應(yīng)用USB ISP功能,此管腳也必須接高電平。
2. P0_6管腳為軟件連接端口,可以通過此管腳連接或斷開USB設(shè)備。
3. 全速和高速設(shè)備的上拉電阻接在D+端,而低速設(shè)備是接在D-端的。
4. USB設(shè)備取電:在設(shè)備沒有配置之前最多只能從Vbus上獲取100mA電流,電流的大小是由設(shè)備配置的,配置后最多可獲取500mA電流。
USB基礎(chǔ)知識(shí):
1. 在USB1.0和USB1.1中只支持1.5M/s的低速模式和12M/s的全速模式,在USB2.0中又加入了480M/b的高速模式,而在USB3.0中速度到達(dá)5GB/s。
2. USB集成器只能擴(kuò)展USB接口,而能擴(kuò)展帶寬,一個(gè)主控制器的帶寬是固定的。
3. 在USB1.1中集成器最多4層,USB2.0中最多6層。
4. 低速和全速模式下采用電壓差分傳輸信號,在高速模式下,采用電流傳輸。
5. USB采用NRZI編碼方式,0數(shù)據(jù)電平翻轉(zhuǎn),1數(shù)據(jù)電平不翻轉(zhuǎn)。
USB的描述符應(yīng)該是USB開發(fā)主重要的部分,如果能夠正確的配置好描述符,USB開發(fā)就完成了一半了。
描述符:
對于HID設(shè)備的描述除了5個(gè)USB的標(biāo)準(zhǔn)描述:設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符、字符串描述符。
HID設(shè)備還有3個(gè)特點(diǎn)描述符:HID描述符、報(bào)告描述符、實(shí)體描述符。
在5個(gè)標(biāo)準(zhǔn)描述符中與HID設(shè)備有關(guān)的部分有:
1. 設(shè)備描述符中bDeviceClass、bDeviceSubClass、bDeviceProtocol三個(gè)字段的值必須為零。
2. 接口描述符中bInterfaceClass的值必須為0x03,bInterfaceSubClass的值為1時(shí)表示Boot Device,即表示HID是一個(gè)啟動(dòng)設(shè)備。
面的描述符之間有一定的關(guān)系,一個(gè)設(shè)備只有一個(gè)設(shè)備描述符,而一個(gè)設(shè)備描述符可以包含多個(gè)配置描述符,而一個(gè)配置描述符可以包含多個(gè)接口描述符,一個(gè)接口使用了幾個(gè)端點(diǎn),就有幾個(gè)端點(diǎn)描述符。這間描述符是用一定的字段構(gòu)成的,分別如下說明:
報(bào)表描述符
報(bào)表描述符定義了執(zhí)行設(shè)備功能的數(shù)據(jù)格式和使用方法。
報(bào)表描述符和USB的其他描述符是不一樣的,它不是一個(gè)簡單的表格,報(bào)表描述符是USB所有描述符中最復(fù)雜的。報(bào)表描述符非常復(fù)雜而有彈性,因?yàn)樗枰幚砀鞣N用途的設(shè)備。報(bào)表的數(shù)據(jù)必須以簡潔的格式來儲(chǔ)存,這樣才不會(huì)浪費(fèi)設(shè)備內(nèi)的儲(chǔ)存空間以及數(shù)據(jù)傳輸時(shí)的總線時(shí)間。
實(shí)際上可以這樣理解,報(bào)表內(nèi)容的簡潔,是通過報(bào)表描述符全面的、復(fù)雜的數(shù)據(jù)描述實(shí)現(xiàn)的。
報(bào)表描述符必須先描述數(shù)據(jù)的大小與內(nèi)容。報(bào)表描述符的內(nèi)容與大小因設(shè)備的不同而不同,在進(jìn)行報(bào)表傳輸之前,主機(jī)必須先請求設(shè)備的報(bào)表描述符,只有得到了報(bào)表描述符才可正確解析報(bào)表的數(shù)據(jù)。
報(bào)表描述符是報(bào)表描述項(xiàng)目(Item)的集合,每一個(gè)描述項(xiàng)目都有相對統(tǒng)一的數(shù)據(jù)結(jié)構(gòu),項(xiàng)目很多,通過編碼實(shí)現(xiàn)。
在HID的8種描述符中,最為重要而且復(fù)雜的應(yīng)該是報(bào)表描述符,其定義了數(shù)據(jù)的存儲(chǔ)格式和實(shí)際意義。如果能夠正確的理解報(bào)表描述符,那么對數(shù)據(jù)的處理就能達(dá)到應(yīng)用自如了,所以在設(shè)計(jì)描述符的時(shí)候,一定好多話費(fèi)時(shí)間來理解和編寫這一部分的內(nèi)容。特別要主要以下幾點(diǎn):
1. 輸入輸出等項(xiàng)使用的數(shù)據(jù)必須是整數(shù)字節(jié),如果沒有完全使用到,也必須通過說明來補(bǔ)齊。
2.主要報(bào)表的三種項(xiàng)的應(yīng)用及使用范圍。
命令請求:
HID設(shè)備類特定的命令有6個(gè):Get_Report、Get_Idle、Get_Protocol、Set_Report、Set_Idle、Set_Protocol。
通過近段時(shí)間來對NXP的HID例程的學(xué)習(xí),對其有了個(gè)大致的了解,USB一個(gè)包含以下幾個(gè)文件:
1. hid.h文件對HID協(xié)議中使用到的各種描述符、字段等進(jìn)行了全面的描述和定義,在需要更改其他應(yīng)用時(shí),只需要選擇相應(yīng)的宏就可以,非常清晰明確。
2.hiduser.c/hiduser.h文件對HID中需要使用到的6中設(shè)備命令請求函數(shù)進(jìn)行了編寫描述。
3.usb.h文件對USB標(biāo)準(zhǔn)中需要使用的報(bào)告和描述符進(jìn)行全面的定義。
4.usbcfg.h文件對USB中應(yīng)用到的電源、端點(diǎn)、接口、緩沖等進(jìn)行配置說明,完全可以根據(jù)自己的需要來配置USB。
5.usbcore.c/usbcore.h文件是USB協(xié)議內(nèi)核文件,是各種USB開發(fā)必備文件,完成了USB的核心內(nèi)容,也是USB開發(fā)的難點(diǎn)和重點(diǎn)。
6.usbdesc.c/usbdesc.h文件為USB各種描述符的實(shí)現(xiàn)代碼,開發(fā)不同的HID設(shè)備時(shí),需要在此文件中更改相應(yīng)描述。
7.usbhw.c/usbhw.h文件實(shí)現(xiàn)與USB相關(guān)的硬件配置等。
8.usbuser.c/usbuser.h文件實(shí)現(xiàn)各種事件和端點(diǎn)的實(shí)現(xiàn)代碼,根據(jù)自己的應(yīng)用更改端點(diǎn)代碼實(shí)現(xiàn)USB通信。
在HID開發(fā)中,報(bào)告描述符是最關(guān)鍵而且最復(fù)雜的描述符,因?yàn)樗鼪]有專門的格式,隨意性比較大,但是HID的數(shù)據(jù)解析完全是依靠此描述符。
下面是NXP例程中的HID的報(bào)告描述符:
程序代碼都注釋了,這里不再詳細(xì)說明,需要注意中間三段代碼:
1. 第一段中定義了一個(gè)Input,數(shù)據(jù)為1位,一共有3個(gè)這樣是數(shù)據(jù);
2. 第二段中定義了一個(gè)Input,數(shù)據(jù)為1位,一共有5個(gè)這樣是數(shù)據(jù),不過需要注意,這里定義的是常量。就是說這里的5個(gè)位并沒用實(shí)際意義,完全是為了補(bǔ)齊一個(gè)字節(jié)的。這一點(diǎn)要注意,在報(bào)告描述符中,必須使用整數(shù)字節(jié)。
3. 第三段中定義了一個(gè)Output,數(shù)據(jù)為1位,一共有8個(gè)這樣的數(shù)據(jù),也就是說,由8個(gè)位組成的一字節(jié)輸出數(shù)。
到此我們不難看出此HID使用的是1字節(jié)是輸入和1字節(jié)是輸出,只是在1字節(jié)輸入數(shù)據(jù)中,這里只使用了3為。對于其他的描述符這里就不再說明,可以直接對照上面的描述符格式就可以看懂,需要注意HID必須設(shè)置的幾個(gè)字段就行了。
其他描述符:
在這些描述符中我們可以看出設(shè)備的具體功能,以及通信使用的端點(diǎn),緩存等
通過上述對描述符的了解,基本的HID信息我們已經(jīng)了解,下面就可以編寫程序,通過把獲取的數(shù)據(jù)進(jìn)行驗(yàn)證了,這里我們是通過按鍵按下給PC發(fā)送數(shù)據(jù),通過PC發(fā)送數(shù)據(jù)在設(shè)備上通過LED顯示的。
到此就可以把代碼下載到開發(fā)板上,并通過實(shí)驗(yàn)進(jìn)行驗(yàn)證了。下面我們采取兩種方法:
1.使用周工例程中的HID Client上位機(jī)軟件,進(jìn)行驗(yàn)證。
把開發(fā)板下載代碼后插入PC,通過Device選擇我們的“LPC11Uxx USB HID”設(shè)備,下面我們可以看出,設(shè)備在沒有鍵按下時(shí)讀取為0x01,當(dāng)按下鍵時(shí),讀取為0x00。在Outputs中勾選相應(yīng)的復(fù)選框,我們可以看到開發(fā)板上相應(yīng)的LED就別點(diǎn)亮了。
這種方法只是驗(yàn)證本實(shí)驗(yàn)是可以的,但是要開發(fā)其他USB功能設(shè)備就不行了,下面我們介紹一種通用的方法。
2. 使用Bus Hound軟件驗(yàn)證,這個(gè)軟件,剛開始很多人都不會(huì)用,這里將詳細(xì)點(diǎn)。
打開軟件,在設(shè)備項(xiàng)選擇我們的USB設(shè)備,如下圖
需要注意的是在發(fā)送數(shù)據(jù)時(shí),需要選擇USB人體學(xué)輸入設(shè)備,而不是下面的HID-compliant device。如果是雙擊HID-compliant device彈出的窗口中并沒有端點(diǎn),是不能通信的,應(yīng)該雙擊USB人體學(xué)輸入設(shè)備,彈出如下界面:
通過上圖,我們可以看出,端點(diǎn)和我們定義的是一樣的
下面我們就可以選擇端點(diǎn)進(jìn)行數(shù)據(jù)通信了,選擇需要端點(diǎn),填寫發(fā)送數(shù)據(jù)長度,在下面輸入要發(fā)送的數(shù)據(jù),選擇“Run”,就可以把數(shù)據(jù)發(fā)送出去了。 之后把軟件切換到Capture,可以捕獲輸入輸出數(shù)據(jù),如下圖。
通過上面的驗(yàn)證,我們可以得知,實(shí)驗(yàn)結(jié)果和我們想要的是一樣的,以后對于多字節(jié)的收發(fā),我們就可以通過Bus Hound軟件進(jìn)行驗(yàn)證了。
自定義多字節(jié)發(fā)送的實(shí)現(xiàn):
下面我們只需要修改幾個(gè)部分就能實(shí)現(xiàn)了。
1. 修改報(bào)告描述符:
2. 修改端點(diǎn)描述符:
3. 修改輸入輸出變量:
4. 修改其他與InReport和OutReport相關(guān)的地方。
5. 編寫代碼實(shí)現(xiàn)接收后原樣返回。
6. 試驗(yàn)一下:
相關(guān)閱讀
- LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(一)整體對比
- LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(二)GPIO
- LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(三)SysTick
- LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(四)定時(shí)器
- LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(五)UART
- LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(六)I2C
- LPC1114/LPC11U14和LPC1343對比學(xué)習(xí)(七)SSP
聲明:本站部分內(nèi)容根據(jù)互聯(lián)網(wǎng)資料整理而成,若侵犯您的權(quán)益,請聯(lián)系我們,我們會(huì)盡快處理。