USB 教程合集 - 总目录
本讲目标
理解端点和管道的区别,掌握控制、中断、批量、等时四种传输类型分别解决什么问题。
一、端点可以理解成设备里的“邮箱”
假设一个 USB 设备既需要接收电脑发来的命令,又需要向电脑上报数据。
如果所有数据都没有明确的通道和规则,电脑与设备就很难知道数据应该交给谁处理。
USB 通过端点(Endpoint)定义设备端的逻辑数据通道。
每个端点具有自己的编号、方向和传输属性。设备可以根据实际需求配置多个端点。
这里需要区分两个概念:
- 端点(Endpoint):设备端的通信端口。
- 管道(Pipe):Host 软件与设备端点之间的通信抽象。
端点存在于设备一侧,而管道主要用于描述 Host 如何访问设备端点。
二、为什么端点 0 比较特殊?
端点 0,也就是 EP0,是默认控制端点。
设备刚连接到电脑时,Host 还不知道设备的具体功能,但需要先读取描述符、分配地址和选择配置。这些基础管理操作就需要通过控制传输完成。
因此,EP0 是 USB 设备通信中的基础通道。
设备配置完成后,Host 还可以通过 EP0 执行标准请求、类请求和设备支持的其他控制请求。
三、USB 的四种传输类型
USB 定义了四种主要传输类型。它们不是简单的速度等级,而是针对不同通信需求设计的规则。
3.1 控制传输:负责管理和配置
控制传输主要用于枚举、读取描述符、设置地址以及其他标准或类相关请求。
典型控制传输包含三个阶段:
- SETUP 阶段:发送请求。
- DATA 阶段:按请求情况传输数据,可没有数据阶段。
- STATUS 阶段:完成请求的状态阶段。
例如,Host 发送GET_DESCRIPTOR请求,要求设备返回设备描述符。
这就是典型的控制传输场景。
3.2 中断传输:适合小数据和周期性服务
键盘、鼠标和许多游戏手柄会使用中断端点。
这里有个容易误解的地方:中断传输并不意味着设备可以主动打断 USB 总线。
USB 仍然由 Host 发起事务。中断端点通常由 Host 按调度周期进行服务,设备在收到相关事务时返回数据或状态。
它适合小数据、周期性服务和对服务延迟有要求的场景。
不过,中断传输并不代表应用程序一定会以同样的频率收到回调。操作系统调度、驱动处理和应用层机制都可能影响最终观察到的更新频率。
3.3 批量传输:适合大量数据
U 盘常用批量传输(Bulk)。
批量传输强调数据可靠性,并通过协议规定的握手和错误处理机制处理传输问题。
它适合大量数据交换,但不保证固定的服务时延。
当总线资源繁忙时,批量传输可能需要等待,因此不能简单地认为它在任何情况下都比其他传输方式快。
3.4 等时传输:优先保证时序
音频和视频等实时数据常使用等时传输(Isochronous)。
例如,播放实时音频时,数据晚到可能比丢失少量数据更糟糕,因为过期的数据已经错过播放时间。
等时传输强调周期性带宽和时序,不使用常规的逐包 ACK/NAK 重试机制来保证每个数据包成功送达。
这并不代表等时传输完全没有错误检测,而是它不会像批量传输那样依靠常规重试机制保证每个数据包最终送达。
四、四种传输类型怎么选?
| 传输类型 | 典型用途 | 主要特点 |
|---|---|---|
| 控制 | 枚举、设备管理 | 请求与响应流程 |
| 中断 | 键盘、鼠标、手柄 | 小数据、周期性服务 |
| 批量 | U 盘、大量数据交换 | 可靠传输、时延不固定 |
| 等时 | 实时音频、视频 | 重视时序与周期性带宽 |
选择时应该先考虑应用需求,而不是简单地认为某种传输类型一定最好。
五、轮询间隔等于应用更新率吗?
不一定。
端点描述符中的bInterval用于描述相应端点的服务间隔,但它的解释与总线速度、传输类型以及 USB 规范的规定有关。
例如,在 USB 2.0 中,全速中断端点和高速中断端点对该字段的解释就不同。
因此,不能仅凭bInterval一个字段,就认定应用程序一定以某个固定频率接收数据。
实际开发时,需要区分:
- Host 调度端点事务的频率。
- 设备产生新数据的频率。
- 驱动向上层提供数据的频率。
- 应用程序实际处理数据的频率。
这几个频率可能相同,也可能不同。
六、本讲小结
端点是设备端的数据通道,管道是 Host 与端点之间的通信抽象。
控制传输负责管理,中断传输适合周期性的小数据,批量传输适合可靠的大量数据,等时传输适合对时序要求较高的实时数据。
留给下一讲的问题
为什么有些 USB 设备插上电脑就能用,而另一些设备却需要专用驱动?
下一讲,我们来认识USB Class(设备类)。