USB 模塊 全面解析(二)

本文是我整理的一些 USB 的學習心得,希望能對大家有所幫助。

文章目錄

  • 前言
  • 🍍USB 協議層數據格式
      • 🍇包格式
          • 🍓 PID 域
          • 🍓 令牌包
          • 🍓 數據包
          • 🍓 握手包
      • 🍇傳輸類型
          • 🍓 批量傳輸
          • 🍓 中斷傳輸
          • 🍓 實時傳輸
          • 🍓 控制傳輸
  • 🍍USB 描述符
  • 總結


前言

這篇文章為大家介紹 USB協議層數據格式 以及 USB描述符 。

USB 模塊 全面解析(一)

🍍USB 協議層數據格式

在USB設備中,數據傳輸的基本單位是 “ 包 ” 。數據先傳輸最低位(LSB)。那 USB “包” 里面具體包含哪些內容(“域”)?

🍇包格式

在這里插入圖片描述

至于SOP, SYNC, EOP 具體的電平狀態,在上篇文章中都已詳細介紹了 : USB 模塊 全面解析(一)

  • SOP : “包” 的開始。
  • SYNC : 用來同步時鐘。
  • Packet Content : PID(包類型) + 地址/幀號/數據 + CRC(校驗)。
    地址 :確定 包 要發給哪個 USB 設備。
  • EOP : “包” 的結束。

下面主要介紹 包格式里 “Packet Content” 部分 的 PID。

🍓 PID 域

在 USB 協議中, PID 是用來標識 USB 數據包類型的關鍵字段。用于指示 數據包的類型 和 方向

在 USB 包中,PID域 使用 8 位來表示,格式如下:

在這里插入圖片描述

  • 前 4 位 : 標識數據包的類型。
  • 后 4 位:是前 4 位的取反,用于校驗 PID 類型的正確性。如果接收方發現 后 4 位不是 前 4 位的取反,就認為發生了錯誤。
“ 包 ” 可以分為 4 種類型:
① 令牌包(Token):指示數據傳輸的開始 和 方向。 (最低 2 位是 01 B)
② 數據包(Data):用于實際傳輸的數據部分。( 11 B)
③ 握手包(Handshake):確認數據包的接收狀態。( 10 B)
④ 特殊包(Special):用于特殊用途的包。( 00 B)

下面是根據 4 位的 PID 分為 16 種具體的 “包”類型:
在這里插入圖片描述


🍓 令牌包

這里需要注意一點,有 4 種令牌包,其中 SOF 用于通知所有的設備,而 OUT, IN, SETUP 用來通知某個設備。下面是對于 OUT, IN, SETUP 令牌包的結構。

由于 令牌包 起通知作用,要通知某個具體的USB 設備,所以要知道 USB設備的地址(7位)USB設備的端點號(4位)

在這里插入圖片描述
在這里插入圖片描述

所以一個完整的令牌包如下:
在這里插入圖片描述

首先 發送 SOP 表示包的開始 ->  SYNC 進行信號的同步 -> 根據 PID 的類型決定是 讀/寫數據 -> 11 位的幀號確定USB設備 -> CRC 校驗 -> EOP 表示包的結束。

🍓 數據包

Host 使用 OUT、IN、SETUP 來通知設備:我要傳輸數據了。數據通過"數據包"進行傳輸。數據包也有 4 種類型:DATA0、DATA1、DATA2、MDATA。我們只需了解 DATA0、DATA1。

為什么要 引入不同類型的數據包?

Host 和設備都會維護自己的數據包切換機制,當數據包成功發送或者接收時,數據包類型切換。當檢測到對方使用的數據包類型不對時,USB 系統認為發生了錯誤。

比如:
① Host 發送 DATA0 給設備,設備返回 ACK 表示成功接收,設備期待下一個數據是 DATA1
② 但是 Host 沒有接收到 ACK,Host 認為數據沒有發送成功,Host 繼續使用 DATA0 發送上一次的數據
③ 設備再次接收到 DATA0 數據包,它就知道:哦,這是重傳的數據包

一個完整的數據包如下:

在這里插入圖片描述


🍓 握手包

握手包有 4 類:ACK、NAK、STALL、NYET。

  • ACK : 數據接收方用來回復發送方,表示正確接收到了數據并且有足夠的空間保存數據。
  • NACK : Host 發送數據給設備時,設備可以回應 NAK 表示"我還沒準備好,沒辦法接收數據";Host 想讀取設備的數據時,設備可以回復 NAK 表示"我沒有數據給你"。
  • STALL : 表示發生了錯誤,比如設備無法執行這個請求(不支持該斷點等待)、斷點已經掛起。設備返回 STALL 后,需要主機進行干預才能接觸 STALL 狀態。
  • NYET : 僅適用于高速設備。Host 可以發出 PING 包用來確認設備有數據,設備可以回應NYET 表示"還沒呢"。Hub 也可以回應 NYET 表示低速/全速傳輸還沒完結

一個完整的握手包如下:

在這里插入圖片描述


🍇傳輸類型

USB 設備支持 4 種不同的傳輸類型,每種不同的傳輸類型使用不同的場景和需求。

在介紹這 4 種傳輸類型之前,先來了解幾個概念:

  • 事務:完整的數據傳輸,需要涉及多個包 令牌包、數據包、握手包。這個完整的數據傳輸過程,被稱為事務(Transaction)。
  • 傳輸:由一個 或者多個事務組成,完成一次完整的通信。

有些事務需要握手包,有些事務不需要握手包,有些事務可以傳輸很大的數據,有些事務只能傳輸小量數據。

有四類事務:

① 批量事務:用來傳輸大量的數據,數據的正確性有保證,時效沒有保證。
② 中斷事務:用來傳輸周期性的、小量的數據,數據的正確性和時效都有保證。
③ 實時事務:用來傳輸實時數據,數據的正確性沒有保證,時效有保證。
④ 建立事務:跟批量事務類似,只不過令牌包是 SETUP 令牌包。

有四類傳輸(Transfer):

① 批量傳輸:就是使用批量事務實現數據傳輸,比如 U 盤。
② 中斷傳輸:就是使用中斷事務實現數據傳輸,比如鼠標。
③ 實時傳輸:就是使用實時事務實現數據傳輸,比如攝像頭。
④ 控制傳輸:由建立事務、批量事務組成,所有的 USB 設備都必須支持控制傳輸,用于"識別/枚舉"。

  • 過程 :
    對于 批量,中斷,實時傳輸 都是由一個 事務組成,不再劃分為多個階段。
    對于 控制傳輸 由多個 事務組成,這些事務分別處于 多個過程:建立過程,數據過程,狀態過程。

  • 階段 :
    事務由 包 組成,這些 包 處于 3 個階段:令牌階段,數據階段,握手階段。令牌階段(Token phase):由令牌包實現。 數據階段(Data phase):由數據包實現。握手階段(Handshake phase):由握手包實現

① BIT 組成域(Field)
② 域組成包(Packet)
包組成事務(Transaction)
事務組成傳輸(Transfer)


🍓 批量傳輸
  • 批量傳輸用批量事務來實現,用于傳輸大量的數據,數據的正確性有保證,時效沒有保證。

  • 批量事務由 3 個階段(phase)組成:令牌階段、數據階段、握手階段。每個階段都是一個完整的包,含有 SOP、SYNC、PID、EOP。(下圖中各個矩形框就對應一個完整的包)

在這里插入圖片描述
在這里插入圖片描述


🍓 中斷傳輸
  • 中斷傳輸用中斷事務來實現,用于傳輸小量的、周期性的數據。數據的正確性和時效都有保證。

  • 中斷事務由 3 個階段(phase)組成:令牌階段、數據階段、握手階段。每個階段都是一個完整的包,含有 SOP、SYNC、PID、EOP。中斷事務的優先級比批量事務更高,它要求實時性,而批量事務不要求實時性。

中斷傳輸 要求實時性,由于 USB 協議中沒有 中斷的功能,所以,它使用"周期性的讀、寫"來實現及時性。具體過程如下:

① Host 每隔 n 毫秒發出一個 IN 令牌包
② 鼠標有數據的話,發出 DATA0 或 DATA1 數據包給 Host;鼠標沒有數據的話,發出 NAK 給Host。從下圖中可以看到沒有 NYET 延時等待

在這里插入圖片描述


🍓 實時傳輸
  • 實時傳輸用實時事務來實現,用于傳輸實時數據,對數據的正確性沒有要求。
  • 實時事務由 2 個階段(phase)組成:令牌階段、數據階段。每個階段都是一個完整的包,含有 SOP、SYNC、PID、EOP。實時事務不需要握手階段。

實時傳輸 不要求數據的準確性,沒有握手階段。(適用場景:視頻通話等)
在這里插入圖片描述


🍓 控制傳輸

控制傳輸由多個事務組成,這些事務分別處于 3 個過程:建立過程(stage)、數據過程(stage)、狀態過程(stage)。

① 建立過程(stage),使用 SETUP 事務:Host 發出 SETUP 令牌包、DATA0 數據包、得到 ACK握手包。

② 數據過程(stage),使用批量事務

a. 對于輸出:Host 發出OUT 令牌包,發出 DATA0、DATA1 數據包、得到 ACK 握手包
b. 對于輸入:Host 發出 IN 令牌包,讀到 DATA0、DATA1 數據包、發出 ACK 握手包

③ 狀態過程(stage),使用批量事務:

a. 對于輸出:Host 發出IN 令牌包,讀到 DATA1 數據包,發出 ACK 握手包
b. 對于輸入:Host 發出 OUT 令牌包,發出 DATA1 數據包,等待 ACK 握手包

在這里插入圖片描述

上圖的 每一個方框,都是一個完整的事務,含有:Token Packet、Data Packet、Handshake Packet。

例如,對于一個 SETUP 事務,下面是它的組成包 :

在這里插入圖片描述

在"setup 事務"中:

① SETUP 令牌包:用來通知設備,“要開始傳輸了”
② DATA0 數據包 ( 8 字節數據 ):它含有固定的格式,用來告訴設備"是讀還是寫"、“讀什么”、“寫什么”。


🍍USB 描述符

設備/配置/接口/端點 :

  • 對于一個 USB設備,它可以有多種配置 (Configuration)。
  • 一個配置下 可以有 多個接口 (Interface), 接口等同于 功能。 比如 USB 耳機有 2 個接口(功能):聲音收發,按鍵控制。
  • 一個接口 可以有 多個設置(Setting),比如 默認設置下 它使用較低的帶寬,也可以選擇其他設置去使用更高的帶寬。
  • 一個接口 由 一個/ 多個 端點(Endpoint)組成。端點0 屬于整個設備,是雙向的。

怎么描述 設備,配置,端點,接口?

使用描述符(Descriptors)。有設備描述符、配置描述符、接口描述符、端點描述符。所謂描述符,就是一些格式化的數據,用來描述信息。

一個 USB 設備:
① 只有一個設備描述符:用來表示設備的 ID、它有多少個配置、它的端點 0 一次最大能傳
輸多少字節數據
② 可能有多個配置描述符:用來表示它有多少個接口、供電方式、最大電流
③ 一個配置描述符下面,可能有多個接口描述符:用來表示它是哪類接口、有幾個設置
(Setting)、有幾個端點
③ 一個接口描述符符下面,可能有多個端點描述符:用來表示端點號、方向(IN/OUT)、類
型(批量/中斷/同步)

在這里插入圖片描述

還有 一些字符串描述符(String descriptors),它用可讀的文字來描述設備,是可選的。


總結

下篇文章為大家介紹 工業控制中經常用到的 Modbus 通信協議。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71283.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71283.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從基礎到實踐(十):MOS管的全面解析與實際應用

MOS管(金屬-氧化物半導體場效應晶體管)是現代電子技術的基石,憑借高輸入阻抗、低功耗和易集成特性,成為數字電路、電源管理和信號處理的核心元件。從微處理器到新能源汽車電驅系統,其高效開關與放大功能支撐了計算機、…

AES/CBC/PKCS5Padding加密

1、加密代碼如下 public static String encryptAEs_CBC(String data,String key,byte[] iv) {Cipher cipher = null;try {cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//位數不夠,自動補一個長度int blocksize = cipher.getBlockSize();byte[] dataBytes …

指紋細節提取(Matlab實現)

指紋細節提取概述指紋作為人體生物特征識別領域中應用最為廣泛的特征之一,具有獨特性、穩定性和便利性。指紋細節特征對于指紋識別的準確性和可靠性起著關鍵作用。指紋細節提取,即從指紋圖像中精確地提取出能夠表征指紋唯一性的關鍵特征點,是…

Python 圖像處理之 Pillow 庫:玩轉圖片

哈嘍,大家好,我是木頭左! Pillow 庫作為 Python 圖像處理的重要工具之一,為提供了便捷且功能豐富的接口,讓能夠輕松地對圖像進行各種操作,從簡單的裁剪、旋轉到復雜的濾鏡應用、圖像合成等,幾乎無所不能。接下來,就讓一起深入探索如何使用 Pillow 庫來處理圖片,開啟一…

Android Flow 示例

在Android開發的世界里,處理異步數據流一直是一個挑戰。隨著Kotlin的流行,Flow作為Kotlin協程庫的一部分,為開發者提供了一種全新的方式來處理這些問題。今天,我將深入探討Flow的設計理念,并通過具體的例子展示如何在實…

記錄uniapp小程序對接騰訊IM即時通訊無ui集成(2)

完成以上步驟之后開始進行登錄,登陸就需要賬號。這個賬號我們可以在騰訊云中創建。 有了賬號之后開始去小程序進行登陸操作。騰訊云接口文檔 這里除了帳號還需要一個校驗值userSig正常項目開發這個字段可以在登陸后讓后端返回,現在是測試我們直接去控制…

北京航空航天大學計算機復試上機真題

北京航空航天大學計算機復試上機真題 2023北京航空航天大學計算機復試上機真題 在線評測&#xff1a;https://app2098.acapp.acwing.com.cn/ 階乘和 題目描述 求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一個數字。 輸入格式 輸入一個n&#xff08;n<20&#xff09; …

阿里萬相,正式開源

大家好&#xff0c;我是小悟。 阿里萬相正式開源啦。這就像是AI界突然開啟了一扇通往寶藏的大門&#xff0c;而且還是免費向所有人敞開的那種。 你想想看&#xff0c;在這個科技飛速發展的時代&#xff0c;AI就像是擁有神奇魔法的魔法師&#xff0c;不斷地給我們帶來各種意想…

算法之數據結構

目錄 數據結構 數據結構與算法面試題 數據結構 《倚天村 ? 圖解數據結構》 | 小傅哥 bugstack 蟲洞棧 ?數據結構基礎知識體系詳解? | Java 全棧知識體系 線性數據結構 | JavaGuide 數據結構與算法面試題 數據結構與算法面試題 | 小林coding

零基礎學習之——深度學習算法介紹01

第一節.基礎骨干網絡 物體分類是計算機視覺&#xff08;computer vision&#xff0c;CV&#xff09;中最經典的、也是目前研究得最為透徹的一 個領域&#xff0c;該領域的開創者也是深度學習領域的“名人”級別的人物&#xff0c;例如 Geoffrey Hinton、Yoshua Bengio 等。物…

弧度與角度之間的轉換公式

Radian 弧度的英語 簡稱 Rad Degree 角度的英語 簡稱 Deg 角度轉弧度 RadDeg*180/π CogMuisc.DegToRad(double degress) DegRad/180*π CogMuisc.RadToDeg(double radians) 總結: 角度大 弧度小 弧度轉角度 肯定要乘以一個大于1的數 那就是…

css之英文換行樣式

在 CSS 中&#xff0c;要實現英文文本自動換行但不從單詞中間斷開的效果&#xff0c;可以使用 word-wrap 或 overflow-wrap 屬性。以下是相關的 CSS 屬性和它們的配置&#xff1a; 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…

40歲開始學Java:Java中單例模式(Singleton Pattern),適用場景有哪些?

在Java中&#xff0c;單例模式&#xff08;Singleton Pattern&#xff09;用于確保一個類只有一個實例&#xff0c;并提供全局訪問點。以下是詳細的實現方式、適用場景及注意事項&#xff1a; 一、單例模式的實現方式 1. 餓漢式&#xff08;Eager Initialization&#xff09; …

【前端基礎】3、HTML的常用元素(h、p、img、a、iframe、div、span)、不常用元素(strong、i、code、br)

HTML結構 一個HTML包含以下部分&#xff1a; 文檔類型聲明html元素 head元素body元素 例&#xff08;CSDN&#xff09;&#xff1a; 一、文檔類型聲明 HTML最一方的文檔稱為&#xff1a;文檔類型聲明&#xff0c;用于聲明文檔類型。即&#xff1a;<!DOCTYPE html>…

文本挖掘+情感分析+主題建模+K-Meas聚類+詞頻統計+詞云(景區游客評論情感分析)

本文通過情感分析技術對景區游客評論進行深入挖掘,結合數據預處理、情感分類和文本挖掘,分析游客評價與情感傾向。利用樸素貝葉斯和SVM等模型進行情感預測,探討滿意度與情感的關系。通過KMeans聚類和LDA主題分析,提取游客關心的話題,提供優化建議,為未來研究提供方向。 …

【實戰 ES】實戰 Elasticsearch:快速上手與深度實踐-2.2.2線程池配置與寫入限流

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 Elasticsearch批量寫入性能調優&#xff1a;2.2.2 線程池配置與寫入限流深度實踐1. 線程池核心機制解析1.1 Elasticsearch線程池架構1.2 Bulk線程池工作模型 2. 寫入場景線程…

VSCode 與 Vim 插件 的 復制粘貼等快捷鍵沖突,優先使用 VSCode 的快捷鍵

VSCode 與 Vim 插件 的 復制粘貼等快捷鍵沖突&#xff0c;優先使用 VSCode 的快捷鍵 在 VSCode 中&#xff0c;如果你發現 Vim 插件&#xff08;如 VSCodeVim 擴展&#xff09;與 VSCode 的默認復制粘貼快捷鍵&#xff08;CtrlC / CtrlV&#xff09;沖突&#xff0c;并且你想優…

tsconfig.json 配置清單

tsconfig.json 配置清單 基礎結構 {"compilerOptions": {// 編譯選項},"include": [// 指定需要編譯的文件或目錄],"exclude": [// 指定不需要編譯的文件或目錄],"extends": "./base-tsconfig.json","files": […

springboot可以同時處理多少個請求

源碼 ServerProperties Tomcat 配置 參數解析 必須要先建立連接&#xff0c;再用線程處理。 比如max-connection最大連接數&#xff0c;accept-count相當于隊列容量。總連接數二者和 min-spare-treads 核心線程數默認10&#xff0c;max-threads最大線程數默認200。 正常…

Spring 三級緩存 vs 二級緩存:深度解析循環依賴的終極解決方案

目錄 一. 循環依賴的本質矛盾 1. 什么是循環依賴&#xff1f; 2. 矛盾的核心 二. 三級緩存架構解析 三級緩存工作流程圖?編輯 三、為什么必須三級緩存&#xff1f; 1. 二級緩存的致命缺陷 2. 三級緩存的精妙設計 四、場景推演&#xff1a;三級緩存如何解決代理問題 …