新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于STM32的USB枚舉過程學習筆記(一)

        基于STM32的USB枚舉過程學習筆記(一)

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

        USB總線上的數據傳輸以包為基本的單位。USB協議規定了四種包:令牌包、數據包、握手包、特殊包。不同的包通過包中的8位PID域區分。

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

        令牌包用于啟動一次USB傳輸,USB的數據傳輸必須由主機發起。令牌包有四種:

        輸出令牌包(OUT):用來通知設備將要輸出一個數據包。 數據方向 主機-->設備

        輸入令牌包(IN):用來通知設備將要返回一個數據包。數據方向 設備-->主機

        建立令牌包(SETUP):通知設備將要輸出一個數據包,類似OUT包。不過SETUP包只能往端點0發包,只用在控制傳輸中。

        幀起始包(SOF):用于幀計數,USB全速設備每毫秒產生一幀,USB高速設備每125μS產生一幀。

        OUT , IN, SETUP包的結構:同步域+8位PID+7位地址+4位端點號+5位CRC校驗+包結束符EOP

        • 數據包

        數據包用來傳輸數據,分成DATA0. DATA1 。數據格式如下

        同步域+8位PID+N個字節的數據+CRC16校驗+包結束符EOP

        • 握手包

        握手包用來表示一個傳輸是否被對方確認,有ACK,NAK,STALL,NYET。

        ACK:表示正確的接收數據并且有足夠的空間容納數據。主機和設備都可以使用ACK來確認,NAK,STALL,NYET只能夠用于設備返回,主機不能使用。

        NAK:表示沒有數據需要返回,或者數據正確接收但是沒有空間容納。當主機收到NAK后,知道設備還未準備好,主機會在合適的時候重新進行數據傳輸。

        STALL:表示設備無法執行該請求,或者端點已經被掛起。

        NYET:USB高速設備中用。

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

        2. 數據包的處理

        在傳輸過程中,具體的處理細節由USB接口的芯片處理完成。

        當USB接口芯片正確接收到數據時,如果有空間保存,則它將數據保存并返回ACK,同時,設置一個標志表示已經正確接收到數據;如果沒有空間保存數據,則自動返回NAK。

        收到輸入請求時,如果有數據需要發送,則發送數據,并等待接收ACK。只有到數據成功發送出去(即接收到ACK標志后),它才設置標志,表示數據已成功發送;如果無數據需要發送,則它自動返回NAK。

        通常只需根據芯片提供的一些標志,準備要發送的數據到端點,或者從端點讀取接收到的數據即可。

        二 ,USB事務

        雖然USB定義了數據在總線上傳輸的基本單位是包,為了傳輸數據,必須按照一定的關系把這些不同的包組織成事務才能傳輸數據。事務通常由兩個或者三個包組成:令牌包、數據包和握手包。

        令牌包用來啟動一個事務,總是由主機發送;數據包用來傳送數據,可以從主機到設備,也可以由設備到主機,方向由令牌包來指定;握手包用來指定數據傳輸結果。

        三,USB傳輸類型

        USB規定了4種傳輸類型:批量傳輸、等時傳輸、中斷傳輸、控制傳輸。其中前三個傳輸一次數據都是一個事務;控制傳輸包括三個過程,建立過程和狀態過程分別是一個事務,數據過程則可能包含多個事務。



        關鍵詞: STM32USB枚舉過

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 商丘市| 九江市| 深州市| 泸定县| 东兰县| 杨浦区| 安新县| 龙海市| 子长县| 凉山| 汾阳市| 卢氏县| 大悟县| 宾阳县| 汉源县| 板桥市| 曲麻莱县| 华池县| 铜川市| 儋州市| 兴文县| 丹阳市| 陈巴尔虎旗| 泰和县| 玛沁县| 连城县| 滦南县| 隆德县| 宁波市| 澄迈县| 临夏市| 九江市| 肇庆市| 镇巴县| 阳城县| 鸡东县| 桑植县| 砚山县| 富源县| 高台县| 河西区|