USB2.0 列舉_Suspend_Resume時序說明

#電腦及周邊
#電腦及周邊 - 其他
日期:2026-11-04

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
         ↑ 插入
ResetD+ ──────┐                ┌─────  
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
    └┘└┘└┘└┘└┘─────────┘     (Suspend, J state)
         SOF消失 ←≥3ms→ 上拉接上

D-  ─┐┌┐┌┐┌┐┌┐┌┐──────────────────────────────  ≈0V
    └┘└┘└┘└┘└┘
    HS 400mV 擺幅     0V idle    切回 FS 後仍為 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 ─┐      ┌──┐      ┌─────┐
    0 V    └──────┘  └──────┘     └───────  (D+)

D-   400mV        ┌───┐    ┌──┐
    0 V   ───────┘   └────┘  └───────────  (D-)

狀態:  SE0   J    K   J    K   J   SE0
      (Idle)                      (Idle)

差分: 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

★方案內容均由個人提供,與平台無關,如有違法或侵權,請聯繫大大芯方案專屬信箱