USB 的工作原理:通信协议(第 2 部分)

在上一个教程中,我们了解了 USB 协议的硬件级连接和功能。现在,在本教程中,我们将了解 USB 主机的固件如何与设备通信。

我们都知道,只要将 USB 外围设备(键盘、鼠标或磁盘驱动器)插入计算机,它就会立即启动并运行;这似乎很简单。嗯,这只是在 USB 协议开发之后的情况。外围设备(如支持 PS/2 端口的键盘和鼠标)必须在打开计算机之前连接到计算机。如果在启动过程后连接它们,设备将无法工作,需要重新启动计算机才能使它们工作;这些设备不是热插拔的。USB 外围设备是热插拔的,即,无需重新启动系统即可插入或拔出它们。在接下来的教程中,我们将了解是什么让这些设备可热插拔。

USB 端点

要了解 USB 协议中的数据流,首先,我们需要记住 USB 2.0 使用轮询机制,即只有主机才能在总线上发起事务。话虽如此,让我们继续讨论 USB 架构的软件组件。USB 设备包含一组端点;设备端点是设备的唯一可寻址部分,可以在主机和设备之间共享信息,但这里有一个问题:即使这些是唯一可寻址的部分,它们也只特定于设备。因此,可以有多个具有唯一地址的设备,这些设备可以具有与其他设备相似的端点。例如,可以有多个具有唯一地址的 USB 存储驱动器连接到主机控制器,它们共享类似类型的端点。端点通过管道连接到主机的缓冲区。管道听起来可能几乎像物理实体,但却是 USB 设备上的特定端点和主机控制器之间建立的通道。图 1.1 演示了 USB 数据流模型。

在这里插入图片描述

USB 端点是单向的,数据只能在端点允许的方向上流动。它们使用循环冗余校验 (CRC) 来检测事务中的错误。CRC 是用于检查接收数据包完整性的最常用技术之一。在发送数据之前,一种特殊的算法会根据数据包计算一个校验值,这个校验值称为 CRC 校验和;此校验和附加在数据包中。当接收设备收到数据包时,它会为数据包计算自己的校验和,并将其与随数据包一起附加的校验和进行比较,如果两个校验和匹配,则传输中没有错误,而不匹配则表示传输过程中发生了错误。

USB 规范有 32 个端点,包括 16 个 IN 端点和 16 个 OUT 端点,在初始配置后即可访问。为了进行初始通信,使用了一组特殊的端点,称为控制端点或端点 0。此端点 0 定义为端点 0 IN 和端点 0 OUT,它不需要单独的描述符,因为它充当主机与设备通信的默认端点。请记住,USB 协议中的 IN 数据是信息从设备移动到主机时的数据,OUT 数据是数据从主机移动到设备时的数据。

当然,可能会出现这样的问题:为什么需要端点?既然可以轻松完成,为什么要不必要地使事情复杂化?您会看到,USB 协议基于轮询工作,即连接的设备只有在主机向设备请求某些数据时才能与主机通信,并且我们知道 USB 被定义为可以连接任何受支持的输入、输出或存储设备的通用连接器。所有这些设备都具有不同的功能并以不同的轮询速率工作。键盘和鼠标等设备需要快速轮询速率和较小的数据包大小,而 USB 拇指驱动器可以容忍较慢的轮询速率,但需要较大的数据包大小。为了满足这些需求,USB 规范定义了四种类型的传输:

控制传输– 这些端点支持所有设备都必须支持的控制传输。它们是双向端点,在低速和全速设备中在总线上保留 10% 的带宽,而对于高速设备,则为 20%。它们对于 USB 系统级控制以及设备的初始配置和设置非常重要。此端点在设备枚举过程中起着重要作用。

中断端点– 这些端点支持中断传输;虽然这种传输的名称可能会产生误导,但它实际上并不支持中断机制,而是确保主机使用轮询速率,即主机以可预测的间隔检查数据。这些传输在少量数据上具有高数据可靠性,并保证准确性,因为可以正确检测到错误并重新传输失败的事务。这对于人机接口设备 (HID)(如键盘、鼠标、游戏控制器等)非常重要,

中断传输在低速和全速设备上保证带宽为 90%,在高速设备上保证带宽为 80%。中断端点最大数据包大小会随设备速度而变化。在高速设备上,最大数据包大小为 1024 字节,在全速设备上为 64 字节,在低速设备上为 8 字节。

批量端点– 这些类型的端点用于传输大量数据的设备。此处传输的数据是批量的,这种传输类型称为批量传输。批量传输保证准确性,因为它支持纠错,并且在失败时重新发送数据包。但是,准确性和时间之间存在权衡,因为交付时间是可变的。交付时间取决于总线上的可用带宽,这使得交付时间不可预测,因此,这些类型的传输对时间不敏感。请注意,低速设备不支持批量传输。

等时端点– 这些端点支持具有预先协商的带宽的连续实时传输。这些类型的传输确实会检测到错误,但它们具有容错性,因为它们不支持错误恢复机制或握手(错误恢复和握手将在本教程的下一部分中讨论)。它们用于流媒体应用程序;因此,偶尔丢失数据并不是什么大问题,因为它会被人耳和眼睛忽略。等时传输在低速和全速设备上可保证 90% 的带宽,而在高速设备上可保证 80% 的带宽,并且带宽与中断传输共享。低速设备上不提供等时传输。

这解释了端点在 USB 协议中扮演着怎样的重要角色,使它成为适用于任何类型的设备或外围设备的真正通用总线协议。现在,让我们讨论一下 USB 协议中通信是如何进行的。

传输

USB 2.0 协议中的通信是半双工的,即总线上的数据传输和接收不能同时进行,并且事务由主机初始化,而连接到集线器的设备只能响应它们。关于 USB 协议需要记住的一个重要事实是,总线上的数据首先以最低有效位 (LSB) 传输。

如果我们从时间角度来看 USB 协议,它包含一系列帧。一个帧由帧起始 (SOF) 数据包和一个或多个事务组成。SOF 标志着 USB 总线上新帧的开始。
在这里插入图片描述
图 2.1 显示了交易的样子;交易是一组令牌包、可选数据包和握手包。数据包可以包含以下信息:

  • 数据包 ID (PID):这些位有助于识别数据包的类型。此数据包的大小为 8 位,其中前 4 位为类型位,后 4 位为错误校验位。后 4 位是前 4 位的补码。

例如,OUT 令牌的 PID 为 0001 1110。接收方可以检查高位和低位之间的一致性,以检测 PID 本身的传输错误。

  • 可选设备地址:包含设备的地址,长度为7位。
  • 可选端点地址:USB 规范支持最多 32 个端点,即 1-16 个 IN 端点和 1-16 个 OUT 端点。端点地址的长度为 4 位,最大值为 16。
  • 可选有效负载数据:这是必须发送的实际数据块,块的大小范围是 0 到 1023 字节。
  • 可选 CRC:循环冗余校验是检查数据包完整性的错误检查机制。CRC 字段的长度可以是 5 位或 16 位,具体取决于所使用的 CRC 技术(即 CRC5 或 CRC16)。

在这里插入图片描述
现在我们对 USB 数据包在表示层面上的样子有了抽象的概念,我们可以深入了解它在物理层面上的传输方式。

在这里插入图片描述

我们已经知道,USB 协议使用各种状态(J、K、SE0、SE1)而不是差分 0 或 1,因为这些状态的定义会随着设备速度的变化而变化。USB 总线上的新数据包由同步模式表示,数据包的结束由数据包结束 (EOP) 标记。

为了开始总线上的传输,总线的数据线将转换为 K 状态,并发送同步模式以标记新数据包的开始。同步模式总共包含 8 个状态,这些状态由 3 个 KJ 对和 2 个 K 组合而成,之后发送实际数据包数据(即数据包 ID、有效负载等),并在总线上发送 EOP 以定义数据包的结束。EOP 模式是 2 位时间的 SE0,然后是至少 1 位时间的 J 状态,请注意,J 状态可以发送多次,这取决于主机控制器的配置。

在这里插入图片描述

USB 2.0 规范支持四种不同类型的数据包。

  1. 令牌包
  2. 数据包
  3. 握手数据包
  4. 特殊包裹

我们首先来逐一查看每个数据包的功能。

1. 令牌包

令牌包始终由主机发起,用于引导总线上的流量。令牌包决定主机和设备之间将执行的事务类型。此包包含包 ID、7 位设备地址、4 位端点 ID 和 5 位 CRC。令牌包有三种不同的类型:

  1. 输入令牌包:这种类型的令牌包用于向设备请求数据,并且在事务中数据包从设备发送到主机。
  2. OUT令牌包:此类令牌包用于通知设备主机已准备好向设备发送数据。
  3. SETUP 令牌包:此类令牌包是在设备设置和配置期间发出的。

SOF 令牌包:发出此类令牌包是为了标记新帧的开始。这是一种特殊类型的数据包,包含一个称为帧号的 11 位字段,该字段指示当前编号和传输的帧总数。每次在总线上发出新的 SOF 数据包时,主机控制器都会增加帧号。(在 LS 和 FS 中,但在 HS 中仅以 1ms 为单位递增,而不是每 125us 递增)
在这里插入图片描述

如前所述,USB 总线上的通信以帧为单位进行;对于低速(1.5 Mbit/s)和全速(12 Mbit/s)设备,主机控制器将总线时间划分为 1 ms 帧,而对于高速设备(480 Mbit/s),每帧为 125 µs,125 µs 帧称为微帧。在每个帧或微帧中,可以进行多个事务。令牌包的类型决定了事务的类型,总线上的 IN 令牌包启动上游事务,总线上的 OUT 令牌包启动下游事务。

在这里插入图片描述

2.数据包

数据包携带主机控制器请求或发送的有效载荷,它由数据包 ID、有效载荷数据和 CRC16 字段组成,用于检查收到的数据包的完整性。数据包支持两种类型的数据包 ID:DATA0 和 DATA1。您可能会问,既然只需一个 ID 就可以将数据包标记为数据包,为什么还要使用两个不同的数据包 ID。好吧,您会看到,当发送数据包时,数据包 ID 会切换到其备用状态,即如果是 DATA0,则下一个数据包将是 DATA1,反之亦然。

这种切换数据包 ID 的技术有助于设备识别数据包丢失(如果有)。假设主机发送的最后一个数据包的数据包 ID 为 DATA0,而最新的数据包的数据包 ID 也为 DATA0,则设备会断定传输过程中丢失了一个数据包,因为最新的数据包 ID 应该是 DATA1,而不是 DATA0。每个数据包的有效负载大小范围为 0-1024 字节。

在这里插入图片描述

3.握手包

这些数据包用于完成每笔交易,每次握手都包含一个 8 位数据包 ID,由交易的接收方发送。

  • ACK:确认成功完成。
  • NAK:否定确认。
  • STALL:设备发送的错误指示。
  • NYET:表示设备尚未准备好接收另一个数据包。这种类型的数据包 ID 仅在高速设备上受支持。

4. 特殊数据包

  • PRE:当使用全速或高速设备时,主机向集线器发出此消息,指示下一个数据包是低速的。
  • PING:仅适用于高速设备,用于在接收到 NYET 数据包后检查 USB 设备的状态。

在这里插入图片描述

传输类型

总线上主要有三种类型的事务,如下:

上行传输

上行/读取/IN 事务是指从设备发送到主机的事务。这些事务由主机发起,以使用 IN 令牌包向设备请求数据。设备发送一个或多个数据包,主机以握手包进行响应。

如果设备此时尚未准备好将数据发送到主机,则设备不会发送数据包,而是以 NAK 进行响应,以通知主机它尚未准备好数据,并且主机会在一段时间后再试一次。
在这里插入图片描述

下行传输

下行/写入/OUT 事务是指从主机发送到设备的事务。这些事务由主机发起,使用 OUT 数据包将数据发送到设备。设备在接收数据时以握手进行响应。

如果设备无法接受主机发送的数据,它将以 NAK 进行响应,并且主机会认为设备现在无法接受数据包,并在一段时间后重试。
在这里插入图片描述

控制传输

控制传输识别、配置和控制设备,并使主机能够读取有关设备的信息、设置设备地址、建立配置并发出某些命令。控制传输始终指向设备的控制端点(端点 0)。控制传输有三个阶段:设置阶段、数据阶段和状态阶段。

设置数据包仅用于设置阶段的控制事务。此数据包将 USB 请求从主机发送到设备。设备始终确认设置阶段,并且无法否认它。

数据阶段在控制事务中是可选的;它可以有多个数据事务,并且仅在数据有效负载在主机和设备之间传输时才是必需的。

最后阶段,即状态阶段,包含单个 IN 或 OUT 事务,用于报告前几个阶段的成功或失败。数据包始终为 DATA1,且包含零长度数据包。状态阶段以前一个数据包的接收方发送的握手事务结束。
在这里插入图片描述

在本教程中,我们了解了 USB 传输类型,以及它们对于在所有设备上扩展 USB 协议支持的重要性(尽管它们具有不同的功能)。然后,我们了解了总线上事务的发生方式。在下一个教程中,我们将了解 USB 枚举和配置过程以及 USB 描述符的重要性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值