USB協(xié)議簡(jiǎn)介
來(lái)源:深圳市凱茉銳電子科技有限公司2025-02-17
USB–Universal Serial Bus即通用串行總線(xiàn),簡(jiǎn)化了計(jì)算機(jī)與外圍設(shè)備的連接;
1 USB概念
主機(jī)host: 主機(jī)是 USB 系統(tǒng)的控制中心,通常是一個(gè)計(jì)算機(jī)或其他設(shè)備,負(fù)責(zé)管理和協(xié)調(diào)所有 USB 設(shè)備的通信。
Hub: 集線(xiàn)器用于擴(kuò)展 USB 系統(tǒng),允許多個(gè)設(shè)備連接到同一個(gè)主機(jī)。
設(shè)備device:設(shè)備是連接到 USB 系統(tǒng)的終端設(shè)備,如鍵盤(pán)、鼠標(biāo)、打印機(jī)、存儲(chǔ)設(shè)備等。
端點(diǎn)endpoint:端點(diǎn)是設(shè)備上的一個(gè)邏輯實(shí)體,用于與主機(jī)進(jìn)行數(shù)據(jù)傳輸。每個(gè)設(shè)備可以有多個(gè)端點(diǎn),每個(gè)端點(diǎn)都有唯一的地址。
管道Pipe: 管道是主機(jī)和設(shè)備端點(diǎn)之間的通信路徑。每個(gè)管道都有特定的傳輸類(lèi)型和屬性。
1.1 USB基本名詞
USB協(xié)議均是版本向下兼容。
USB 1.0/1.1(low/full speed),傳輸速率最大為12Mbps
USB 2.0(high speed), 傳輸速率最大480Mbps
USB 3.0(super speed), 采用8b/10b編碼,增加一對(duì)超高速差分線(xiàn) 傳輸速率最大5Gbps
USB 3.1 采用 128b/132b 編碼,速度提高 1 倍,供電 20V/5A,同時(shí)增加了 A/V 影音傳輸標(biāo)準(zhǔn) 10 Gbps
USB 3.2 增加一對(duì)超高速傳輸通道,速度再次翻倍,只能在 C 型接口上運(yùn)行 20Gbps
2.USB物理接口形式分類(lèi):Type A、Type C;這兩種是最常見(jiàn)的物理接口;
3.PIPE(管道):主機(jī)和endpoint之間的數(shù)據(jù)傳輸是PIPE;
4.方向:端點(diǎn)是有方向的,主機(jī)到從機(jī)成為out端點(diǎn),從機(jī)到主機(jī)成為in端點(diǎn)。
5.管道通信方式:pipe中的數(shù)據(jù)通信方式有兩種,一種是stream一種是message。message要求進(jìn)出進(jìn)出方向必須要求同一個(gè)管道。
6.傳輸方式:USB endpiont有四種類(lèi)型,分別對(duì)應(yīng)了不同的數(shù)據(jù)傳輸方式,分別為control transfers控制傳輸、interrupt transfers中斷傳輸、Bluk Data transfers批量傳輸、Isochronous Data Tranfers等時(shí)傳輸。
控制傳輸:用于配置和管理設(shè)備,包括設(shè)備枚舉、設(shè)置配置和獲取狀態(tài)信息。
中斷傳輸:用于傳輸小量的定時(shí)數(shù)據(jù),如鍵盤(pán)和鼠標(biāo)的輸入。中斷傳輸提供定期的輪詢(xún)機(jī)制,確保數(shù)據(jù)的及時(shí)傳輸。
批量傳輸:用于傳輸大量數(shù)據(jù),如文件傳輸和打印任務(wù)。批量傳輸保證數(shù)據(jù)的完整性和可靠性,但不保證實(shí)時(shí)性。
等時(shí)傳輸:用于實(shí)時(shí)數(shù)據(jù)傳輸,如音頻和視頻流。等時(shí)傳輸保證數(shù)據(jù)的實(shí)時(shí)性和帶寬,但不保證數(shù)據(jù)的完整性。
1.2 描述符
主設(shè)備之所以能區(qū)分不同的從設(shè)備,靠的就是描述符;USB協(xié)議里就規(guī)定了各種不同的USB描述符。
+------設(shè)備描述符
+----------配置描述符1
+----------接口描述符1
+----------端點(diǎn)描述符1
+----------端點(diǎn)描述符2
+....
+----------接口描述符2
+----------端點(diǎn)描述符1
+....
+....
+----------配置描述符2
+----------接口描述符1
+----------端點(diǎn)描述符1
+----------端點(diǎn)描述符2
+....
+....
+....
1.2.1 設(shè)備描述符
設(shè)備描述符:用來(lái)描述該設(shè)備,一個(gè)設(shè)備只有一個(gè)設(shè)備描述符,包含了設(shè)備類(lèi)型、設(shè)備遵循的協(xié)議、廠商ID、產(chǎn)品id、序列號(hào)等。
一個(gè)描述符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 配置描述符
用來(lái)配置設(shè)備,一個(gè)設(shè)備同一時(shí)刻只能有一種配置生效,而且要區(qū)分配置和設(shè)置的區(qū)別。
配置描述符內(nèi)容:
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 接口描述符
一個(gè)interface就代表一個(gè)設(shè)備。USB interface用來(lái)處理一類(lèi) USB 邏輯連接, 例如一個(gè)鼠標(biāo), 一個(gè)鍵盤(pán), 或者一個(gè)音頻流.但一些 USB 設(shè)備有多個(gè)接口。
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 端點(diǎn)描述符
USB通信的基本物理單位,一個(gè)endpiont只能承載一個(gè)方向的數(shù)據(jù)。endpiont分為如下幾種:
CONTROL
控制端點(diǎn)被用來(lái)允許對(duì) USB 設(shè)備的不同部分存取. 通常用作配置設(shè)備, 獲取關(guān)于設(shè)備的信息, 發(fā)送命令到設(shè)備, 或者獲取關(guān)于設(shè)備的狀態(tài)報(bào)告. 這些端點(diǎn)在尺寸上常常較小.每個(gè) USB 設(shè)備有一個(gè)控制端點(diǎn)稱(chēng)為"端點(diǎn) 0", 被 USB CORE用來(lái)在插入時(shí)配置設(shè)備. 這些傳送由 USB 協(xié)議保證來(lái)總有足夠的帶寬使它到達(dá)設(shè)備.
INTERRUPT
中斷端點(diǎn)傳送小量的數(shù)據(jù), 以固定的速率在每次 USB 主請(qǐng)求設(shè)備數(shù)據(jù)時(shí). 這些端點(diǎn)對(duì) USB 鍵盤(pán)和鼠標(biāo)來(lái)說(shuō)是主要的傳送方法. 它們還用來(lái)傳送數(shù)據(jù)到 USB 設(shè)備來(lái)控制設(shè)備, 但通常不用來(lái)傳送大量數(shù)據(jù). 這些傳送由 USB 協(xié)議保證來(lái)總有足夠的帶寬使它到達(dá)設(shè)備.
ISOCHRONOUS
同步端點(diǎn)也傳送大量數(shù)據(jù), 但是這個(gè)數(shù)據(jù)常常不被保證它完成. 這些端點(diǎn)用在可以處理數(shù)據(jù)丟失的設(shè)備中, 并且更多依賴(lài)于保持持續(xù)的數(shù)據(jù)流. 實(shí)時(shí)數(shù)據(jù)收集, 例如音頻和視頻設(shè)備, 一直都使用這些端點(diǎn).
BULK端點(diǎn)描述符數(shù)據(jù)內(nèi)容如下:
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 協(xié)議層
協(xié)議層主要包括:數(shù)據(jù)包類(lèi)型、數(shù)據(jù)包的格式、對(duì)主機(jī)和設(shè)備發(fā)送的數(shù)據(jù)包的預(yù)期響應(yīng)、描述了四種USB 3.0事務(wù)類(lèi)型、支持批量傳輸類(lèi)型的流式傳輸支持、設(shè)備/主機(jī)可能接收/發(fā)送的各種響應(yīng)和數(shù)據(jù)包的定時(shí)參數(shù)。
整個(gè)協(xié)議包的類(lèi)型有:
1.3.2 鏈路層
Link Layer鏈路層主要包括:數(shù)據(jù)包幀、鏈路命令、鏈路管理和流量控制、鏈路錯(cuò)誤規(guī)則/恢復(fù)、重置、鏈路狀態(tài)機(jī)描述;
1.3.3 物理層
定義了高速組件之間互操作性所需的電氣層參數(shù)。
1.4 USB傳輸
USB總線(xiàn)上傳輸數(shù)據(jù)是以包(packet)為基本單位的,必須把不同的包組織成事務(wù)(transaction)才能傳輸數(shù)據(jù)。
USB協(xié)議定義了四種傳輸(transfer)類(lèi)型: 批量傳輸 , 同步傳輸 , 中斷傳輸 , 控制傳輸 .其中,批量傳輸、同步傳輸、中斷傳輸每傳輸一次數(shù)據(jù)都是一個(gè)事務(wù)。
1.4.1 包packet
一個(gè)包被分為不同域,根據(jù)不同類(lèi)型的包,所含的域也是不一樣的。但都要以同步域SYNC開(kāi)始,緊跟一個(gè)包標(biāo)識(shí)符PID,最終以包結(jié)束符EOP來(lái)結(jié)束這個(gè)包。
PID域: PID用來(lái)標(biāo)識(shí)一個(gè)包的類(lèi)型,它共有8位,只使用低四位,高四位取反,用來(lái)校驗(yàn)PID;
PID規(guī)定了四類(lèi)包: 令牌包 、 數(shù)據(jù)包 、 握手包 、 特殊包 . 同類(lèi)的包又各分為具體的四種包:
地址域: 地址共占11位,其中低7位是設(shè)備地址,高4位是端點(diǎn)地址;
幀號(hào)域:幀號(hào)占11位,主機(jī)每發(fā)一幀,幀號(hào)都會(huì)自動(dòng)加1,當(dāng)幀號(hào)達(dá)到0x7FF時(shí),將歸零重新開(kāi)始計(jì)數(shù)。
數(shù)據(jù)域:根據(jù)傳輸類(lèi)型的不同,數(shù)據(jù)域的數(shù)據(jù)長(zhǎng)度從0到1024字節(jié)不等。
CRC域: 計(jì)算地址域和幀號(hào)域的CRC,或數(shù)據(jù)域數(shù)據(jù)的CRC;
1.4.2 包類(lèi)型
令牌包–四種:
OUT: 通知設(shè)備將要輸出一個(gè)數(shù)據(jù)包
IN: 通知設(shè)備返回一個(gè)數(shù)據(jù)包
SETUP: 只用在控制傳輸中,也是通知設(shè)備將要輸出一個(gè)數(shù)據(jù)包,域OUT令牌的區(qū)別是:只使用DATA0數(shù)據(jù)包,且只能發(fā)到device的控制端點(diǎn)
SOF: 在每幀開(kāi)始時(shí)以廣播的形式發(fā)送,針對(duì)USB全速設(shè)備,主機(jī)每1ms產(chǎn)生一個(gè)幀,USB主機(jī)會(huì)對(duì)當(dāng)前幀號(hào)進(jìn)行統(tǒng)計(jì),每次幀開(kāi)始時(shí)通過(guò)SOF包發(fā)送幀號(hào)
數(shù)據(jù)包
數(shù)據(jù)包沒(méi)有地址域和幀號(hào)域,根據(jù)transfer的類(lèi)型不同,數(shù)據(jù)包最大長(zhǎng)度有所不同。
握手包–4種
ACK: 傳輸正確完成
NAK: 設(shè)備暫時(shí)沒(méi)有準(zhǔn)備好接收數(shù)據(jù),或沒(méi)有準(zhǔn)備好發(fā)送數(shù)據(jù)
STALL: 設(shè)備不能用于傳輸
NYET/ERR: 僅用于高速傳輸,設(shè)備沒(méi)有準(zhǔn)備好或出錯(cuò)
握手包僅有PID域:
1.5 傳輸transfer
事務(wù)可以分為三類(lèi):
setup事務(wù): 主機(jī)用來(lái)向設(shè)備發(fā)送控制命令
數(shù)據(jù)輸入事務(wù): 主機(jī)用來(lái)從設(shè)備讀取數(shù)據(jù)
數(shù)據(jù)輸出事務(wù): 主機(jī)用來(lái)向設(shè)備發(fā)送數(shù)據(jù)
1.5.1 批量傳輸
批量傳輸使用批量傳輸事務(wù)(IN傳輸/OUT傳輸),一次批量傳輸事務(wù)分為三個(gè)階段: 令牌包階段、數(shù)據(jù)包階段、握手包階段
描述:
1.令牌階段: 主機(jī)發(fā)送BULK令牌包,令牌包中包含設(shè)備地址、端點(diǎn)號(hào)、數(shù)據(jù)方向
2.數(shù)據(jù)包階段:
從機(jī)如果接收令牌包出錯(cuò),無(wú)響應(yīng),讓主機(jī)等待超時(shí)
從機(jī)端點(diǎn)不存在,回送STALL
從機(jī)端點(diǎn)數(shù)據(jù)未準(zhǔn)備好,回送NAK
從機(jī)數(shù)據(jù)準(zhǔn)備好,回送數(shù)據(jù)包
3.握手包階段:數(shù)據(jù)包正確,并有足夠的空間保留數(shù)據(jù),設(shè)備返回ACK握手包括:NYET握手包(只有高速模式才有NYET握手包,表示本次數(shù)據(jù)接收成功,但沒(méi)有能力接收下一次傳輸)
數(shù)據(jù)包正確,但沒(méi)有足夠的空間保存數(shù)據(jù),設(shè)備返回NAK握手包。主機(jī)收到NAK后,延時(shí)一段時(shí)間后,再重新進(jìn)行批量輸出事務(wù)
數(shù)據(jù)包正確,但端點(diǎn)處于掛起狀態(tài);設(shè)備返回一個(gè)STALL握手包
數(shù)據(jù)包錯(cuò)誤,設(shè)備不返回任何握手包,讓主機(jī)等待超時(shí)
CRC錯(cuò)誤或位填充錯(cuò)誤: 設(shè)備不返回任何握手包,讓主機(jī)等待超時(shí);
1.5.2 中斷傳輸
中斷傳輸一般用于小批量的和非連續(xù)的數(shù)據(jù)傳輸,但實(shí)時(shí)性高的場(chǎng)合,主要應(yīng)用于人機(jī)交互設(shè)備(HID)的鼠標(biāo)和鍵盤(pán)。
1.5.3 同步傳輸
同步傳輸是不可靠的傳輸,只關(guān)心數(shù)據(jù)的實(shí)時(shí)性,不關(guān)心數(shù)據(jù)的正確性,它沒(méi)有握手包,也不支持PID翻轉(zhuǎn)。主機(jī)在排定事務(wù)傳輸時(shí),同步傳輸有最高優(yōu)先級(jí).應(yīng)用在數(shù)據(jù)量大,對(duì)實(shí)時(shí)性要求較高的場(chǎng)合,如視頻設(shè)備,音頻設(shè)備;
同步傳輸包含兩個(gè)階段: 令牌階段、數(shù)據(jù)階段:
1.5.4 控制傳輸
控制傳輸是一種特殊的傳輸方式。當(dāng)USB設(shè)備初次連接主機(jī)時(shí),用控制傳輸傳送控制命令等對(duì)設(shè)備進(jìn)行配置。同時(shí)設(shè)備接入主機(jī)時(shí),需要通過(guò)控制傳輸去獲取USB設(shè)備的描述符以及 對(duì)設(shè)備進(jìn)行識(shí)別,在設(shè)備的枚舉過(guò)程中都是使用控制傳輸進(jìn)行數(shù)據(jù)交換。
控制傳輸分為三個(gè)階段:
建立過(guò)程:
主機(jī)發(fā)送令牌包: SETUP
主機(jī)發(fā)送數(shù)據(jù)包: DATA0
設(shè)備返回握手包: ACK或不應(yīng)答
2.數(shù)據(jù)過(guò)程(可選): 一個(gè)數(shù)據(jù)過(guò)程可以不包含或包含多個(gè)數(shù)據(jù)事務(wù),但所有數(shù)據(jù)事務(wù)必須是同一方向的。若數(shù)據(jù)方向發(fā)生了改變則認(rèn)為進(jìn)入了狀態(tài)過(guò)程. 數(shù)據(jù)過(guò)程中的第一個(gè)數(shù)據(jù)包必須是DATA1,然后 每次正確傳輸一個(gè)數(shù)據(jù)包后就在DATA0和DATA1之間交替;
3.狀態(tài)過(guò)程: 狀態(tài)過(guò)程只使用DATA1包,并且傳輸方向與數(shù)據(jù)方向相反。
2 USB1.1 示例
此Demo只展示創(chuàng)建一個(gè)簡(jiǎn)單的 USB 設(shè)備模塊,該模塊能夠響應(yīng)主機(jī)的請(qǐng)求,并發(fā)送和接收數(shù)據(jù);實(shí)現(xiàn)最基本的控制傳輸功能。
module usb_device (
input wire clk, // 時(shí)鐘信號(hào)
input wire reset_n, // 復(fù)位信號(hào),低電平有效
input wire usb_dp, // USB D+ 信號(hào)
input wire usb_dm, // USB D- 信號(hào)
output reg usb_dp_out, // USB D+ 輸出
output reg usb_dm_out, // USB D- 輸出
output reg [7:0] data_out, // 發(fā)送到主機(jī)的數(shù)據(jù)
input wire [7:0] data_in, // 從主機(jī)接收的數(shù)據(jù)
output reg data_valid, // 數(shù)據(jù)有效信號(hào)
output reg data_ready // 數(shù)據(jù)準(zhǔn)備好信號(hào)
);
// 內(nèi)部狀態(tài)機(jī)狀態(tài)
typedef enum logic [2:0] {
IDLE,
SYNC,
TOKEN,
DATA,
HANDSHAKE
} state_t;
state_t state, next_state;
// 內(nèi)部寄存器
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
// 接收數(shù)據(jù)
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
// 發(fā)送數(shù)據(jù)
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
// 發(fā)送握手包
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
// 時(shí)序邏輯部分
always_ff @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
state <= IDLE;
end else begin
state <= next_state;
end
end
endmodule
相關(guān)資訊
- 2025-03-21
- 2025-03-20
- 2025-03-19
網(wǎng)絡(luò)視頻監(jiān)控常見(jiàn)的存儲(chǔ)方式
2025-03-18- 2025-03-17
- 2025-03-14