USB传输类型:控制传输、批量传输、中断传输、同步传输
USB协议里定义了四种传输类型。很多初学者刚接触时容易混淆,觉得不就是发数据吗,搞这么复杂干嘛?
其实每种传输类型都有它特定的应用场景。我刚开始做USB驱动时,就因为选错了传输类型,导致设备在高速模式下频繁丢包。后来才明白,这四种类型就像四种不同的快递服务——有的要保证送到,有的要实时送达,有的量大优先,有的丢了也无所谓。
四种传输类型速览
先看一张总览表,把四种类型的关键差异说清楚:
| 传输类型 | 保证送达 | 保证带宽 | 实时性 | 典型应用 |
|---|---|---|---|---|
| 控制传输 | ✅ 是 | 否 | 低 | 枚举、配置、命令 |
| 批量传输 | ✅ 是 | 否 | 低 | U盘、打印机数据 |
| 中断传输 | ✅ 是 | ✅ 是 | 中 | 鼠标、键盘、HID |
| 同步传输 | ❌ 否 | ✅ 是 | 高 | 音频、视频、摄像头 |
这张表我建议你记牢。面试时经常被问到,项目选型时也靠它。
控制传输——USB的"控制通道"
控制传输是所有USB设备都必须支持的。它负责设备枚举、获取描述符、设置配置等底层操作。
核心特点:
- 双向传输,主机发起,设备响应
- 有固定的传输阶段:Setup → Data(可选) → Status
- USB协议保证数据完整送达,出错会重试
- 带宽占用小,优先级较高
控制传输的流程是这样的:
主机发送Setup令牌包 → 设备接收请求
↓
[可选] 数据阶段(IN或OUT)
↓
状态阶段(握手确认)
我个人习惯把控制传输看作USB设备的"神经系统"。设备刚插上时,主机就是靠控制传输来"盘问"设备的——你是谁?你是什么类型?你需要多少电?
关键点:每个USB设备必须实现端点0,且端点0只支持控制传输。这是USB规范强制要求的。
批量传输——可靠但没准头
批量传输的特点是:数据必须完整送达,但什么时候送到,主机说了算。
应用场景:
- U盘读写
- 打印机数据传输
- 扫描仪图像传输
- 大文件传输
批量传输没有带宽保证。如果总线上有其他实时传输(比如同步传输),批量传输就得往后排。但一旦开始传输,硬件层面会做CRC校验和重试,保证数据不出错。
我的经验:做U盘项目时,批量传输的缓冲区大小设置很关键。我建议至少分配两个512字节的缓冲区做乒乓操作,否则连续读写时性能会掉得很厉害。
中断传输——准时但不紧急
这个名字容易让人误解。中断传输并不是硬件中断,而是主机定期轮询设备,看有没有数据要传。
核心参数:
- 轮询间隔:主机每隔N毫秒查询一次设备
- 最大数据包:每次传输的数据量上限
- 保证带宽:主机为中断传输预留了时间片
典型应用:
- 鼠标(轮询间隔通常8ms)
- 键盘(轮询间隔通常8ms)
- 游戏手柄
- HID类设备
中断传输的延迟是可预测的。比如你设置轮询间隔为4ms,那么主机最晚4ms就会来取一次数据。这对人机交互设备来说足够了。
避坑指南:我曾经把鼠标的轮询间隔设成了1ms,结果在USB 1.1全速模式下,主机根本调度不过来,鼠标反而变得卡顿。后来改成4ms就正常了。别盲目追求短间隔,要考虑总线负载。
同步传输——快但不靠谱
同步传输是四种类型里最"任性"的。它追求实时性,但不保证数据完整。
特点:
- 固定带宽,主机预留时间片
- 无重传机制,数据丢了就丢了
- 无握手阶段,只管发不管收
- 延迟最低,适合流式数据
应用场景:
- USB音频设备(音箱、麦克风)
- USB摄像头
- 视频采集卡
- 实时数据采集
你想想看,听音乐时偶尔丢一个采样点,人耳根本听不出来。但如果为了重传那个采样点导致音频卡顿,那体验就太差了。同步传输就是基于这个思路设计的。
四种传输类型的对比总结
下面这张SVG图把四种传输类型的关系和选择逻辑画清楚了:
实际项目中的选型建议
做项目时怎么选?我总结了几条经验:
- 枚举阶段只能用控制传输——这是USB规范强制的,没得选
- HID设备用中断传输——鼠标键盘这类,中断传输最合适
- 存储设备用批量传输——U盘、硬盘,数据量大且不能丢
- 音视频用同步传输——实时性优先,偶尔丢一帧没关系
- 自定义设备看需求——如果数据量小且重要,用控制传输;如果数据量大,用批量传输
小技巧:调试时可以用控制传输做自定义命令。我在项目中经常在控制传输里加一些调试指令,比如读取固件版本、切换测试模式。这样不用额外占用端点资源。
常见误区
最后说几个我踩过的坑:
- 误区一:以为中断传输是硬件中断。其实它是主机轮询,不是设备主动通知。
- 误区二:在同步传输里期望数据完整。同步传输不保证送达,丢了就是丢了。
- 误区三:批量传输的带宽是固定的。实际上批量传输没有带宽保证,总线忙时会被推迟。
- 误区四:控制传输只能传小数据。虽然控制传输最大包长只有64字节(高速模式),但可以通过多次传输传大块数据。