1. 概觀:USB 2.0 的電源狀態
| 狀態 | 名稱 | 說明 |
L0 | On | 正常運作,主機每 1 ms(全速)或 125 µs(⾼速)送出 SOF。 |
L1 | Sleep | 由主機以 LPM 交易協商進⼊,進出時間在 µs 到 ms 等級 |
L2 | Suspend | 匯流排 Idle(J 態)超過 3 ms 後進⼊,耗電須降到 Suspend 電流 |
L3 | Off | 裝置未連接或未供電 |
2. 線路狀態定義(高速)
| 狀態 | D+ | D- | 說明 |
Differential ”1” | 1 | 0 |
|
Differential ”0” | 0 | 1 |
|
J State | Differential ”1” | Suspend,有 1.5 kΩ 上拉在 D+ | |
K State | Differential ”0” | 與 J 相反,Resume 用 | |
Idle | 0 | 0 | 閒置 |
SOP |
|
| Idle ->K |
EOP |
|
| Idle ->J |
3. USB 2.0 裝置列舉(Enumeration)
3.1 連接偵測(Attached)
l 裝置插入後,上拉電阻(1.5 kΩ)把 D+(全速/高速)或 D−(低速)拉高到 3.3V
l Hub 偵測到線路狀態改變,透過狀態變更端點(Status Change Endpoint)通知主機
3.2 主機等待並重設埠(Powered → Default)
l 主機等待至少 100 ms,讓電源與裝置穩定
l 主機對該埠發出 Reset(SE0 持續至少 10 ms)
l 高速裝置在重設期間進行 Chirp 握手(裝置送 Chirp K,Hub 回 K/J 序列),協商是否使用 480 Mbps;失敗則維持全速
l 重設後,裝置位址為 0,電流上限 100 mA,只回應預設控制端點(EP0)
3.3 取得裝置描述元(前 8 位元組)
l 主機對位址 0 送 GET_DESCRIPTOR (Device),長度 64 位元組(實際只需先讀前 8 位元組)
l 目的是取得 bMaxPacketSize0(EP0 最大封包大小:低速 8、全速 8/16/32/64、高速 64)
3.4 再次重設(部分主機)
l 有些主機(如 Windows)此時再做一次埠重設,確保裝置狀態乾淨
3.5 設定位址(Address)
l 主機送 SET_ADDRESS,指派 1~127 的唯一位址
l 裝置在狀態階段完成後才切換到新位址(最多 2 ms 內)
3.6 讀取完整描述元
l 主機用新位址再次 GET_DESCRIPTOR (Device),取得完整 18 位元組:VID、PID、裝置類別、設定數量等
l 接著讀取 Configuration Descriptor(先讀 9 位元組取得總長度,再讀完整內容),內含 Interface、Endpoint 等描述元
l 視需要讀取 String Descriptor(製造商、產品名稱、序號)
l 高速裝置可能還會讀 Device Qualifier 與 Other Speed Configuration
3.7 載入驅動程式
l 主機依 VID/PID 或 Class/SubClass/Protocol 比對並載入適合的驅動
3.8 設定組態(Configured)
l 主機送 SET_CONFIGURATION,選定一個組態
l 此時裝置可使用該組態宣告的電流(最高 500 mA),各端點啟用,進入 Configured 狀態
l 若有需要,再用 SET_INTERFACE 選擇替代介面設定
3.9 開始正常運作
l 驅動程式開始透過各端點傳輸資料
| 插入與速度偵測 | D+ ───────┐┌──────────────── ≈3.3V(上拉接上) 0V └┘ D- ───────────────────────── ≈0V ↑ 插入 |
| Reset | D+ ──────┐ ┌───── 3.3V └──── SE0 ≥10ms ─┘ D- ──────┘ (皆 0V) |
| Chirp 握手 | 設備 Chirp K: D- ─┌───── 1~7 ms ─────┐ D+ ─┘ └ Host Chirp K/J: K J K J K J … (每個 40~60 µs) 結果: 設備切 HS 模式,總線回約 0 V |
進入 HS 並開始 SOF 控制傳輸(SETUP / DATA / ACK) | SOF ─ SOF ─ [SETUP│Addr0 EP0] [DATA0: GET_DESCRIPTOR 8 bytes] [ACK] … |
| 完整波形示意 | D+ ─┐ ┌──── SE0 ────┐ Chirp ┌┐┌┐┌ SOF SOF ─ SETUP... └──────────┘ (Reset) └──────┘└┘└┘ 插入 去彈跳 ≥10 ms K/J 握手 HS 125µs 控制傳輸 |
4. High-Speed 封包的 SOP 與 EOP 流程
4.1 SOP 流程(開始)
發送端:
1. 總線在 Idle,差分約 0 V。
2. 開啟 HS 電流驅動器(約 17.78 mA 流過兩端 45 Ω 終端電阻,產生約 400 mV 差分)。
3. 立即送出 SYNC:KJKJ KJKJ KJKJ KJKJ KJKJ KJKJ KJKJ KJKK(32 bit)。
4. SYNC 之後接 PID。
接收端:
1. Squelch 偵測器發現差分幅度超過約 150 mV,判定有封包,這一刻就是 SOP。
2. PLL 利用 SYNC 的連續翻轉鎖定時脈、對齊位元邊界。
3. 偵測到 SYNC 結尾的 KK,代表後面開始是 PID。
4. 經過 Hub 時,SYNC 可能被縮短(最多少 4 bit),所以接收端要能容忍較短的 SYNC。
4.2 EOP 流程(結束)
發送端:
1. CRC 送完。
2. 送出 EOP 型樣 01111111:
o 第一個 0 讓差分極性翻轉一次;
o 後面 7 個 1 在 NRZI 下代表不變,所以維持同一極性 7 個位元時間;
o 這 7 個 1 不做 bit stuffing。
3. 關閉 HS 驅動器,總線回到 Idle。
5. High-Speed Suspend波形
5.1 HS 設備的判斷流程:
l 設備在 HS 模式下檢測到匯流排空閒 ≥ 3 ms。
l 設備回退到 FS 模式(斷開 HS 終端電阻,重新接上 D+ 1.5 kΩ 上拉),此時匯流排表現為 J 狀態(D+ 高、D- 低)。
l 如果此時匯流排是 J 狀態 → 說明是 Suspend。
l 如果此時匯流排是 SE0 → 說明是 Reset,進入 HS 握手流程(Chirp)。
D+ ─┐┌┐┌┐┌┐┌┐┌┐ ┌──────────────────── ≈3.3V D- ─┐┌┐┌┐┌┐┌┐┌┐────────────────────────────── ≈0V |
6. High-Speed Resume波形
6.1 設備發起 Remote Wakeup
l 設備必須先在 Suspend 狀態至少保持 5 ms。
l 設備驅動 K 狀態(D- 高、D+ 低)至少 1 ms,但不超過 15 ms。
l Hub 檢測到 K 後,會向上游反射(傳播)K 狀態,並接管匯流排。
l Host 看到 K 後,會在 K 持續一段時間(≥20 ms)後結束。
6.2 Host 發起 Resume
l Host 驅動 K 狀態持續至少 20 ms。
l 結束時,Host 驅動 低速 EOP:兩個 SE0(約 1~1.5 個 LS 位時間,即 D+/D- 同時拉低),然後回到 J 狀態。
l 之後 Host 恢復發 SOF/Keep-alive,設備恢復 HS 工作。
| D+ ──────┐ ┌┐ ┌── (回 HS 後約 0V Idle) 3.3V └────────────┘└────────┘ ← K ≥20 ms → SE0 J D- ──────┌────────────┐ 0V ┘ 3.3V └────────── 0V Suspend(J) Resume(K) EOP 回HS |
7. J、K、SE0 波形說明
USB 2.0 ⽤ D+ 與 D- 兩條差動訊號線傳輸。J 態與 K 態是兩種差動狀態,SE0 是兩線同時為低。匯流排閒置(Idle)時固定為 J 態,所以 K 態是唯⼀能與 Idle 明確區分的差動狀態。
D+ 400mV ─┐ ┌──┐ ┌─────┐ D- 400mV ┌───┐ ┌──┐ 狀態: SE0 J K J K J SE0 差分: 0V → +400mV → −400mV → +400mV → −400mV → … → 0V |
參考文件:
https://hackmd.io/@RinHizakura/HkZzfJpj6
https://www.perytech.com/Language/tw/USB-Enumeration.htm
https://www.usbzh.com/article/detail-1214.html
