USB传输模式
USB有四种传输模式: 控制传输, 中断传输, 同步传输, 批量传输
1. 中断传输
中断传输一般用于小批量, 非连续的传输. 对实时性要求较高. 常见的使用此传输模式的设备有: 鼠标, 键盘等. 要注意的是, 这里的 “中断” 和我们常见的中断概念有差异. Linux中的中断是设备主动发起的电信号, 由操作系统捕捉到后执行一系列操作. 而 USB 的中断传输是由主机主动发起, 每隔固定时间发起传输请求. 也就是主机主动轮询.
中断传输关键参数有三个:
- 传输类型
- 单次传输的最大包大小
- 轮询间隔
1.1中断传输特点
低速模式最大包长为8字节
全速模式最大包长为64字节
高速模式最大包长为1024字节
超高速模式 (USB3.0) 支持突发传输, 也就是一次事务中连续传输多个包. 例如突发大小为2, 则可以在一个事务中连续传输两个包. 对于突发大小 = 1的传输端点, 可以支持1 ~ 1024 最大包长; 对于突发大小 > 1 的传输端点, 只支持最大包长为1024.
1.2 中断传输事务
1.2.1 中断 IN 事务
当主机想要启动一个 IN 事务时, 他向目标端点发送一个 ACK TP (Acknowledgement Transaction Package), 然后中断端点响应主机发送数据包, 主机需要对每个 DP (Data Package) 用 ACK TP 响应, 表明成功接收数据.
发生以下情况时, 主机停止对中断端点执行事务:
- 端点返回 NRDY 或 STALL TP;
- 所有数据都已成功接收
- 最后一个 DP 中设置了 EOB (End Of Burst)
当端点接收到主机的 ACK TP, 但是无法发送数据包时, 应返回 NRDY TP. 如果是有内部端点或设备错误时, 应发送 STALL TP. 随后主机不会再向该端点执行任何事务.
之前由于数据没准备好而发送了 NRDY TP, 当数据准备好之后, 应发送 ERDY TP, 然后主机会回复 ACK TP. 然后端点发送 DP.
流程如下:
-
主机发送 ACK TP, 端点发送 Data
-
主机发送 ACK TP, 端点还没有数据可以发送, 回复 NRDY
-
端点准备好数据后, 发送 ERDY TP. 主机收到后发起 ACK TP, 端点再发送 DP
-
由于设备错误, 端点返回 STALL TP
-
在数据发送失败的情况下, 如果有设置 retry, 则会重新发送 ACK TP.
1.2.2 中断 OUT 事务
当主机想要向端点启动一次 OUT 事务时, 会先发送第一个 DP, 如果端点正常回复 ACK TP, 则主机会在每个服务间隔期间继续发送 DP, 直至发送完成. (如果支持突发大小, 则可以在一个服务间隔中连续发送多个 DP)
流程如下:
-
主机正常在每个服务间隔期间发送 OUT 事务, 端点发送 ACK TP, 表示成功收到
-
端点回复 NRDY TP, 则主机停止向端点发送 DP
-
端点发送 ERDY TP, 则主机继续向端点发送 DP
-
如果有设置 retry , 则当数据发送失败时, 主机会尝试再次发送 DP
-
出现设备错误, 则发送 STALL TP, 主机不会再向端点发送 DP
参考
https://www.usbzh.com/article/detail-109.html
<Universal Serial Bus 3.0 Specification>