USB基础 -- USB相关协议字段解析
USB 协议的字段。按 物理层包结构 → 协议层 Token/Data/Handshake 包 → 描述符字段 → 状态机相关字段 的顺序展开。
1. 物理层与基础包格式字段
在 USB 1.1/2.0 中,所有包的传输都遵循相同的低层结构,主要字段包括:
字段 | 长度 | 作用 |
---|---|---|
SYNC | 8 位(FS/LS),32 位(HS) | 用于接收端时钟恢复与包起始同步 |
PID | 8 位 | Packet Identifier,标识包类型(高 4 位 = PID 类型,低 4 位为高 4 位的反码) |
PAYLOAD | 可变 | 数据或地址等内容 |
CRC | 5 位(Token 包),16 位(Data 包) | 循环冗余校验,用于检测错误 |
EOP | SE0(Single-Ended Zero)+ J | 包结束信号 |
2. 协议层包类型字段
USB 协议分为 Token 包、Data 包、Handshake 包、Special 包,每种包的字段定义不同。
2.1 Token 包(IN、OUT、SETUP)
+---------+-------------------+--------+------+
| PID(8) | ADDR(7) + ENDP(4) | CRC5(5)| EOP |
+---------+-------------------+--------+------+
- PID:区分是 IN/OUT/SETUP/SOF。
- ADDR:设备地址(0~127)。
- ENDP:端点号(0~15)。
- CRC5:对 ADDR+ENDP 做 CRC5 校验。
2.2 Data 包(DATA0、DATA1、DATA2、MDATA)
+---------+------------+---------+------+
| PID(8) | Data(0~n) | CRC16(16) | EOP |
+---------+------------+---------+------+
- PID:标识数据包类型(DATA0/1/2/MDATA)。
- Data:负载数据,长度受 MaxPacketSize 限制。
- CRC16:覆盖 Data 部分。
2.3 Handshake 包(ACK、NAK、STALL、NYET)
+---------+------+
| PID(8) | EOP |
+---------+------+
- ACK:确认收到数据。
- NAK:暂时无数据或不可接收。
- STALL:功能错误,需要主机重新配置。
- NYET(HS 专用):表示已部分接收但未准备好下一包。
2.4 Special 包
- SOF(Start of Frame):同步帧,包含帧号字段。
- PING:高速设备确认是否可以发送数据。
- SPLIT:用于分割传输(USB Hub HS→FS/LS)。
3. 描述符(Descriptors)字段
USB 枚举时,设备通过 标准描述符 向主机报告自身能力,每个描述符都有固定字段结构:
3.1 设备描述符(Device Descriptor)
字段 | 长度 | 含义 |
---|---|---|
bLength | 1 | 描述符长度(固定 18) |
bDescriptorType | 1 | 类型(0x01 表示 Device) |
bcdUSB | 2 | USB 版本(如 0x0200 = USB2.0) |
bDeviceClass/SubClass/Protocol | 各 1 | 设备类、子类、协议 |
bMaxPacketSize0 | 1 | 端点 0 最大包长(8/16/32/64) |
idVendor / idProduct | 各 2 | VID/PID |
bcdDevice | 2 | 设备版本号 |
iManufacturer / iProduct / iSerialNumber | 各 1 | 字符串描述符索引 |
bNumConfigurations | 1 | 支持的配置数量 |
3.2 配置描述符(Configuration Descriptor)
字段 | 长度 | 含义 |
---|---|---|
bLength | 1 | 固定 9 |
bDescriptorType | 1 | 0x02 表示 Configuration |
wTotalLength | 2 | 此配置下所有描述符总长度 |
bNumInterfaces | 1 | 接口数量 |
bConfigurationValue | 1 | 配置编号 |
iConfiguration | 1 | 配置名称字符串索引 |
bmAttributes | 1 | 电源特性(位 6=自供电,位 5=远程唤醒) |
bMaxPower | 1 | 最大功耗(单位 2mA) |
3.3 接口描述符(Interface Descriptor)
字段 | 长度 | 含义 |
---|---|---|
bLength | 1 | 固定 9 |
bDescriptorType | 1 | 0x04 表示 Interface |
bInterfaceNumber | 1 | 接口编号 |
bAlternateSetting | 1 | 备用设置编号 |
bNumEndpoints | 1 | 此接口端点数量 |
bInterfaceClass/SubClass/Protocol | 各 1 | 接口类信息 |
iInterface | 1 | 接口字符串索引 |
3.4 端点描述符(Endpoint Descriptor)
字段 | 长度 | 含义 |
---|---|---|
bLength | 1 | 固定 7 |
bDescriptorType | 1 | 0x05 表示 Endpoint |
bEndpointAddress | 1 | 位7方向(0=OUT,1=IN),位0-3端点号 |
bmAttributes | 1 | 传输类型(0=Control,1=Iso,2=Bulk,3=Interrupt) |
wMaxPacketSize | 2 | 最大包长(含额外事务数) |
bInterval | 1 | 轮询间隔(ms) |
4. 状态机相关字段
- Device Address:由
SET_ADDRESS
请求设置(0~127)。 - Data Toggle:DATA0/DATA1 交替标志,保证数据顺序。
- Frame Number:SOF 帧号(11 位),同步等时传输。
- Configuration Value:当前选择的配置(来自
SET_CONFIGURATION
)。 - Interface Setting:接口的备用设置值(Alternate Setting)。
5. 高速与特殊字段
-
bInterval(HS 下等时端点):以微帧为单位(125μs)。
-
NYET:高速 Bulk/Control OUT 事务的延迟应答。
-
SPLIT 包字段:
- HubAddr、Port、Start/Complete 标志
- 传输方向、速度、数据量等。