• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            franksunny的個(gè)人技術(shù)空間
            獲得人生中的成功需要的專注與堅(jiān)持不懈多過(guò)天才與機(jī)會(huì)。 ——C.W. Wendte

             

            USB設(shè)備枚舉全紀(jì)錄

             

            在編寫這部分程序之前首先需要了解有關(guān)USB協(xié)議,重點(diǎn)是USB數(shù)據(jù)通信結(jié)構(gòu)11條標(biāo)準(zhǔn)請(qǐng)求命令和標(biāo)準(zhǔn)USB描述符

            因?yàn)榍度胧皆O(shè)備的軟硬件是密切相關(guān)的所以還需做的準(zhǔn)備工作是了解選用的USB芯片及主控MCU的性能

             

            .硬件篇

            USB芯片

            作用:

            1.      管理和實(shí)現(xiàn)USB物理層的差模信號(hào)

            2.      以寄存器的形式提供各種端點(diǎn)(如控制端點(diǎn),中斷端點(diǎn),大批量傳輸端點(diǎn),同步傳輸端點(diǎn))

            3.      提供狀態(tài)寄存器,配置寄存器,存儲(chǔ)寄存器,中斷寄存器,控制寄存器

            4.      電源管理(提供3.3V的電源)

            5.      實(shí)現(xiàn)某些協(xié)議層功能(CRC校驗(yàn)/產(chǎn)生,PID校驗(yàn)/產(chǎn)生,同步模式的識(shí)別,并行串行轉(zhuǎn)換等)

            固件就是以這些硬件資源作為基礎(chǔ)來(lái)實(shí)現(xiàn)USB設(shè)備功能的,其中,端點(diǎn)是需要重點(diǎn)學(xué)習(xí)的對(duì)象,需要熟練掌握與之相關(guān)的狀態(tài)寄存器,配置寄存器,存儲(chǔ)寄存器,中斷寄存器

            MCU主控芯片

            作用:

            1.      實(shí)現(xiàn)USB設(shè)備的功能

            2.      處理USB芯片產(chǎn)生的中斷,解析SETUP,處理標(biāo)準(zhǔn)請(qǐng)求和廠商請(qǐng)求

             

            .軟件篇

            USB設(shè)備端固件程序,枚舉部分是全部程序的基礎(chǔ)和重心,只有主機(jī)對(duì)設(shè)備枚舉成功后,主機(jī)才能和設(shè)備進(jìn)行正常的通信

            USB的枚舉過(guò)程分為4個(gè)狀態(tài).

                   1.接入態(tài)

            v主機(jī)檢測(cè)到USB設(shè)備插上,擊活端口,并發(fā)送復(fù)位命令(保持10ms)

                   2.默認(rèn)態(tài)

            v主機(jī)使用默認(rèn)地址讀取設(shè)備描述符        (GET_DESCRIPTOR)

            v主機(jī)分配給設(shè)備一個(gè)總在線的唯一地址    (SET_ADDRESS)

                   3.地址態(tài)

            v主機(jī)從新的地址獲取設(shè)備描述符(GET_DESCRIPTOR)

            v主機(jī)獲取所有設(shè)備的配置描述符(GET_DESCRIPTOR)

                  4.配置態(tài)

            v主機(jī)設(shè)置描述符(設(shè)備,配置) (SET_CONFIGURATION)

                     v主機(jī)讀取配置狀態(tài)(可選) (GET_CONFIGURATION)

            v主機(jī)讀取接口狀態(tài)(可選) (GET_INTERFACE)

             

            .實(shí)踐篇

            在枚舉階段的固件編寫中,我主要參考PHILIPS公司提供的D12 USB芯片代碼(有參考比自己從零開始要容易很多).由于該代碼是基于51單片機(jī)編寫的,與我所用的16位單片機(jī)在性能和結(jié)構(gòu)上有較大差異,因此在固件移植過(guò)程中,所遇到的問(wèn)題大多來(lái)源于此.

             

            下面是我在移植過(guò)程中碰到的四個(gè)主要問(wèn)題。

             

            第一個(gè)問(wèn)題,出現(xiàn)在默認(rèn)態(tài)階段,主機(jī)用默認(rèn)地址讀取設(shè)備描述符。當(dāng)MCU收到USB芯片產(chǎn)生的中斷時(shí),無(wú)法正確讀出USB芯片中斷寄存器中的值。

            這個(gè)問(wèn)題發(fā)生在整個(gè)枚舉過(guò)程的一開始,準(zhǔn)確的說(shuō)是第一步,所以我開始懷疑MCUUSB芯片的通信是否真正建立;而在此前,我對(duì)它們之間的通信能力一直深信不疑;因?yàn)槲以?jīng)用MCU發(fā)出測(cè)試專用指令來(lái)讀取USB芯片的ID值,并且正確地讀到了USB芯片的ID值,從理論上講MCUUSB的通信已經(jīng)建立.解決這個(gè)問(wèn)題大約用了半天時(shí)間,后來(lái)我在MCU讀中斷寄存器命令后加了一段延時(shí)程序,問(wèn)題得到解決,即中斷產(chǎn)生后MCU正確讀出了USB芯片中斷寄存器的值

            我分析原因是MCU發(fā)送命令的速度太快,當(dāng)發(fā)送了讀USB中斷寄存器值命令后,就迅速發(fā)送取數(shù)據(jù)命令,而USB芯片的速度要慢的多,在MCU讀數(shù)據(jù)時(shí)還未來(lái)得及把數(shù)據(jù)準(zhǔn)備好。之前我讀取USB芯片ID值的測(cè)試指令是循環(huán)發(fā)出的,剛開始雖然數(shù)據(jù)沒(méi)準(zhǔn)備好,但隨著指令的循環(huán)發(fā)出,后面指令自然可以把前面指令準(zhǔn)備的數(shù)據(jù)發(fā)出。

             

            第二個(gè)問(wèn)題出現(xiàn)在默認(rèn)態(tài)階段,主機(jī)用默認(rèn)地址讀取設(shè)備描述符。MCU收到USB芯片產(chǎn)生的中斷,卻無(wú)法進(jìn)入到正確的中斷服務(wù)程序。

            在第一個(gè)問(wèn)題解決后,立刻又出現(xiàn)了這一問(wèn)題。通過(guò)串口監(jiān)控,我很快發(fā)現(xiàn),解析中斷信息的程序中,有一段程序的功能是互換一個(gè)BYTE數(shù)據(jù)的高低字節(jié)位,這一功能主要是針對(duì)51單片機(jī)數(shù)據(jù)存放的結(jié)構(gòu)與USB接口芯片的數(shù)據(jù)結(jié)構(gòu)高低位顛倒而設(shè)置的。通過(guò)實(shí)驗(yàn)我發(fā)現(xiàn):這款16位單片機(jī)也不具有51單片機(jī)的這一特點(diǎn),所以只要去掉這段高低字節(jié)互換的程序,問(wèn)題就解決了。

             

            第三個(gè)問(wèn)題,出現(xiàn)在地址態(tài)階段,主機(jī)獲取設(shè)備描述符。USB設(shè)備響應(yīng)主機(jī)要求,發(fā)送16字節(jié)的設(shè)備描述符給主機(jī),主機(jī)不能收到。

            因?yàn)?/span>16字節(jié)的數(shù)據(jù)是通過(guò)MCU發(fā)送到USB芯片,再由USB芯片發(fā)送到

            主機(jī)的。所以需要判斷數(shù)據(jù)是在哪一個(gè)環(huán)節(jié)沒(méi)有被正確傳輸?shù)摹N依么诒O(jiān)測(cè)到: MCU收到主機(jī)的讀中斷(讀取設(shè)備描述符命令)后,會(huì)送出了16字節(jié)的設(shè)備描述符到USB芯片;但是用BUS HOUND(一種基于主機(jī)端的USB總線監(jiān)視軟件)監(jiān)視主機(jī)端發(fā)現(xiàn):主機(jī)并沒(méi)有收到這16字節(jié)的數(shù)據(jù)。因此我判斷問(wèn)題出在數(shù)據(jù)從MCUUSB芯片這一環(huán)節(jié)——即由MCU發(fā)出的設(shè)備描述符沒(méi)有被USB芯片接收到。通過(guò)實(shí)驗(yàn),我發(fā)現(xiàn)USB芯片沒(méi)有接收到MCU發(fā)來(lái)的數(shù)據(jù)是因?yàn)?/span>USB芯片的速度較慢,對(duì)它來(lái)說(shuō),每一筆由MCU發(fā)出的數(shù)據(jù)在數(shù)據(jù)線上保持的時(shí)間太短,以致USB芯片無(wú)法將數(shù)據(jù)存放到其寄存器中。當(dāng)改變MCU的相關(guān)設(shè)置,延長(zhǎng)數(shù)據(jù)在數(shù)據(jù)線上保持的時(shí)間后,問(wèn)題得以解決。

               

                第四個(gè)問(wèn)題,出現(xiàn)在配置態(tài)階段,主機(jī)設(shè)置描述符。通過(guò)BUS HOUND監(jiān)視,主機(jī)在SET_CONFIGURATION后停止枚舉。

                這個(gè)問(wèn)題是我碰到的最難解決的困難,難就難在一直找不出主機(jī)停止枚舉的原因,不知道問(wèn)題產(chǎn)生在哪個(gè)環(huán)節(jié)。通過(guò)BUS HOUND可以清楚地看到:主機(jī)發(fā)出了正確的SET_CONFIGURATION命令,接下來(lái)USB設(shè)備只需回送一個(gè)空包(數(shù)據(jù)為0)通知主機(jī)已收到該命令;可是主機(jī)的枚舉過(guò)程進(jìn)行到這里卻戛然而止。為什么?難道是設(shè)備沒(méi)有發(fā)出應(yīng)答空包,或者是主機(jī)沒(méi)有收到應(yīng)答空包,還是設(shè)備回送的空包有錯(cuò)誤?我大約用了5天時(shí)間來(lái)找支持這些假設(shè)的理由。不過(guò),除了證明假設(shè)不成立外,一無(wú)所獲。

            第六天,在一次檢查BUS HOUND的數(shù)據(jù)時(shí)終于有了新發(fā)現(xiàn)。我發(fā)現(xiàn):在SET_CONFIGURATION命令之前,主機(jī)發(fā)出了GET_DESCRIPTOR來(lái)獲取全部的描述符合集共46字節(jié)數(shù)據(jù),設(shè)備回復(fù)的描述符中在第20多字節(jié)時(shí)多了一個(gè)0字節(jié);不過(guò)我并不清楚是否是這個(gè)問(wèn)題對(duì)下一步產(chǎn)生了影響,在我看來(lái)只要主機(jī)在枚舉過(guò)程中發(fā)出了下一步枚舉命令,那就表明在此之前的枚舉都是正確的(后來(lái)的事實(shí)證明情況并非如此),后一步的枚舉不成功應(yīng)該與前一步無(wú)關(guān)。但是因?yàn)槲以僖舱也坏饺魏慰梢芍帲灾缓萌ふ夷且粋€(gè)字節(jié)的0是從哪里來(lái)的?又經(jīng)過(guò)了一天的摸索,終于找到了問(wèn)題的癥結(jié)。我的描述符數(shù)據(jù)是以結(jié)構(gòu)體的形勢(shì)存放的,當(dāng)MCU收到主機(jī)發(fā)出的獲取描述復(fù)命令時(shí),就通過(guò)指針的指示將結(jié)構(gòu)體中的數(shù)據(jù)發(fā)出。這些數(shù)據(jù)大多數(shù)是CHAR型,少數(shù)幾個(gè)是INT(癥結(jié)),對(duì)16位單片機(jī)來(lái)說(shuō)INT型數(shù)據(jù)存放是從偶地址開始的,因此,一旦在INT型的數(shù)據(jù)前有奇數(shù)個(gè)CHAR型數(shù)據(jù),那就天下大亂了,INT型數(shù)據(jù)會(huì)空出一個(gè)奇數(shù)的地址位,從其后的偶數(shù)地址位開始存放數(shù)據(jù)。這樣中間就多出1位的0字節(jié)數(shù)據(jù)。因此當(dāng)主機(jī)那邊收到時(shí)這筆數(shù)據(jù)時(shí),從這一位起其后的數(shù)據(jù)就全部錯(cuò)位了。當(dāng)我把INT型數(shù)據(jù)改用2個(gè)CHAR型表述時(shí),一切就正常了; 同時(shí),在此之后的SET_CONFIGURATION也能順利進(jìn)行下去,直到枚舉結(jié)束。

            看來(lái)枚舉的 GET_DESCRIPTOR階段如果主機(jī)得不到正確得描述符信息,并不會(huì)影響該階段的枚舉,而是對(duì)SET_CONFIGURATION階段產(chǎn)生影響,使枚舉無(wú)法繼續(xù)。我想這應(yīng)該是由主機(jī)端驅(qū)動(dòng)程序來(lái)決定的。

            非常幸運(yùn),利用BUS HOUND觀察到的有限數(shù)據(jù)中,在最后的幾字就出現(xiàn)了異常,否則,這個(gè)問(wèn)題不知道要困擾我多久(BUS HOUND可以顯示主機(jī)端接收到設(shè)備發(fā)來(lái)的數(shù)據(jù),但數(shù)據(jù)的長(zhǎng)度僅為32個(gè)字節(jié))

             

             

            寫在最后

            對(duì)設(shè)備端固件開發(fā)而言,如果有專用的USB總線分析儀是最好不過(guò)了,不但能監(jiān)視到主機(jī)端收發(fā)的數(shù)據(jù),而且可以監(jiān)視到設(shè)備端收發(fā)的數(shù)據(jù),這樣,開發(fā)的效率會(huì)大大提高,開發(fā)時(shí)間可以大大降低。但如果開發(fā)條件像我一樣有限,至少應(yīng)該保證有串口和BUS HOUND這種USB總線監(jiān)視工具(從網(wǎng)上可以下載),其中,串口可以在枚舉的開始階段使用,監(jiān)控MCU的相關(guān)數(shù)據(jù);BUS HOUND則可以在枚舉的后期發(fā)揮更大的作用,因?yàn)榇藭r(shí)傳輸?shù)臄?shù)據(jù)量較大,串口已不太適合作為監(jiān)視工具了。

            此外,在USB設(shè)備的枚舉程序編寫中,我遇到的最大挑戰(zhàn)來(lái)自于8位單片機(jī)與16位單片機(jī)的結(jié)構(gòu)上的差別,比如數(shù)據(jù)存取速度,數(shù)據(jù)高低字節(jié)的存放次序,數(shù)據(jù)類型與存放地址相關(guān)的特點(diǎn)等。從我前面列出的問(wèn)題來(lái)看,大部分問(wèn)題均源自于此;因此在學(xué)習(xí)某種單片機(jī)時(shí),就要準(zhǔn)確地掌握不同類型的MCU特性,這樣就一定可以降低開發(fā)難度,縮短開發(fā)時(shí)間。

             

            posted on 2007-08-04 21:33 frank.sunny 閱讀(5378) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 硬件開發(fā)

            FeedBack:
            # re: [轉(zhuǎn)]USB設(shè)備枚舉
            2008-09-22 17:52 | yongjieguo
            真是好文章!!  回復(fù)  更多評(píng)論
              
            # re: [轉(zhuǎn)]USB設(shè)備枚舉
            2008-10-30 17:00 | someguy
            Bushound顯示的數(shù)據(jù)長(zhǎng)度是可以自己定義的,在setting里面改max phase的數(shù)值就行了  回復(fù)  更多評(píng)論
              

            常用鏈接

            留言簿(13)

            隨筆分類

            個(gè)人其它博客

            基礎(chǔ)知識(shí)鏈接

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久亚洲AV波多野结衣 | 亚洲伊人久久大香线蕉综合图片| 国产精品视频久久久| 影音先锋女人AV鲁色资源网久久| 久久久久国产精品嫩草影院 | 久久久久久狠狠丁香| 91精品国产9l久久久久| 欧美丰满熟妇BBB久久久| 久久久无码精品亚洲日韩蜜臀浪潮| 久久国产成人| 18岁日韩内射颜射午夜久久成人| 日本道色综合久久影院| 亚洲综合精品香蕉久久网97| 久久精品九九亚洲精品天堂| 久久精品男人影院| 国产99久久久久久免费看| 91精品日韩人妻无码久久不卡| 天天综合久久久网| 久久精品国产亚洲Aⅴ蜜臀色欲 | 久久精品亚洲男人的天堂| 欧美伊人久久大香线蕉综合69| 久久精品国产第一区二区| 无码任你躁久久久久久| 久久国产欧美日韩精品| 久久精品国产亚洲av影院| 国产精品一久久香蕉国产线看| avtt天堂网久久精品| 秋霞久久国产精品电影院| 久久久久亚洲爆乳少妇无| 大香伊人久久精品一区二区| 亚洲va中文字幕无码久久| 久久99精品国产一区二区三区| 久久久久久国产精品美女| 亚洲精品无码久久久久sm| 久久se精品一区精品二区| 久久久久久无码国产精品中文字幕 | 午夜人妻久久久久久久久| 欧美久久综合性欧美| 亚洲国产成人久久精品99| 久久久老熟女一区二区三区| 国产精品gz久久久|