USB協議簡介
來源:深圳市凱茉銳電子科技有限公司2025-02-17
USB–Universal Serial Bus即通用串行總線,簡化了計算機與外圍設備的連接;
1 USB概念
主機host: 主機是 USB 系統的控制中心,通常是一個計算機或其他設備,負責管理和協調所有 USB 設備的通信。
Hub: 集線器用于擴展 USB 系統,允許多個設備連接到同一個主機。
設備device:設備是連接到 USB 系統的終端設備,如鍵盤、鼠標、打印機、存儲設備等。
端點endpoint:端點是設備上的一個邏輯實體,用于與主機進行數據傳輸。每個設備可以有多個端點,每個端點都有唯一的地址。
管道Pipe: 管道是主機和設備端點之間的通信路徑。每個管道都有特定的傳輸類型和屬性。
1.1 USB基本名詞
USB協議均是版本向下兼容。
USB 1.0/1.1(low/full speed),傳輸速率最大為12Mbps
USB 2.0(high speed), 傳輸速率最大480Mbps
USB 3.0(super speed), 采用8b/10b編碼,增加一對超高速差分線 傳輸速率最大5Gbps
USB 3.1 采用 128b/132b 編碼,速度提高 1 倍,供電 20V/5A,同時增加了 A/V 影音傳輸標準 10 Gbps
USB 3.2 增加一對超高速傳輸通道,速度再次翻倍,只能在 C 型接口上運行 20Gbps
2.USB物理接口形式分類:Type A、Type C;這兩種是最常見的物理接口;
3.PIPE(管道):主機和endpoint之間的數據傳輸是PIPE;
4.方向:端點是有方向的,主機到從機成為out端點,從機到主機成為in端點。
5.管道通信方式:pipe中的數據通信方式有兩種,一種是stream一種是message。message要求進出進出方向必須要求同一個管道。
6.傳輸方式:USB endpiont有四種類型,分別對應了不同的數據傳輸方式,分別為control transfers控制傳輸、interrupt transfers中斷傳輸、Bluk Data transfers批量傳輸、Isochronous Data Tranfers等時傳輸。
控制傳輸:用于配置和管理設備,包括設備枚舉、設置配置和獲取狀態信息。
中斷傳輸:用于傳輸小量的定時數據,如鍵盤和鼠標的輸入。中斷傳輸提供定期的輪詢機制,確保數據的及時傳輸。
批量傳輸:用于傳輸大量數據,如文件傳輸和打印任務。批量傳輸保證數據的完整性和可靠性,但不保證實時性。
等時傳輸:用于實時數據傳輸,如音頻和視頻流。等時傳輸保證數據的實時性和帶寬,但不保證數據的完整性。
1.2 描述符
主設備之所以能區分不同的從設備,靠的就是描述符;USB協議里就規定了各種不同的USB描述符。
+------設備描述符
+----------配置描述符1
+----------接口描述符1
+----------端點描述符1
+----------端點描述符2
+....
+----------接口描述符2
+----------端點描述符1
+....
+....
+----------配置描述符2
+----------接口描述符1
+----------端點描述符1
+----------端點描述符2
+....
+....
+....
1.2.1 設備描述符
設備描述符:用來描述該設備,一個設備只有一個設備描述符,包含了設備類型、設備遵循的協議、廠商ID、產品id、序列號等。
一個描述符Demo:
DEVICE DESCRIPTOR
bLength: 18
bDescriptorType: 0x01 (DEVICE)
bcdUSB: 0x0200
bDeviceClass: Vendor Specific (0xff)
bDeviceSubClass: 255
bDeviceProtocol: 255
bMaxPacketSize0: 64
idVendor: Marvell Semiconductor, Inc. (0x1286)
idProduct: Unknown (0x812a)
bcdDevice: 0x0000
iManufacturer: 3
iProduct: 2
iSerialNumber: 0
bNumConfigurations: 1
1.2.2 配置描述符
用來配置設備,一個設備同一時刻只能有一種配置生效,而且要區分配置和設置的區別。
配置描述符內容:
ONFIGURATION DESCRIPTOR
bLength: 9
bDescriptorType: 0x02 (CONFIGURATION)
wTotalLength: 121
bNumInterfaces: 4
bConfigurationValue: 1
iConfiguration: 0
Configuration bmAttributes: 0xc0 SELF-POWERED NO REMOTE-WAKEUP
1... .... = Must be 1: Must be 1 for USB 1.1 and higher
.1.. .... = Self-Powered: This device is SELF-POWERED
..0. .... = Remote Wakeup: This device does NOT support remote wakeup
bMaxPower: 250 (500mA)
1.2.3 接口描述符
一個interface就代表一個設備。USB interface用來處理一類 USB 邏輯連接, 例如一個鼠標, 一個鍵盤, 或者一個音頻流.但一些 USB 設備有多個接口。
INTERFACE DESCRIPTOR (2.0): class Vendor Specific
bLength: 9
bDescriptorType: 0x04 (INTERFACE)
bInterfaceNumber: 2
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: Vendor Specific (0xff)
bInterfaceSubClass: 0x00
bInterfaceProtocol: 0x00
iInterface: 8
1.2.4 端點描述符
USB通信的基本物理單位,一個endpiont只能承載一個方向的數據。endpiont分為如下幾種:
CONTROL
控制端點被用來允許對 USB 設備的不同部分存取. 通常用作配置設備, 獲取關于設備的信息, 發送命令到設備, 或者獲取關于設備的狀態報告. 這些端點在尺寸上常常較小.每個 USB 設備有一個控制端點稱為"端點 0", 被 USB CORE用來在插入時配置設備. 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備.
INTERRUPT
中斷端點傳送小量的數據, 以固定的速率在每次 USB 主請求設備數據時. 這些端點對 USB 鍵盤和鼠標來說是主要的傳送方法. 它們還用來傳送數據到 USB 設備來控制設備, 但通常不用來傳送大量數據. 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備.
ISOCHRONOUS
同步端點也傳送大量數據, 但是這個數據常常不被保證它完成. 這些端點用在可以處理數據丟失的設備中, 并且更多依賴于保持持續的數據流. 實時數據收集, 例如音頻和視頻設備, 一直都使用這些端點.
BULK端點描述符數據內容如下:
ENDPOINT DESCRIPTOR
bLength: 7
bDescriptorType: 0x05 (ENDPOINT)
bEndpointAddress: 0x86 IN Endpoint:6
1... .... = Direction: IN Endpoint
.... 0110 = Endpoint Number: 0x6
bmAttributes: 0x02
.... ..10 = Transfertype: Bulk-Transfer (0x2)
wMaxPacketSize: 512
.... ..10 0000 0000 = Maximum Packet Size: 512
bInterval: 0
1.3 USB的分層
1.3.1 協議層
協議層主要包括:數據包類型、數據包的格式、對主機和設備發送的數據包的預期響應、描述了四種USB 3.0事務類型、支持批量傳輸類型的流式傳輸支持、設備/主機可能接收/發送的各種響應和數據包的定時參數。
整個協議包的類型有:
1.3.2 鏈路層
Link Layer鏈路層主要包括:數據包幀、鏈路命令、鏈路管理和流量控制、鏈路錯誤規則/恢復、重置、鏈路狀態機描述;
1.3.3 物理層
定義了高速組件之間互操作性所需的電氣層參數。
1.4 USB傳輸
USB總線上傳輸數據是以包(packet)為基本單位的,必須把不同的包組織成事務(transaction)才能傳輸數據。
USB協議定義了四種傳輸(transfer)類型: 批量傳輸 , 同步傳輸 , 中斷傳輸 , 控制傳輸 .其中,批量傳輸、同步傳輸、中斷傳輸每傳輸一次數據都是一個事務。
1.4.1 包packet
一個包被分為不同域,根據不同類型的包,所含的域也是不一樣的。但都要以同步域SYNC開始,緊跟一個包標識符PID,最終以包結束符EOP來結束這個包。
PID域: PID用來標識一個包的類型,它共有8位,只使用低四位,高四位取反,用來校驗PID;
PID規定了四類包: 令牌包 、 數據包 、 握手包 、 特殊包 . 同類的包又各分為具體的四種包:
地址域: 地址共占11位,其中低7位是設備地址,高4位是端點地址;
幀號域:幀號占11位,主機每發一幀,幀號都會自動加1,當幀號達到0x7FF時,將歸零重新開始計數。
數據域:根據傳輸類型的不同,數據域的數據長度從0到1024字節不等。
CRC域: 計算地址域和幀號域的CRC,或數據域數據的CRC;
1.4.2 包類型
令牌包–四種:
OUT: 通知設備將要輸出一個數據包
IN: 通知設備返回一個數據包
SETUP: 只用在控制傳輸中,也是通知設備將要輸出一個數據包,域OUT令牌的區別是:只使用DATA0數據包,且只能發到device的控制端點
SOF: 在每幀開始時以廣播的形式發送,針對USB全速設備,主機每1ms產生一個幀,USB主機會對當前幀號進行統計,每次幀開始時通過SOF包發送幀號
數據包
數據包沒有地址域和幀號域,根據transfer的類型不同,數據包最大長度有所不同。
握手包–4種
ACK: 傳輸正確完成
NAK: 設備暫時沒有準備好接收數據,或沒有準備好發送數據
STALL: 設備不能用于傳輸
NYET/ERR: 僅用于高速傳輸,設備沒有準備好或出錯
握手包僅有PID域:
1.5 傳輸transfer
事務可以分為三類:
setup事務: 主機用來向設備發送控制命令
數據輸入事務: 主機用來從設備讀取數據
數據輸出事務: 主機用來向設備發送數據
1.5.1 批量傳輸
批量傳輸使用批量傳輸事務(IN傳輸/OUT傳輸),一次批量傳輸事務分為三個階段: 令牌包階段、數據包階段、握手包階段
描述:
1.令牌階段: 主機發送BULK令牌包,令牌包中包含設備地址、端點號、數據方向
2.數據包階段:
從機如果接收令牌包出錯,無響應,讓主機等待超時
從機端點不存在,回送STALL
從機端點數據未準備好,回送NAK
從機數據準備好,回送數據包
3.握手包階段:數據包正確,并有足夠的空間保留數據,設備返回ACK握手包括:NYET握手包(只有高速模式才有NYET握手包,表示本次數據接收成功,但沒有能力接收下一次傳輸)
數據包正確,但沒有足夠的空間保存數據,設備返回NAK握手包。主機收到NAK后,延時一段時間后,再重新進行批量輸出事務
數據包正確,但端點處于掛起狀態;設備返回一個STALL握手包
數據包錯誤,設備不返回任何握手包,讓主機等待超時
CRC錯誤或位填充錯誤: 設備不返回任何握手包,讓主機等待超時;
1.5.2 中斷傳輸
中斷傳輸一般用于小批量的和非連續的數據傳輸,但實時性高的場合,主要應用于人機交互設備(HID)的鼠標和鍵盤。
1.5.3 同步傳輸
同步傳輸是不可靠的傳輸,只關心數據的實時性,不關心數據的正確性,它沒有握手包,也不支持PID翻轉。主機在排定事務傳輸時,同步傳輸有最高優先級.應用在數據量大,對實時性要求較高的場合,如視頻設備,音頻設備;
同步傳輸包含兩個階段: 令牌階段、數據階段:
1.5.4 控制傳輸
控制傳輸是一種特殊的傳輸方式。當USB設備初次連接主機時,用控制傳輸傳送控制命令等對設備進行配置。同時設備接入主機時,需要通過控制傳輸去獲取USB設備的描述符以及 對設備進行識別,在設備的枚舉過程中都是使用控制傳輸進行數據交換。
控制傳輸分為三個階段:
建立過程:
主機發送令牌包: SETUP
主機發送數據包: DATA0
設備返回握手包: ACK或不應答
2.數據過程(可選): 一個數據過程可以不包含或包含多個數據事務,但所有數據事務必須是同一方向的。若數據方向發生了改變則認為進入了狀態過程. 數據過程中的第一個數據包必須是DATA1,然后 每次正確傳輸一個數據包后就在DATA0和DATA1之間交替;
3.狀態過程: 狀態過程只使用DATA1包,并且傳輸方向與數據方向相反。
2 USB1.1 示例
此Demo只展示創建一個簡單的 USB 設備模塊,該模塊能夠響應主機的請求,并發送和接收數據;實現最基本的控制傳輸功能。
module usb_device (
input wire clk, // 時鐘信號
input wire reset_n, // 復位信號,低電平有效
input wire usb_dp, // USB D+ 信號
input wire usb_dm, // USB D- 信號
output reg usb_dp_out, // USB D+ 輸出
output reg usb_dm_out, // USB D- 輸出
output reg [7:0] data_out, // 發送到主機的數據
input wire [7:0] data_in, // 從主機接收的數據
output reg data_valid, // 數據有效信號
output reg data_ready // 數據準備好信號
);
// 內部狀態機狀態
typedef enum logic [2:0] {
IDLE,
SYNC,
TOKEN,
DATA,
HANDSHAKE
} state_t;
state_t state, next_state;
// 內部寄存器
reg [7:0] token_reg;
reg [7:0] data_reg;
reg [7:0] handshake_reg;
// 組合邏輯部分
always_comb begin
next_state = state;
usb_dp_out = 1'bz;
usb_dm_out = 1'bz;
data_valid = 1'b0;
data_ready = 1'b0;
case (state)
IDLE: begin
if (usb_dp && !usb_dm) begin
next_state = SYNC;
end
end
SYNC: begin
if (!usb_dp && usb_dm) begin
next_state = TOKEN;
end
end
TOKEN: begin
token_reg = {usb_dm, token_reg[7:1]};
if (token_reg[0]) begin
next_state = DATA;
end
end
DATA: begin
if (token_reg[0]) begin
// 接收數據
data_reg = {usb_dm, data_reg[7:1]};
if (data_reg[0]) begin
data_out = data_reg;
data_valid = 1'b1;
next_state = HANDSHAKE;
end
end else begin
// 發送數據
usb_dp_out = data_in[7];
usb_dm_out = ~data_in[7];
data_in = {1'b0, data_in[7:1]};
if (data_in[0]) begin
data_ready = 1'b1;
next_state = HANDSHAKE;
end
end
end
HANDSHAKE: begin
// 發送握手包
handshake_reg = 8'b00000011; // ACK
usb_dp_out = handshake_reg[7];
usb_dm_out = ~handshake_reg[7];
handshake_reg = {1'b0, handshake_reg[7:1]};
if (handshake_reg[0]) begin
next_state = IDLE;
end
end
endcase
end
// 時序邏輯部分
always_ff @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
state <= IDLE;
end else begin
state <= next_state;
end
end
endmodule
相關資訊
- 2025-03-10
- 2025-03-07
- 2025-03-06
- 2025-03-05
- 2025-03-04
- 2025-03-03