嵌入式USB主機(jī)_第1頁(yè)
嵌入式USB主機(jī)_第2頁(yè)
嵌入式USB主機(jī)_第3頁(yè)
嵌入式USB主機(jī)_第4頁(yè)
嵌入式USB主機(jī)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式系統(tǒng)TCP/IP網(wǎng)絡(luò)解決方案嵌入式USB主機(jī)陳智榮(研04)溫英林張輝勇摘要:本文以一個(gè)實(shí)際USB設(shè)備枚舉的數(shù)據(jù)過(guò)程,講述了USB協(xié)議中的一些關(guān)鍵概念和重要的數(shù)據(jù)結(jié)構(gòu)、時(shí)序;在此基礎(chǔ)上,簡(jiǎn)單介紹本系統(tǒng)的硬件設(shè)計(jì),然后圍繞如何實(shí)現(xiàn)USB設(shè)備枚舉,從底層到高層詳細(xì)地介紹了本系統(tǒng)的軟件設(shè)計(jì)。關(guān)鍵詞:USB主機(jī) SL811HS 51單片機(jī) 枚舉 嵌入式1前言USB(通用串行總線)是最近幾年逐步在PC領(lǐng)域廣為應(yīng)用的新型接口技術(shù)。USB接口通用性好、實(shí)時(shí)性強(qiáng)、傳輸方式多樣、成本低、易于擴(kuò)展且便于使用,這些優(yōu)點(diǎn)使它受到許多硬件廠商的青睞,其相關(guān)設(shè)備種類越來(lái)越多,數(shù)量越來(lái)越大。然而,USB的拓?fù)浣Y(jié)構(gòu)中居

2、于核心地位的是主機(jī),任何一次USB的數(shù)據(jù)傳輸都必須由主機(jī)來(lái)發(fā)起和控制,所有的USB外設(shè)都只能和主機(jī)建立連接,任何兩個(gè)外設(shè)之間無(wú)法直接通信。目前,大量扮演主機(jī)角色的是個(gè)人電腦PC機(jī)。目前使用的USB移動(dòng)設(shè)備,如U盤(pán),MP3隨身聽(tīng),USB接口的移動(dòng)硬盤(pán)、移動(dòng)光驅(qū)及數(shù)碼相機(jī)等等,都只能在PC機(jī)上使用,只能通過(guò)PC機(jī)來(lái)進(jìn)行數(shù)據(jù)傳輸和文件交換,這無(wú)疑給USB移動(dòng)設(shè)備的應(yīng)用帶來(lái)了局限性。因此,如果能拋開(kāi)PC機(jī),使用輕便、廉價(jià)的設(shè)備就能讀寫(xiě)操作USB外設(shè),這將拓寬USB接口的應(yīng)用范圍,使人們享受更多更方便的USB接口電子產(chǎn)品。本設(shè)計(jì)使用51系列單片機(jī)對(duì)USB主機(jī)接口芯片SL811HS進(jìn)行控制,實(shí)現(xiàn)了USB主

3、機(jī)的一項(xiàng)重要功能:枚舉USB設(shè)備。2關(guān)于USB協(xié)議在本設(shè)計(jì)中,由于采用了USB主機(jī)的接口芯片,所以不需要詳細(xì)了解USB傳輸?shù)牡讓游锢硖匦?,但必須深入理解USB的數(shù)據(jù)傳輸?shù)膮f(xié)議層,具體來(lái)說(shuō),就是USB傳輸中數(shù)據(jù)包,數(shù)據(jù)字段的格式和時(shí)序是如何的。2.1設(shè)備的枚舉主機(jī)對(duì)USB設(shè)備的枚舉指的是主機(jī)對(duì)設(shè)備的檢測(cè)和配置。 在說(shuō)明主機(jī)的枚舉功能前,需要說(shuō)明一下USB傳輸?shù)臄?shù)據(jù)基本結(jié)構(gòu)和格式。從表1可見(jiàn),在USB的數(shù)據(jù)傳輸中:主要有四種傳輸事務(wù)類型(控制、批量、中斷、同步),而主機(jī)枚舉設(shè)備的功能是只需要通過(guò)控制傳輸實(shí)現(xiàn)的。控制傳輸有三個(gè)傳輸階段(建立、數(shù)據(jù)、狀態(tài),其中數(shù)據(jù)階段是可選的)。每個(gè)傳輸階段又由三個(gè)包

4、組成(令牌包、數(shù)據(jù)包、握手包、特殊包)。表 1 USB傳輸?shù)臄?shù)據(jù)基本結(jié)構(gòu)和格式傳輸事務(wù)類型階段包控制建立令牌包數(shù)據(jù)包握手包數(shù)據(jù)令牌包數(shù)據(jù)包握手包狀態(tài)令牌包數(shù)據(jù)包握手包批量(不分階段)令牌包數(shù)據(jù)包握手包中斷(同上)同步(同上)其中,包是由域來(lái)組成的,共有7種域,每種域的子類型如下表所列:表 2 域和域的子類型域類型名域子類型名同步域SYNC標(biāo)識(shí)域(PID)SETUP、OUT、IN、SOF、DATA0、DATA1、ACK、NAK、STALL、PRE地址域ADDR端點(diǎn)域ENDP幀號(hào)域FRAM數(shù)據(jù)域DATA校驗(yàn)域CRC5、CRC16其中,同步域的實(shí)際二進(jìn)制編碼為”_0000 0001”;另外,每個(gè)包是

5、以SE0態(tài)作為結(jié)束標(biāo)志的。下面,就以一個(gè)實(shí)際設(shè)備枚舉的全過(guò)程為例,說(shuō)明USB數(shù)據(jù)傳輸?shù)囊恍┚唧w細(xì)節(jié)(在這里,將不列出每個(gè)包的同步域和結(jié)束標(biāo)志)。2.1.1主機(jī)檢測(cè)到有設(shè)備插上,總線復(fù)位當(dāng)設(shè)備與主機(jī)連接時(shí),主機(jī)就會(huì)檢測(cè)到一個(gè)連接條件(USB接口芯片向CPU發(fā)出中斷請(qǐng)求),主機(jī)就開(kāi)始進(jìn)行總線復(fù)位(主機(jī)強(qiáng)制輸出SE0,即強(qiáng)制把D和D兩信號(hào)線拉為低電平)。2.1.2主機(jī)第一次讀取設(shè)備描述符主機(jī)使用默認(rèn)地址(地址0)讀取設(shè)備描述符,如表3所示。表 3 主機(jī)第一次讀取設(shè)備描述符階段包序號(hào)(包類型)數(shù)據(jù)內(nèi)容建立包1(令牌包)主機(jī)向默認(rèn)地址(地址0)設(shè)備發(fā)送建立包SETUPADDRENDPCRC50xB40x

6、000x00x08包2(數(shù)據(jù)包)主機(jī)發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求獲取設(shè)備描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0001 0000 40000xBB29包3(握手包)設(shè)備應(yīng)答ACK0x4B數(shù)據(jù)包4(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x000x00x0B包5(數(shù)據(jù)包)設(shè)備返回設(shè)備描述符DATA1DATACRC160xD212 01 0001 DC 00 00 10 7104 6606 0001 00 000x42C6包6(握手包)主機(jī)應(yīng)答ACK0x4B狀態(tài)包7(令牌包)主機(jī)發(fā)送狀態(tài)響應(yīng)OUTADDRENDPCRC50x870x00

7、0x00x08包8(數(shù)據(jù)包)主機(jī)發(fā)送0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包9(握手包)設(shè)備應(yīng)答ACK0x4B其中,包#2中的DATA含義如下:bmRequestType=0x80:所請(qǐng)求數(shù)據(jù)將是從設(shè)備傳到主機(jī);標(biāo)準(zhǔn)請(qǐng)求命令;該命令接受者為設(shè)備bRequest=0x06:請(qǐng)求命令代碼是GET_DESCRIPTORwValue=0x0001:描述符索引值0x00;描述符編號(hào)0x01wIndex=0x0000:接收者為設(shè)備,所以此字段為0wLength=0x4000:要求設(shè)備返回的數(shù)據(jù)長(zhǎng)度2.1.3地址分配在地址分配事務(wù)中,主機(jī)分配給設(shè)備一個(gè)地址,如表4所示,分配的地

8、址為0x02,在以后的通信里,設(shè)備就只對(duì)0x02地址的信息作出應(yīng)答,而把0地址讓出來(lái)。從這個(gè)地址分配事務(wù)中也可見(jiàn),控制傳輸?shù)臄?shù)據(jù)狀態(tài)是可選的。表 4 地址分配階段包序號(hào)(包類型)數(shù)據(jù)內(nèi)容建立包10(令牌包)主機(jī)向默認(rèn)地址(地址0)設(shè)備發(fā)送建立包SETUPADDRENDPCRC50xB40x000x00x08包11(數(shù)據(jù)包)主機(jī)發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求設(shè)置設(shè)備的地址)DATA0DATACRC160xC300 05 02 00 00 00 00 000xD768包12(握手包)設(shè)備應(yīng)答ACK0x4B狀態(tài)包13(令牌包)主機(jī)要求讀取傳輸狀態(tài)INADDRENDPCRC50x960x000x00x08

9、包14(數(shù)據(jù)包)設(shè)備返回0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包15(握手包)主機(jī)應(yīng)答ACK0x4B2.1.4主機(jī)從新的地址獲取設(shè)備描述符(第二次讀取設(shè)備描述符)分配好地址后,主機(jī)就從新的地址獲取設(shè)備描述符,如表5所示。由于設(shè)備返回的第一個(gè)設(shè)備描述符中聲明了該設(shè)備的端點(diǎn)0最大包尺寸為16個(gè)字節(jié)(0x10),所以設(shè)備分2次把設(shè)備描述符經(jīng)過(guò)端點(diǎn)0發(fā)送出去,第一次發(fā)送16個(gè)字節(jié),第二次發(fā)送2個(gè)。最后主機(jī)發(fā)送0字節(jié)的數(shù)據(jù)包給設(shè)備作為傳輸裝態(tài)應(yīng)答。表 5 主機(jī)從新的地址獲取設(shè)備描述符(第二次讀取設(shè)備描述符)階段包序號(hào)(包類型)數(shù)據(jù)內(nèi)容建立包16(令牌包)主機(jī)向新的地址(地址

10、0x02)設(shè)備發(fā)送建立包SETUPADDRENDPCRC50xB40x020x00x15包17(數(shù)據(jù)包)主機(jī)發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求獲取設(shè)備描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0001 0000 12000x072F包18(握手包)設(shè)備應(yīng)答ACK0x4B數(shù)據(jù)包19(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x020x00x15包20(數(shù)據(jù)包)設(shè)備返回設(shè)備描述符(前16個(gè)字節(jié))DATA1DATACRC160xD212 01 0001 DC 00 00 10 7104 6606 0001 00 000x42C6包21(握手包)主機(jī)應(yīng)

11、答ACK0x4B數(shù)據(jù)包22(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x020x00x15包23(令牌包)設(shè)備返回設(shè)備描述符(后2個(gè)字節(jié))DATA0DATACRC160xC300190FCA1包24(令牌包)主機(jī)應(yīng)答ACK0x4B狀態(tài)包25(令牌包)主機(jī)發(fā)送狀態(tài)響應(yīng)OUTADDRENDPCRC50x870x020x00x15包26(數(shù)據(jù)包)主機(jī)發(fā)送0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包27(握手包)設(shè)備應(yīng)答ACK0x4B2.1.5主機(jī)讀取配置描述符主機(jī)讀取完設(shè)備描述符后就讀取設(shè)備的配置描述符,如表6所示:表 6 主機(jī)讀取配置描述符階段包序號(hào)(包類

12、型)數(shù)據(jù)內(nèi)容建立包1(令牌包)主機(jī)向默認(rèn)地址(地址0)設(shè)備發(fā)送建立包SETUPADDRENDPCRC50xB40x020x00x15包2(數(shù)據(jù)包)主機(jī)發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求獲取設(shè)備描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0002 0000 09000x7520包3(握手包)設(shè)備應(yīng)答ACK0x4B數(shù)據(jù)包4(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x020x00x15包5(數(shù)據(jù)包)設(shè)備返回設(shè)備描述符DATA1DATACRC160xD209 02 2E 00 01 01 00 60 010xA01E包6(握手包)主機(jī)應(yīng)答ACK0x4B

13、狀態(tài)包7(令牌包)主機(jī)發(fā)送狀態(tài)響應(yīng)OUTADDRENDPCRC50x870x020x00x15包8(數(shù)據(jù)包)主機(jī)發(fā)送0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包9(握手包)設(shè)備應(yīng)答ACK0x4B2.1.6主機(jī)讀取描述符集合主機(jī)除了讀取設(shè)備描述符和配置描述符外,還有讀取接口描述符和端點(diǎn)描述符。在這里主機(jī)使用再次讀取配置描述符的方法來(lái)實(shí)現(xiàn)。注意這里請(qǐng)求的字節(jié)數(shù)為0xff,如表7所示。表 7 主機(jī)讀取描述符集合(配置、接口、端點(diǎn)描述符)階段包序號(hào)(包類型)數(shù)據(jù)內(nèi)容建立包16(令牌包)主機(jī)向新的地址(地址0x02)設(shè)備發(fā)送建立包SETUPADDRENDPCRC50xB40x0

14、20x00x15包17(數(shù)據(jù)包)主機(jī)發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求獲取設(shè)備描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0002 0000 FF000x9725包18(握手包)設(shè)備應(yīng)答ACK0x4B數(shù)據(jù)包19(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x020x00x15包20(數(shù)據(jù)包)設(shè)備返回設(shè)備描述符(第一組16個(gè)字節(jié))DATA1DATACRC160xD209 02 2E 00 01 01 00 60 01 09 04 00 00 04 DC A00x5C5E包21(握手包)主機(jī)應(yīng)答ACK0x4B數(shù)據(jù)包22(令牌包)主機(jī)讀取數(shù)據(jù)INADDR

15、ENDPCRC50x960x020x00x15包23(令牌包)設(shè)備返回設(shè)備描述符(第二組16個(gè)字節(jié))DATA0DATACRC160xC3B0 00 07 05 81 03 04 00 0A 07 05 01 03 04 00 0A0A1BF包24(令牌包)主機(jī)應(yīng)答ACK0x4B數(shù)據(jù)包22(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x020x00x15包22(令牌包)設(shè)備返回設(shè)備描述符(剩余字節(jié))DATA0DATACRC160xD207 05 82 02 40 00 0A 07 05 02 02 40 00 0A0xC515包22(令牌包)主機(jī)應(yīng)答ACK0x4B狀態(tài)包25(令牌包

16、)主機(jī)發(fā)送狀態(tài)響應(yīng)OUTADDRENDPCRC50x870x020x00x15包26(數(shù)據(jù)包)主機(jī)發(fā)送0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包27(握手包)設(shè)備應(yīng)答ACK0x4B2.1.7主機(jī)設(shè)置配置主機(jī)讀取完描述符后,就需要對(duì)設(shè)備進(jìn)行配置,使得設(shè)備從地址狀態(tài)進(jìn)入配置狀態(tài),如下表8所示:表 8 主機(jī)設(shè)置配置階段包序號(hào)(包類型)數(shù)據(jù)內(nèi)容建立包10(令牌包)主機(jī)向0x02地址發(fā)送建立包SETUPADDRENDPCRC50xB40x020x00x15包11(數(shù)據(jù)包)主機(jī)發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求設(shè)置配置)DATA0DATACRC160xC300 09 01 00 00

17、00 00 000xE4A4包12(握手包)設(shè)備應(yīng)答ACK0x4B狀態(tài)包13(令牌包)主機(jī)要求讀取傳輸狀態(tài)INADDRENDPCRC50x960x020x00x15包14(數(shù)據(jù)包)設(shè)備返回0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包15(握手包)主機(jī)應(yīng)答ACK0x4B2.1.8主機(jī)讀取配置狀態(tài)主機(jī)設(shè)置完配置后,設(shè)備就可以使用。主機(jī)有時(shí)會(huì)對(duì)設(shè)備的配置狀態(tài)進(jìn)行讀取,其工作數(shù)據(jù)如表9所示。表 9 主機(jī)讀取配置狀態(tài)階段包序號(hào)(包類型)數(shù)據(jù)內(nèi)容建立包16(令牌包)主機(jī)向地址0x02設(shè)備發(fā)送建立包SETUPADDRENDPCRC50xB40x020x00x15包17(數(shù)據(jù)包)主機(jī)

18、發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求獲取設(shè)備配置)DATA0DATACRC160xC380 08 00 00 00 00 01 000xFC23包18(握手包)設(shè)備應(yīng)答ACK0x4B數(shù)據(jù)包19(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x020x00x15包20(數(shù)據(jù)包)設(shè)備返回設(shè)備配置(設(shè)備配置值)DATA1DATACRC160xD2010x81FE包21(握手包)主機(jī)應(yīng)答ACK0x4B狀態(tài)包25(令牌包)主機(jī)發(fā)送狀態(tài)響應(yīng)OUTADDRENDPCRC50x870x020x00x15包26(數(shù)據(jù)包)主機(jī)發(fā)送0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包27(握手包

19、)設(shè)備應(yīng)答ACK0x4B2.1.9主機(jī)讀取接口狀態(tài)在配置完成后,主機(jī)會(huì)對(duì)接口的狀態(tài)進(jìn)行讀取,這和讀取配置一樣也是可選的,其數(shù)據(jù)傳輸如表10所示。表 10 主機(jī)讀取接口狀態(tài)階段包序號(hào)(包類型)數(shù)據(jù)內(nèi)容建立包16(令牌包)主機(jī)向地址0x02設(shè)備發(fā)送建立包SETUPADDRENDPCRC50xB40x020x00x15包17(數(shù)據(jù)包)主機(jī)發(fā)出建立階段的數(shù)據(jù)包(請(qǐng)求獲取接口狀態(tài))DATA0DATACRC160xC381 0A 00 00 00 00 01 000xBB13包18(握手包)設(shè)備應(yīng)答ACK0x4B數(shù)據(jù)包19(令牌包)主機(jī)讀取數(shù)據(jù)INADDRENDPCRC50x960x020x00x15包2

20、0(數(shù)據(jù)包)設(shè)備返回接口狀態(tài)(接口描述符編號(hào))DATA1DATACRC160xD2000x02FD包21(握手包)主機(jī)應(yīng)答ACK0x4B狀態(tài)包25(令牌包)主機(jī)發(fā)送狀態(tài)響應(yīng)OUTADDRENDPCRC50x870x020x00x15包26(數(shù)據(jù)包)主機(jī)發(fā)送0字節(jié)數(shù)據(jù)作狀態(tài)響應(yīng)DATA1DATACRC160xD20x0000包27(握手包)設(shè)備應(yīng)答ACK0x4B3關(guān)于SL811HS接口芯片SL811HS是Cypress公司的嵌入式主機(jī)或外設(shè)接口控制器,支持USB1.1的全速和低速設(shè)備,提供USB主機(jī)的硬件接口及總線管理的物理機(jī)制,帶有在片的SIE、USB發(fā)送器、256字節(jié)RAM以及在片的根集線器

21、。除了8位的數(shù)據(jù)/地址總線外,有讀、寫(xiě)、片選、復(fù)位及中斷輸出信號(hào)端口,控制方便。4嵌入式USB主機(jī)設(shè)計(jì)4.1硬件設(shè)計(jì)選用廉價(jià)的51系列單片機(jī)(89C52)控制USB主機(jī)接口芯片SL811HS,同時(shí),通過(guò)MAX232芯片與PC機(jī)通信。硬件接線示意圖如下所示:圖 1 硬件接線示意圖4.2軟件設(shè)計(jì)下面將從底層到高層詳細(xì)地介紹本系統(tǒng)的軟件設(shè)計(jì)。4.2.1單片機(jī)讀寫(xiě)SL811HS4.2.1.1讀取SL811HS內(nèi)存的數(shù)據(jù)根據(jù)SL811HS的讀寫(xiě)時(shí)序要求,讀取數(shù)據(jù)前首先發(fā)送地址:void SetHostAddress(char AddressP)P_BUS=AddressP;/*數(shù)據(jù)總線發(fā)送地址,但此時(shí)地

22、址還不會(huì)被SL811HS接收*/P_CTRL=0x90;/*設(shè)置總線控制信號(hào)為SL811HS接收地址信號(hào),具體含義如下所示:*/*P_CTRL;0x90,98,F0P_CTRL.0; -P_CTRL.1; -P_CTRL.2; -A0; 010nRST; 111nCS; 001nWR; 001nRD; 111*/nWR=1;nCS=1;/*地址傳輸完畢后,關(guān)閉片選、寫(xiě)等信號(hào)*/P_CTRL=0xF0;地址發(fā)送完畢之后,SL811HS就接到了需要讀取的內(nèi)存單元地址(包括寄存器的地址)。緊接著單片機(jī)就可以讀取數(shù)據(jù):unsigned char HostRead(void)A0=1;/* 滿足SL81

23、1HS的時(shí)序要求,先保證A0和nCS的有效*/NCS=0;P_CTRL=0x58;/*設(shè)置控制位信號(hào),讀取SL811HS內(nèi)的數(shù)據(jù)*/*P_CTRL;0x90,58,F0P_CTRL.0; -P_CTRL.1; -P_CTRL.2; -A0; 010nRST; 111nCS; 001nWR; 011nRD; 101*/return P_BUS;/*函數(shù)返回讀取的SL811HS內(nèi)存的數(shù)據(jù)*/4.2.1.2寫(xiě)入數(shù)據(jù)到SL811HS內(nèi)存與讀數(shù)據(jù)類似,單片機(jī)要往SL811HS的內(nèi)存單元寫(xiě)數(shù)據(jù)時(shí),也要首先發(fā)送地址,然后再發(fā)送要寫(xiě)入的數(shù)據(jù)。為了簡(jiǎn)便起見(jiàn),寫(xiě)數(shù)據(jù)過(guò)程中發(fā)送地址和數(shù)據(jù)的功能都放在一個(gè)函數(shù)中執(zhí)行。

24、Void HostWrite(char HostWriteAddress, char WriteConstent)/*參數(shù)HostWriteAddress輸入要寫(xiě)入數(shù)據(jù)的SL811HS內(nèi)存的地址,WriteConstent為要寫(xiě)入的地址*/P_BUS=HostWriteAddress;/*準(zhǔn)備好需要發(fā)送的地址*/P_CTRL=0x90;/*P_CTRL;0x90,98,F0P_CTRL.0; -P_CTRL.1; -P_CTRL.2; -A0; 010nRST; 111nCS; 001nWR; 001nRD; 111*/nWR=1;nCS=1;P_BUS=WriteContent;/*準(zhǔn)備好需

25、要發(fā)送的數(shù)據(jù)*/P_CTRL=0x98;/*重新安排好控制信號(hào),發(fā)送數(shù)據(jù)*/P_CTRL=0xF4;4.2.1.3讀寫(xiě)批量數(shù)據(jù)有時(shí)單片機(jī)和SL811HS之間要進(jìn)行批量數(shù)據(jù)的傳輸,為方便操作,設(shè)計(jì)了能夠批量進(jìn)行數(shù)據(jù)讀或?qū)懙暮瘮?shù):/*批量寫(xiě)*/void HostBulkWrite(char addr, unsigned char *s, char c)/*參數(shù)addr為SL811HS中寫(xiě)入數(shù)據(jù)的起始地址,*s為單片機(jī)內(nèi)存放的需要寫(xiě)入的數(shù)據(jù)緩沖區(qū),c為總共要寫(xiě)入的字節(jié)數(shù)*/if(c<=0) return;while(c-)HostWrite(addr+,*s+);/*批量讀*/void Hos

26、tBulkRead(char addr, unsigned char *s, char c)/*參數(shù)addr為SL811HS中讀取數(shù)據(jù)的起始地址,*s為單片機(jī)內(nèi)存放讀取來(lái)的數(shù)據(jù)的數(shù)據(jù)緩沖區(qū),c為總共要讀入的字節(jié)數(shù)*/if(c<=0) return;while(c-)SetHostAddress(addr+);*s+=HostRead();4.2.2階段USB傳輸?shù)膶?shí)現(xiàn)4.2.2.1 SL811HS的初始化初始化主要是對(duì)SL811HS的部分內(nèi)部寄存器進(jìn)行設(shè)置:Void SL811HS_Init(void)HostWrite(IntEna,0x20);HostWrite(CSOFcnt, 0

27、xAE);HostWrite(CtrlReg, 0x08);HostWrite(CtrlReg, 0x00);HostWrite(CSOFcnt, 0xAE);HostWrite(CtrlReg, 0x08);DelayMs(10);HostWrite(CtrlReg, 0x00);DelayMs(1);HostWrite(IntStatus, 0xFF);4.2.2.2三種階段USB傳輸?shù)膶?shí)現(xiàn)三種階段USB傳輸都可以由這個(gè)函數(shù)(下稱“階段傳輸實(shí)現(xiàn)函數(shù)”)實(shí)現(xiàn):void USB_Transaction(unsigned char PID, unsigned char EP_Address, u

28、nsigned char Address, int Length, char *pDataBuf);4.2.2.2.1發(fā)送或接收前的準(zhǔn)備工作4.2.2.2.1.1設(shè)置EP0Status寄存器本設(shè)計(jì)涉及到了多種階段的USB傳輸,但這里需要考慮的只有3種,分別是建立(SETUP)、數(shù)據(jù)輸入(IN)和數(shù)據(jù)輸出(OUT)階段。階段傳輸實(shí)現(xiàn)函數(shù)的輸入?yún)?shù)中,PID就是用來(lái)區(qū)別這3種傳輸階段。#define PID_SETUP 0x2D#define PID_IN 0x69#define PID_OUT 0xE1階段傳輸實(shí)現(xiàn)函數(shù)的第二個(gè)需要輸入的參數(shù)就是端點(diǎn)號(hào)EP_Address,大小為1字節(jié)(實(shí)際只有低

29、4位有效,高4位為0),類型為unsigned char 。U盤(pán)等類似的USB Mass Storage類設(shè)備一般具有3個(gè)端點(diǎn):一個(gè)是端點(diǎn)0,用于處理控制傳輸;另一個(gè)是批量輸出Bulk_OUT端點(diǎn),該端點(diǎn)用于接收主機(jī)發(fā)來(lái)的批量數(shù)據(jù),端點(diǎn)號(hào)有設(shè)備定義;還有一個(gè)就是批量輸入Bulk_IN端點(diǎn),用于給÷向主機(jī)發(fā)送批量數(shù)據(jù),其端點(diǎn)號(hào)也由設(shè)備定義。從硬件角度來(lái)講,程序需要把PID和EP_Address組合在一起后寫(xiě)入EP0Status寄存器。unsigned char PID_EPA;/*用于儲(chǔ)存PIN和EP_Address的組合值*/PID_EPA=PID&0x0F;/*PID的高4

30、位位校驗(yàn)碼,低4位為有效值*/PID_EPA=(PID_EPA<<4)+EP_Address;/*按照EP0Status寄存器的要求合并PID和EP_Address*/HostWrite(EP0Status,PID_EPA);4.2.2.2.2設(shè)置EP0Counter寄存器階段傳輸實(shí)現(xiàn)函數(shù)的第三個(gè)需要輸入的參數(shù)是設(shè)備的地址Address,大小為1字節(jié),類型為unsigned char。HostWrite(EP0Counter,Address);/*設(shè)備地址的D7位值為0,D6D0位代表地址*/4.2.2.2.3設(shè)置EP0XferLen寄存器第四個(gè)參數(shù)是發(fā)送或接收的數(shù)據(jù)的長(zhǎng)度Leng

31、th,大小為2字節(jié),類型為int。這個(gè)長(zhǎng)度還需要和相應(yīng)端點(diǎn)的最大包尺寸MaxPacketSize進(jìn)行比較。如果Length小于MaxPacketSize,就說(shuō)明需要發(fā)送或接收的數(shù)據(jù)長(zhǎng)度比相應(yīng)端點(diǎn)的最大包尺寸還小,因此,主機(jī)和該端點(diǎn)之間只要進(jìn)行一次數(shù)據(jù)傳輸就可以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送或接收。反之,如果Length大于MaxPacketSize,那么就需要將發(fā)送或接收的數(shù)據(jù)進(jìn)行分割,第一批發(fā)送或接收的數(shù)據(jù)長(zhǎng)度就是MaxPacketSize,剩下的數(shù)據(jù)就利用 SL811HS的“乒乓”機(jī)制進(jìn)行發(fā)送。最后需要把實(shí)際要發(fā)送的數(shù)據(jù)長(zhǎng)度寫(xiě)入SL811HS的EP0XferLen寄存器中。/*定義變量CurentLeng

32、th,用于保存當(dāng)前需要發(fā)送的數(shù)據(jù)長(zhǎng)度*/if(Length>MaxPacketSize)CurrentLength=MaxPacketSize;elseCurrentLength=Length;HostWrith(EP0XferLen,(unsigned char)CurrentLength);/*注意這里的變量類型轉(zhuǎn)換*/4.2.2.2.4設(shè)置EP0Address寄存器最后一個(gè)需要確定是發(fā)送或接收數(shù)據(jù)的緩沖地址*pDataBuf,大小為1字節(jié)。在這里pDataBuf是指向單片機(jī)內(nèi)存單元的指針,但實(shí)際讀寫(xiě)數(shù)據(jù)是要以SL811HS的數(shù)據(jù)緩沖區(qū)作為中介的。為加快數(shù)據(jù)傳輸,把SL811HS的數(shù)

33、據(jù)緩沖區(qū)分成兩部分:SL811HS_Buf0和SL811HS_Buf1。SL811HS_Buf0的起始地址就可以定為0x10。而SL811HS_Buf1的地址就根據(jù)端點(diǎn)最大包尺寸進(jìn)行調(diào)整。Unsigned char SL811_HS_Buf0 0x10, SL811HS_Buf1;If(Length>MaxPackeSize)SL811HS_Buf1= SL811HS_Buf0+MaxPacketSize;HostWrite(EP0Address, SL811HS_Buf0);/*當(dāng)前數(shù)據(jù)發(fā)送從SL811HS_Buf 0開(kāi)始*/如果主機(jī)要發(fā)送數(shù)據(jù)給設(shè)備,就需要把*pDataBuf中的數(shù)據(jù)

34、復(fù)制到SL811HS的數(shù)據(jù)緩沖區(qū)中:HostBulkWrite(SL811HS_Buf0,pDataBuf,CurrentLength);如果是主機(jī)接收數(shù)據(jù),那么在以下的處理中,就會(huì)把SL811HS緩沖區(qū)中的接收到的設(shè)備的數(shù)據(jù)通過(guò)HostBulkRead()函數(shù)復(fù)制到單片機(jī)的緩沖區(qū)中。HostBulkRead(SL811HS_Buf0,pDataBuf,CurrentLength);4.2.2.2.5啟動(dòng)發(fā)送或接收啟動(dòng)USB數(shù)據(jù)的發(fā)送或接收實(shí)際上是通過(guò)向SL811HS的EP0Control寄存器發(fā)送命令字CmdWord來(lái)實(shí)現(xiàn)的。首先,PID等參數(shù)的不同,CmdWord的值也不同,根據(jù)EP0Co

35、ntrol寄存器每一位的屬性,有如下配置程序:unsigned char CmdWord;if(PID=PID_SETUP)CmdWord=0x03;/*控制傳輸?shù)腟ETUP事務(wù)*/elseif(EP_Address=0)if(PID=PID_IN)CmdWord=0x47;/*控制傳輸?shù)妮斎隝N事務(wù)*/elseCmdWord=0x43;/*控制傳輸?shù)腛UT事務(wù)*/elseif(PID=PID_IN)CmdWord=0x07;/*批量傳輸IN事務(wù)*/elseCmdWord=0x03;/*批量傳輸OUT事務(wù)*/將CmdWord命令字發(fā)送到SL811HS的EP0Control寄存器后,就啟動(dòng)了數(shù)據(jù)

36、包的發(fā)送或接收了:HostWrite(IntStatus, 0xFF);/*清除中斷狀態(tài)位*/HostWrite(EP0Control, CmdWord);剩下的工作就是查詢SL811HS的IntStatus寄存器,以查看發(fā)送或接收的完成情況,有需要時(shí),最后還可以查看EP0status獲取握手包的有關(guān)信息,但其實(shí)所有的握手包信息都是有硬件自動(dòng)完成的。4.2.3事務(wù)USB傳輸?shù)膶?shí)現(xiàn)4.2.3.1控制傳輸包含了三個(gè)階段:建立階段、可選數(shù)據(jù)階段以及狀態(tài)階段。Void Control_Transfer(pRequestCMD RequestCMD, unsigned char* pDataBuf_x)

37、;4.2.3.1.1建立階段的實(shí)現(xiàn)任務(wù)就是發(fā)送建立的8字節(jié)請(qǐng)求命令,命令的數(shù)據(jù)結(jié)構(gòu)為(注意該段定義是放在Control_Transfer()函數(shù)之外的):typedef structunsigned char bmRequest Type;unsigned char bRequest;unsigned int wValue;unsigned int wIndex;unsigned int wLength;REQUESTCMD,*pRequestCMD;在這里只需調(diào)用一次USB_Transaction()函數(shù)即可:USB_Transaction(PID_SETUP, 0 , Device_Add

38、ress, 0x08, (char *)RequestCMD);/*發(fā)送的令牌為PID_SETUP,端點(diǎn)號(hào)為0,設(shè)備地址為Device_Address,發(fā)送數(shù)據(jù)長(zhǎng)度為8字節(jié),發(fā)送內(nèi)容為相應(yīng)的請(qǐng)求命令*/4.2.3.1.2可選數(shù)據(jù)階段的實(shí)現(xiàn)注意數(shù)據(jù)傳輸方向,實(shí)現(xiàn)過(guò)程如下:if(RequestCMD->wLength)if(RequestCMD->bmRequestType & 0x80)/*判斷為PID_OUT*/USB_Transaction(PID_OUT, 0, Device_Address, RequestCMD->wLength, pDataBuf_x);el

39、se/*判斷為PID_IN*/USB_Transaction(PID_IN, 0, Device_Address, RequestCMD->wLength, pDataBuf_x);4.2.3.1.3狀態(tài)信息階段的實(shí)現(xiàn)在需要時(shí)(如可選數(shù)據(jù)階段為IN),主機(jī)發(fā)送控制傳輸?shù)臓顟B(tài)信息:USB_Transaction(PID_OUT, 0, Device_Address, 0, pDataBuf_x);4.2.3.2批量傳輸類似與控制傳輸中的可選數(shù)據(jù)階段,有兩個(gè)函數(shù),分別對(duì)應(yīng)于批量傳輸IN和批量傳輸OUT:void Bulk_Transfer_IN(int Length_bi, unsigned char* pDataBuf_bi)USB_Transaction(PID_IN,EP_Bulk_IN,Device_Address, Length_bi, pDataBuf_bi);void Bulk_Transfer_OUT(int Length_bo, unsigned char* pDataBuf_bo)USB_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論