<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32的USB枚舉過(guò)程學(xué)習(xí)筆記(一)

          基于STM32的USB枚舉過(guò)程學(xué)習(xí)筆記(一)

          作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
          之前使用ST官方的庫(kù)以及網(wǎng)絡(luò)的資料,完成了使用USB HID類(lèi)進(jìn)行STM32和PC機(jī)的通訊。由于其他原因并沒(méi)有深入的分析,雖然實(shí)現(xiàn)了功能,但是關(guān)于USB設(shè)備的枚舉,以及具體的通訊方式都沒(méi)有清晰的概念,所以現(xiàn)在回頭重新學(xué)習(xí)USB相關(guān)知識(shí)。主要參考資料是《圈圈教你玩USB》、USB枚舉過(guò)程圖解,ST官方的USB HID例程。
          一,USB數(shù)據(jù)包
          1.USB數(shù)據(jù)包分類(lèi)

          USB總線(xiàn)上的數(shù)據(jù)傳輸以包為基本的單位。USB協(xié)議規(guī)定了四種包:令牌包、數(shù)據(jù)包、握手包、特殊包。不同的包通過(guò)包中的8位PID域區(qū)分。

          本文引用地址:http://www.ex-cimer.com/article/201611/318465.htm
          • 令牌包

          令牌包用于啟動(dòng)一次USB傳輸,USB的數(shù)據(jù)傳輸必須由主機(jī)發(fā)起。令牌包有四種:

          輸出令牌包(OUT):用來(lái)通知設(shè)備將要輸出一個(gè)數(shù)據(jù)包。 數(shù)據(jù)方向 主機(jī)-->設(shè)備

          輸入令牌包(IN):用來(lái)通知設(shè)備將要返回一個(gè)數(shù)據(jù)包。數(shù)據(jù)方向 設(shè)備-->主機(jī)

          建立令牌包(SETUP):通知設(shè)備將要輸出一個(gè)數(shù)據(jù)包,類(lèi)似OUT包。不過(guò)SETUP包只能往端點(diǎn)0發(fā)包,只用在控制傳輸中。

          幀起始包(SOF):用于幀計(jì)數(shù),USB全速設(shè)備每毫秒產(chǎn)生一幀,USB高速設(shè)備每125μS產(chǎn)生一幀。

          OUT , IN, SETUP包的結(jié)構(gòu):同步域+8位PID+7位地址+4位端點(diǎn)號(hào)+5位CRC校驗(yàn)+包結(jié)束符EOP

          • 數(shù)據(jù)包

          數(shù)據(jù)包用來(lái)傳輸數(shù)據(jù),分成DATA0. DATA1 。數(shù)據(jù)格式如下

          同步域+8位PID+N個(gè)字節(jié)的數(shù)據(jù)+CRC16校驗(yàn)+包結(jié)束符EOP

          • 握手包

          握手包用來(lái)表示一個(gè)傳輸是否被對(duì)方確認(rèn),有ACK,NAK,STALL,NYET。

          ACK:表示正確的接收數(shù)據(jù)并且有足夠的空間容納數(shù)據(jù)。主機(jī)和設(shè)備都可以使用ACK來(lái)確認(rèn),NAK,STALL,NYET只能夠用于設(shè)備返回,主機(jī)不能使用。

          NAK:表示沒(méi)有數(shù)據(jù)需要返回,或者數(shù)據(jù)正確接收但是沒(méi)有空間容納。當(dāng)主機(jī)收到NAK后,知道設(shè)備還未準(zhǔn)備好,主機(jī)會(huì)在合適的時(shí)候重新進(jìn)行數(shù)據(jù)傳輸。

          STALL:表示設(shè)備無(wú)法執(zhí)行該請(qǐng)求,或者端點(diǎn)已經(jīng)被掛起。

          NYET:USB高速設(shè)備中用。

          握手包的格式:同步域+8位PID+包結(jié)束符EOP

          2. 數(shù)據(jù)包的處理

          在傳輸過(guò)程中,具體的處理細(xì)節(jié)由USB接口的芯片處理完成。

          當(dāng)USB接口芯片正確接收到數(shù)據(jù)時(shí),如果有空間保存,則它將數(shù)據(jù)保存并返回ACK,同時(shí),設(shè)置一個(gè)標(biāo)志表示已經(jīng)正確接收到數(shù)據(jù);如果沒(méi)有空間保存數(shù)據(jù),則自動(dòng)返回NAK。

          收到輸入請(qǐng)求時(shí),如果有數(shù)據(jù)需要發(fā)送,則發(fā)送數(shù)據(jù),并等待接收ACK。只有到數(shù)據(jù)成功發(fā)送出去(即接收到ACK標(biāo)志后),它才設(shè)置標(biāo)志,表示數(shù)據(jù)已成功發(fā)送;如果無(wú)數(shù)據(jù)需要發(fā)送,則它自動(dòng)返回NAK。

          通常只需根據(jù)芯片提供的一些標(biāo)志,準(zhǔn)備要發(fā)送的數(shù)據(jù)到端點(diǎn),或者從端點(diǎn)讀取接收到的數(shù)據(jù)即可。

          二 ,USB事務(wù)

          雖然USB定義了數(shù)據(jù)在總線(xiàn)上傳輸?shù)幕締挝皇前?,為了傳輸?shù)據(jù),必須按照一定的關(guān)系把這些不同的包組織成事務(wù)才能傳輸數(shù)據(jù)。事務(wù)通常由兩個(gè)或者三個(gè)包組成:令牌包、數(shù)據(jù)包和握手包。

          令牌包用來(lái)啟動(dòng)一個(gè)事務(wù),總是由主機(jī)發(fā)送;數(shù)據(jù)包用來(lái)傳送數(shù)據(jù),可以從主機(jī)到設(shè)備,也可以由設(shè)備到主機(jī),方向由令牌包來(lái)指定;握手包用來(lái)指定數(shù)據(jù)傳輸結(jié)果。

          三,USB傳輸類(lèi)型

          USB規(guī)定了4種傳輸類(lèi)型:批量傳輸、等時(shí)傳輸、中斷傳輸、控制傳輸。其中前三個(gè)傳輸一次數(shù)據(jù)都是一個(gè)事務(wù);控制傳輸包括三個(gè)過(guò)程,建立過(guò)程和狀態(tài)過(guò)程分別是一個(gè)事務(wù),數(shù)據(jù)過(guò)程則可能包含多個(gè)事務(wù)。



          關(guān)鍵詞: STM32USB枚舉過(guò)

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();