最新三级片网站_久久成人a毛片免费观看网站_在线观看欧美精品_国产精选在线视频

深圳市凱茉銳電子科技有限公司深圳市凱茉銳電子科技有限公司

新聞中心

News

USB協(xié)議簡介

來源:深圳市凱茉銳電子科技有限公司2025-02-17

USB–Universal Serial Bus即通用串行總線,簡化了計算機與外圍設備的連接;

1 USB概念

 

主機host: 主機是 USB 系統(tǒng)的控制中心,通常是一個計算機或其他設備,負責管理和協(xié)調所有 USB 設備的通信。

 

 

Hub: 集線器用于擴展 USB 系統(tǒng),允許多個設備連接到同一個主機。

 

 

設備device:設備是連接到 USB 系統(tǒng)的終端設備,如鍵盤、鼠標、打印機、存儲設備等。

 

 

端點endpoint:端點是設備上的一個邏輯實體,用于與主機進行數(shù)據(jù)傳輸。每個設備可以有多個端點,每個端點都有唯一的地址。

 

 

管道Pipe: 管道是主機和設備端點之間的通信路徑。每個管道都有特定的傳輸類型和屬性。

 

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編碼,增加一對超高速差分線 傳輸速率最大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之間的數(shù)據(jù)傳輸是PIPE;
4.方向:端點是有方向的,主機到從機成為out端點,從機到主機成為in端點。
5.管道通信方式:pipe中的數(shù)據(jù)通信方式有兩種,一種是stream一種是message。message要求進出進出方向必須要求同一個管道。
6.傳輸方式:USB endpiont有四種類型,分別對應了不同的數(shù)據(jù)傳輸方式,分別為control transfers控制傳輸、interrupt transfers中斷傳輸、Bluk Data transfers批量傳輸、Isochronous Data Tranfers等時傳輸。

 

控制傳輸:用于配置和管理設備,包括設備枚舉、設置配置和獲取狀態(tài)信息。

 

 

中斷傳輸:用于傳輸小量的定時數(shù)據(jù),如鍵盤和鼠標的輸入。中斷傳輸提供定期的輪詢機制,確保數(shù)據(jù)的及時傳輸。

 

 

批量傳輸:用于傳輸大量數(shù)據(jù),如文件傳輸和打印任務。批量傳輸保證數(shù)據(jù)的完整性和可靠性,但不保證實時性。

 

 

等時傳輸:用于實時數(shù)據(jù)傳輸,如音頻和視頻流。等時傳輸保證數(shù)據(jù)的實時性和帶寬,但不保證數(shù)據(jù)的完整性。

 

1.2 描述符

主設備之所以能區(qū)分不同的從設備,靠的就是描述符;USB協(xié)議里就規(guī)定了各種不同的USB描述符。

+------設備描述符
        +----------配置描述符1
            +----------接口描述符1
                +----------端點描述符1
                +----------端點描述符2
                +....
            +----------接口描述符2
                +----------端點描述符1
                +....
            +....
        +----------配置描述符2
            +----------接口描述符1
                +----------端點描述符1
                +----------端點描述符2
                +....
            +....
        +....

1.2.1 設備描述符

設備描述符:用來描述該設備,一個設備只有一個設備描述符,包含了設備類型、設備遵循的協(xié)議、廠商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 配置描述符

用來配置設備,一個設備同一時刻只能有一種配置生效,而且要區(qū)分配置和設置的區(qū)別。
配置描述符內容:

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只能承載一個方向的數(shù)據(jù)。endpiont分為如下幾種:

 

CONTROL
控制端點被用來允許對 USB 設備的不同部分存取. 通常用作配置設備, 獲取關于設備的信息, 發(fā)送命令到設備, 或者獲取關于設備的狀態(tài)報告. 這些端點在尺寸上常常較小.每個 USB 設備有一個控制端點稱為"端點 0", 被 USB CORE用來在插入時配置設備. 這些傳送由 USB 協(xié)議保證來總有足夠的帶寬使它到達設備.

 

 

INTERRUPT
中斷端點傳送小量的數(shù)據(jù), 以固定的速率在每次 USB 主請求設備數(shù)據(jù)時. 這些端點對 USB 鍵盤和鼠標來說是主要的傳送方法. 它們還用來傳送數(shù)據(jù)到 USB 設備來控制設備, 但通常不用來傳送大量數(shù)據(jù). 這些傳送由 USB 協(xié)議保證來總有足夠的帶寬使它到達設備.

 

 

ISOCHRONOUS
同步端點也傳送大量數(shù)據(jù), 但是這個數(shù)據(jù)常常不被保證它完成. 這些端點用在可以處理數(shù)據(jù)丟失的設備中, 并且更多依賴于保持持續(xù)的數(shù)據(jù)流. 實時數(shù)據(jù)收集, 例如音頻和視頻設備, 一直都使用這些端點.

 

BULK端點描述符數(shù)據(jù)內容如下:

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ù)包類型、數(shù)據(jù)包的格式、對主機和設備發(fā)送的數(shù)據(jù)包的預期響應、描述了四種USB 3.0事務類型、支持批量傳輸類型的流式傳輸支持、設備/主機可能接收/發(fā)送的各種響應和數(shù)據(jù)包的定時參數(shù)。
整個協(xié)議包的類型有:

640.webp.png

1.3.2 鏈路層

Link Layer鏈路層主要包括:數(shù)據(jù)包幀、鏈路命令、鏈路管理和流量控制、鏈路錯誤規(guī)則/恢復、重置、鏈路狀態(tài)機描述;

1.3.3 物理層

定義了高速組件之間互操作性所需的電氣層參數(shù)。

1.4 USB傳輸

USB總線上傳輸數(shù)據(jù)是以包(packet)為基本單位的,必須把不同的包組織成事務(transaction)才能傳輸數(shù)據(jù)。
USB協(xié)議定義了四種傳輸(transfer)類型: 批量傳輸 , 同步傳輸 , 中斷傳輸 , 控制傳輸 .其中,批量傳輸、同步傳輸、中斷傳輸每傳輸一次數(shù)據(jù)都是一個事務。

1.4.1 包packet

一個包被分為不同域,根據(jù)不同類型的包,所含的域也是不一樣的。但都要以同步域SYNC開始,緊跟一個包標識符PID,最終以包結束符EOP來結束這個包。

PID域: PID用來標識一個包的類型,它共有8位,只使用低四位,高四位取反,用來校驗PID;
PID規(guī)定了四類包: 令牌包 、 數(shù)據(jù)包 、 握手包 、 特殊包 . 同類的包又各分為具體的四種包:

地址域: 地址共占11位,其中低7位是設備地址,高4位是端點地址;

 

幀號域:幀號占11位,主機每發(fā)一幀,幀號都會自動加1,當幀號達到0x7FF時,將歸零重新開始計數(shù)。

 

 

數(shù)據(jù)域:根據(jù)傳輸類型的不同,數(shù)據(jù)域的數(shù)據(jù)長度從0到1024字節(jié)不等。

 

CRC域: 計算地址域和幀號域的CRC,或數(shù)據(jù)域數(shù)據(jù)的CRC;

1.4.2 包類型

 

令牌包–四種:
OUT: 通知設備將要輸出一個數(shù)據(jù)包
IN: 通知設備返回一個數(shù)據(jù)包
SETUP: 只用在控制傳輸中,也是通知設備將要輸出一個數(shù)據(jù)包,域OUT令牌的區(qū)別是:只使用DATA0數(shù)據(jù)包,且只能發(fā)到device的控制端點
SOF: 在每幀開始時以廣播的形式發(fā)送,針對USB全速設備,主機每1ms產生一個幀,USB主機會對當前幀號進行統(tǒng)計,每次幀開始時通過SOF包發(fā)送幀號

 

數(shù)據(jù)包
數(shù)據(jù)包沒有地址域和幀號域,根據(jù)transfer的類型不同,數(shù)據(jù)包最大長度有所不同。

 

握手包–4種
ACK: 傳輸正確完成
NAK: 設備暫時沒有準備好接收數(shù)據(jù),或沒有準備好發(fā)送數(shù)據(jù)
STALL: 設備不能用于傳輸
NYET/ERR: 僅用于高速傳輸,設備沒有準備好或出錯

 

握手包僅有PID域:

1.5 傳輸transfer

事務可以分為三類:

 

setup事務: 主機用來向設備發(fā)送控制命令

 

 

數(shù)據(jù)輸入事務: 主機用來從設備讀取數(shù)據(jù)

 

 

數(shù)據(jù)輸出事務: 主機用來向設備發(fā)送數(shù)據(jù)

 

1.5.1 批量傳輸

批量傳輸使用批量傳輸事務(IN傳輸/OUT傳輸),一次批量傳輸事務分為三個階段: 令牌包階段、數(shù)據(jù)包階段、握手包階段

描述:
1.令牌階段: 主機發(fā)送BULK令牌包,令牌包中包含設備地址、端點號、數(shù)據(jù)方向
2.數(shù)據(jù)包階段:
從機如果接收令牌包出錯,無響應,讓主機等待超時
從機端點不存在,回送STALL
從機端點數(shù)據(jù)未準備好,回送NAK
從機數(shù)據(jù)準備好,回送數(shù)據(jù)包

3.握手包階段:數(shù)據(jù)包正確,并有足夠的空間保留數(shù)據(jù),設備返回ACK握手包括:NYET握手包(只有高速模式才有NYET握手包,表示本次數(shù)據(jù)接收成功,但沒有能力接收下一次傳輸)
    數(shù)據(jù)包正確,但沒有足夠的空間保存數(shù)據(jù),設備返回NAK握手包。主機收到NAK后,延時一段時間后,再重新進行批量輸出事務
    數(shù)據(jù)包正確,但端點處于掛起狀態(tài);設備返回一個STALL握手包
    數(shù)據(jù)包錯誤,設備不返回任何握手包,讓主機等待超時

    CRC錯誤或位填充錯誤: 設備不返回任何握手包,讓主機等待超時;

1.5.2 中斷傳輸

    中斷傳輸一般用于小批量的和非連續(xù)的數(shù)據(jù)傳輸,但實時性高的場合,主要應用于人機交互設備(HID)的鼠標和鍵盤。

1.5.3 同步傳輸

    同步傳輸是不可靠的傳輸,只關心數(shù)據(jù)的實時性,不關心數(shù)據(jù)的正確性,它沒有握手包,也不支持PID翻轉。主機在排定事務傳輸時,同步傳輸有最高優(yōu)先級.應用在數(shù)據(jù)量大,對實時性要求較高的場合,如視頻設備,音頻設備;

同步傳輸包含兩個階段: 令牌階段、數(shù)據(jù)階段:

1.5.4 控制傳輸

    控制傳輸是一種特殊的傳輸方式。當USB設備初次連接主機時,用控制傳輸傳送控制命令等對設備進行配置。同時設備接入主機時,需要通過控制傳輸去獲取USB設備的描述符以及 對設備進行識別,在設備的枚舉過程中都是使用控制傳輸進行數(shù)據(jù)交換。

控制傳輸分為三個階段:

建立過程:

主機發(fā)送令牌包: SETUP

主機發(fā)送數(shù)據(jù)包: DATA0

設備返回握手包: ACK或不應答

2.數(shù)據(jù)過程(可選): 一個數(shù)據(jù)過程可以不包含或包含多個數(shù)據(jù)事務,但所有數(shù)據(jù)事務必須是同一方向的。若數(shù)據(jù)方向發(fā)生了改變則認為進入了狀態(tài)過程. 數(shù)據(jù)過程中的第一個數(shù)據(jù)包必須是DATA1,然后 每次正確傳輸一個數(shù)據(jù)包后就在DATA0和DATA1之間交替;

            3.狀態(tài)過程: 狀態(tài)過程只使用DATA1包,并且傳輸方向與數(shù)據(jù)方向相反。

2 USB1.1 示例
    此Demo只展示創(chuàng)建一個簡單的 USB 設備模塊,該模塊能夠響應主機的請求,并發(fā)送和接收數(shù)據(jù);實現(xiàn)最基本的控制傳輸功能。

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, // 發(fā)送到主機的數(shù)據(jù)
input wire [7:0] data_in, // 從主機接收的數(shù)據(jù)
output reg data_valid, // 數(shù)據(jù)有效信號
output reg data_ready // 數(shù)據(jù)準備好信號
);

// 內部狀態(tài)機狀態(tài)
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
// 接收數(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

// 時序邏輯部分
always_ff @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
state <= IDLE;
end else begin
state <= next_state;
end
end

endmodule


相關資訊

專業(yè)工程師

24小時在線服務提交需求快速為您定制解決方案

13798538021