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-08-01
- 2025-07-31
- 2025-07-30
- 2025-07-29
- 2025-07-28
- 2025-07-25