一、USB2.0
1、意义
1.易用(热插拔、即插即用)
2.易扩充(USBHub可同时操作127个设备、兼容USB1.1)
3.高速(相对)
2、分类(按传输速率)
1.USB2.0 LowSpeed(1.5Mbps,适用于交互设备)
2.USB2.0 FullSpeed(12Mbps,适用于电话、音频)
3.USB2.0 HighSpeed(480Mbps,适用于海量存储、视频)
备注:USB2.0 是取代 USB1.1 的,而 USB3.0 是 USB2.0 的补充协议b.如果Hub支持2.0规范,则将上电设备的状态置为SE0
c.如果设备是高速设备则会往D-线反向灌17.78mA的电流,在D-上形成一个800mV的电平(设备此时整体阻抗约45欧姆),称为Chirp K信号
d.Hub如果支持高速设备,则通过交替向D+和D-线灌17.78mA电流的方式,形成3对维持60us左右的ChirpJ与Chirp K信号对,表明自己支持高速设备
e.此时设备与Hub交换速率信息过程完毕。如果满足设备与Hub都是高速的条件,设备将在500us之内通过调节自身阻抗使系统整体阻抗降低到22.5欧姆
f.设备恢复到J状态,此时由于整体阻抗的变化,D+信号线上的电平已经变成了400mV,系统进入高速通信状态
六 、USB2.0传输协议
注:此后提到“包”这个概念的时候,将不再包括SYNC和EOP
类型 | 子类型 | PID值 | 描述 |
Token | OUT | 0001 | Out事务开始 |
IN | 1001 | In事务开始 | |
SOF | 0101 | 帧事务开始 | |
SETUP | 1101 | 建立事务开始 | |
Data | DATA0 | 0011 | 偶同步位数据包 |
DATA1 | 1011 | 奇同步位数据包(两者总是交错的) | |
DATA2* | 0111 | 用于高速设备微帧同步传输的数据包,MDATA为切分后的数据包 | |
MDATA* | 1111 | ||
Handshake | ACK | 0010 | 确认包 |
NAK | 1010 | 不确认,不能发送或不能接收 | |
STALL | 1110 | 端点挂起,或一个请求不被支持 | |
NYET* | 0110 | 设备接收无响应(实际已确认) | |
Special | PRE | 1100 | 仅用于低速,启动低速设备数据传输 |
ERR* | 1100 | 以高速总线传送全速或低速事务时切分事务出错的握手 | |
SPLIT* | 1000 | 以高速总线传送全速或低速事务时切分事务 | |
PING* | 0100 | 主机询问设备是否有空间接收数据 |
4、包格式
注:此讲义在此后将忽略PING事务,在高速USB传输中,OUT事务前一搬都会有不间断的PING事务,直到PING事务以ACK握手,OUT事务才产生
偏移 | 字段 | 长度 | 值类型 | 作用 |
0 | bmRequestType | 1 | 位图 | 请求特征(方向、种类、对象) |
1 | bRequest | 1 | 值 | 具体请求 |
2 | wValue | 2 | 值 | 值型参数 |
4 | wIndex | 2 | 索引 | 索引或偏移型参数 |
6 | wLength | 2 | 值 | 数据阶段长度 |
功能 | bmRequestType | bRequest | wValue | wIndex | wLength | 数据要求 |
分配地址 | 00H | 05H | 地址 | 0 | 0 | 无 |
获取设备描述符 | 80H | 06H | 01H | 0 | 描述符长度 | IN,设备描述符 |
获取配置描述符 | 80H | 06H | 02H | 0 | 描述符长度 | IN,配置描述符+接口描述符+端点描述符(可选) |
获取字符串描述符 | 80H | 06H | 03H | 指定的字符串索引 | 字符串描述符长度 | IN,指定的字符串描述符 |
配置设备 | 00H | 09H | 配置值 | 0 | 0 | 无 |
设置设备特性 | 00H | 03H | 特性值 | 0 | 0 | 无 |
设置接口特性 | 01H | 03H | 特性值 | 接口号 | 0 | 无 |
设置端点特性 | 02H | 03H | 特性值 | 端点号 | 0 | 无 |
偏移 | 字段 | 长度 | 类型 | 描述 |
0 | bLengh | 1 | 常量 | 描述符自身的长度(12H) |
1 | bDescriptorType | 1 | 常量 | 描述符类型(01H) |
2 | bcdUSB | 2 | BCD码 | USB版本号(USB2.0取{00H,02H}) |
4 | bDeviceClass | 1 | 值 | 00H:接口指定 01H~FEH:标准定义的设备类型 FFH:厂商自定义设备类型 |
5 | bDeviceSubClass | 1 | 值 | 若设备类型为0,则此字段必须为0 |
6 | bDevicePortocol | 1 | 值 | 00H:接口指定 01H~FEH:标准定义的协议 FFH:厂商自定义协议 |
7 | bMaxPacketSize0 | 1 | 值 | 缺省通道最大包长,即端点0最大包长(8、16、32、64) |
8 | idVendor | 2 | BCD码 | VID(合法VID值必须由USB-IF授权) |
10 | idProduct | 2 | BCD码 | PID(厂商自订) |
12 | bcdDevice | 2 | BCD码 | 设备发型号 |
14 | iManufacturer | 1 | 索引 | 描述厂商信息的字符串描述符索引 |
15 | iProduct | 1 | 索引 | 描述产品信息的字符串描述符索引 |
16 | iSerialNumber | 1 | 索引 | 产品序列号字符串描述符索引 |
17 | bNumConfigurations | 1 | 值 | 可能拥有的配置描述符数量 |
偏移 | 字段 | 长度 | 类型 | 描述 |
0 | bLengh | 1 | 常量 | 描述符自身的长度(09H) |
1 | bDescriptorType | 1 | 常量 | 描述符类型(02H) |
2 | wTotalLength | 2 | 值 | 配置信息总长度(包括配置、接口、端点、类描述符) |
4 | bNumberInterface | 1 | 值 | 此配置支持的接口个数 |
5 | bConfigurationValue | 1 | 值 | 与设备配置请求中选定该配置的值相同 |
6 | iConfiguration | 1 | 索引 | 描述该配置的字符串描述符索引 |
7 | bmAttributes | 1 | 位图 | 配置特性: 可配置在此配置下的设备是否为自供电;是否可远程唤醒主机 |
8 | MaxPower | 1 | 值 | 该值乘以2的结果为在此配置下设备的耗电量。 |
偏移 | 字段 | 长度 | 类型 | 描述 |
0 | bLengh | 1 | 常量 | 描述符自身的长度(09H) |
1 | bDescriptorType | 1 | 常量 | 描述符类型(04H) |
2 | iInterfaceNumber | 1 | 索引 | 该接口在该配置中的索引(该配置中的第一个接口该值为0,该配置中的第二个接口该值为1…) |
3 | iAlternateSetting | 1 | 索引 | 当前接口所使用的设置索引(当前接口若使用第一种设置该值为0;第二种设置该值为1…) |
4 | bNumberEndpoints | 1 | 值 | 该接口所使用的非零端点数量 |
5 | bInterfaceClass | 1 | 值 | 该接口的类型 0:保留 1~254:USB定义的接口类型(8:MassStrorage、3:HID) 255:厂商自定义 |
6 | bInterfaceSubClass | 1 | 值 | 子类型 该值在不同的bInterfaceClass中有不同定义(6:SCSI、4:UFI) |
7 | bInterfaceProtocol | 1 | 值 | 协议类型,该值在不同的bInterfaceClass中有不同定义(50H:Bulk Only、0:CBI) |
8 | iInterface | 1 | 索引 | 描述此接口的字符串描述符索引值 |
偏移 | 字段 | 长度 | 类型 | 描述 |
0 | bLengh | 1 | 常量 | 描述符自身的长度(07H) |
1 | bDescriptorType | 1 | 常量 | 描述符类型(05H) |
2 | bmEndpointAddr | 1 | 位图 | Bit3~0:端点号(0~15) Bit6~4:保留(0) Bit7:方向(控制传输类型的端点此处忽略) Out:0 In:1 |
3 | bmAttributes | 1 | 位图 | Bit0、1表示传输类型: 00=控制传输 01=同步传输 10=批量传输 11=中断传输 其他位全保留 |
4 | wMaxPacketSize | 2 | 值 | 对于中断、控制、批量传输,该字段表述该端点下传输的最大数据包的大小; 对于同步传输该字段为每次传输的数据净负荷预留时间 |
6 | bInterval | 1 | 值 | 中断、同步传输:两次请求包的帧数间隔,同步必须为1,中断可取1~255 控制、批量传输:忽略 |
偏移 | 字段 | 长度 | 类型 | 描述 |
0 | bLengh | 1 | 值 | 描述符自身的长度(2x + 2, x为支持的语言数) |
1 | bDescriptorType | 1 | 常量 | 描述符类型(03H) |
2 | wLANGID[0] | 2 | 值 | 语言ID |
4 | wLANGID[1] | 2 | 值 | 语言ID |
6 | … | … | … | … |
2x+ 2 | wLANGID[x] | 2 | 值 | 语言ID |