深圳市凯茉锐电子科技有限公司深圳市凯茉锐电子科技有限公司

新闻中心

News

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事务类型、支持批量传输类型的流式传输支持、设备/主机可能接收/发送的各种响应和数据包的定时参数。
整个协议包的类型有:

640.webp.png

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


相关资讯

专业工程师

24小时在线服务提交需求快速为您定制解决方案

13798538021