USB端点描述符bInterval的时间周期解释
2021-10-22
7087
22
USB 端点描述符用于描述主机查询端点的时间间隔,这个值根据USB的版本和端点的类型而不同。
中断传输 | 同步传输 | 控制传输 | 批量传输 | |
---|---|---|---|---|
低速 | 1-255,单位为ms | / | / | / |
全速 | 1-255,单位为ms | 1-16,2^(N-1)个周期单位 | / | / |
高速 | 1-16,2^(N-1)个周期单位 | 1-16 ,2^(N-1)个周期单位 | 解释1 | 解释1 |
超高速 | 125us为单位 | 1-16,2^(N-1)个周期单位 | 未用 | 未用 |
- 解释1:对于高速批量/控制输出端点,bInterval必须指定端点的最大NAK频率。值0表示端点永不NAK。其它值表示每个微帧的bInterval*125us时间最多1个NAK。这个值的范围必须在0到255之间;
周期其单位表示多少个周期单位同步传输一次数据。如:
bInterval | 轮询周期2^(N-1) |
---|---|
1 | 1; 每个总线间隔传输数据。 |
2 | 2; 数据每隔一个总线间隔传输一次。 |
3 | 4; 每四个总线间隔传输一次数据。 |
4 | 8; 每八个总线间隔传输一次数据。 |
- 对于全速,总线间隔是一帧。一帧的长度是 1 毫秒。
- 对于高速和超高速,总线间隔是一个微帧。微帧的长度是 125 微秒。八个连续的微帧构成一个高速或超高速帧。
高速端点的同步数据传输
如对于一个高速端点,它的端点特性为:
- wMaxPacketSize是 1024。
- 位 12..11 为01表示两个额外的事务。
- bInterval为1。
选择配置后,同步管道的MaximumPacketSize为1024*(2+1)=3072个字节(2个额外的事务),所以这样USB设备端可以在每个微帧中传输3072个字节,一帧(8个微帧)中传输3072*8=24576个字节。
下图显示了不同的bInterval配置在高速同步传输中的数据传输频率。每个方格代表一个微帧
超高速端点的同步数据传输
对于一个超高速端点,它的端点特性为:
- wMaxPacketSize是 1024。
- bMaxBurst 是15
- bInterval为1
- Isochronous.Mult是2
- wBytesPerInterval是45000
所以其最大字节数可以计算为wMaxPacketSize * ( bMaxBurst +1) * ( Mult + 1) =49152。
设备将该值限制为 45000 字节的wBytesPerInterval值。该值表示在MaximumPacketSize 45000 中。客户端驱动程序只能使用MaximumPacketSize值。在这个例子中,请求可以分为三个突发事务。前两个突发事务各包含 16 个wMaxPacketSize块. 最后一个突发事务包含 12 个块来保存剩余的字节。此图显示了通过超高速传输的同步数据包传输的轮询间隔和字节。
1024*(16+16+12)=45056,所以第三个突发传输的第12事务,数据为1024-56=968个字节。
关于高速设备控制传输、批量传输中的bInterval
在高速设备控制传输、批量传输的bInterval表示端点的最大NAK频率。
这里我们首先回顾一下NAK握手包的用法:
- NAK握手包由设备端发出,主机接收
- 对于输入数据传输,表示设备没有数据或者没有计划向主机发送数据。
- 对于输出数据传输,表示设备无法接收来自主机的数据。
从以上NAK的用法来看:
- 设备是无法收发数据,由设备主动通知主机的定时机制。
- 对于控制传输,一般一次控制一次数据的传输,这个NAK好像没有什么意义。因为即使设备没有数据或无法接收数据时,也会对控制传输NAK掉。
- 对于BULK传输,这里的bInterval有一定的意义。由于批量传输支持突发即burst传输,所以在进行大批量数据传输时,可以不必每次传输都ACK,而这里的NAK表示数据无法接收或无数据发送了,可以早点知道传输结束或无法继续接收数据。这样就大大提高了数据的发送效率。
如我们手中一个硬盘,其输入输出端点如下:
----------------- Endpoint Descriptor -----------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x02 (Direction=OUT EndpointID=2)
bmAttributes : 0x02 (TransferType=Bulk)
wMaxPacketSize : 0x0200 (max 512 bytes)
bInterval : 0x00 (never NAKs)
Data (HexDump) : 07 05 02 02 00 02 00
----------------- Endpoint Descriptor -----------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x83 (Direction=IN EndpointID=3)
bmAttributes : 0x02 (TransferType=Bulk)
wMaxPacketSize : 0x0200 (max 512 bytes)
bInterval : 0x00 (never NAKs)
Data (HexDump) : 07 05 83 02 00 02 00 .......
这里都是永不NAK。
所以本人这里对于bInterval的NAK的理解是,这东西有没啥用,而且还费带宽。因为这会和高速设备中的PING机制重复。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936