USB高速基础知识
USB 2.0 中引入了对规范的高速添加,以响应 Firewire 的更高速度。
由于 High Speed 是事后才添加的,并且必须在不影响性能的情况下保持兼容性,所以我们将保留对 High Speed 的描述,直到我们涵盖了原始规范的基础知识
数据传输
高速实现的数据速率为 480 Mb/s。这需要通过最初指定为 12 Mb/s 传输速率的电缆传输,为了实现这一点,当链路传输高速数据时,D+ 的每一端和 D- 的每一端都以 45 欧姆的接地电阻端接。
通过将 17.78 mA 的电流(来自正电源)引导到 D+ 或 D- 线来发送数据。这会导致被馈入电流的线路上的电压为 400mV。差分接收器在接收端检测线路的差分状态。这种安排能够可靠地接收以 480 Mb/s 发送的数据。
事实上,全速/低速驱动器提供 45 欧姆电阻,在链路的每一端应用单端零。FS/LS 驱动器旨在提供尽可能准确的端接电阻。通过关闭高速收发器电流源,线路条件定义为全速/低速。
除了差分接收器,还有一个“传输包络检测器”和一个“差分包络检测器”。
如果数据线之间的电压低于 100uV,则传输包络检测器会产生一个“静噪”信号,这意味着没有接收到数据。
差分包络检测器检测远端是否已拔出,因为如果远端终端电阻不存在,差分电压将加倍至约 800 mV。
数据包同步
在数据包同步之前,两条数据线都为低电平。使用 NRZI 序列 KJKJKJKJKJKJKJKJ KJKJKJKJKJKJKJKK 发送同步。
每个集线器可能会从同步模式中删除多4位。在 5 个集线器之后,一个数据包的同步字段可能只有 12 位长。
数据包结束
在低速或全速链路上,一个简短的单端零 (SE0) 状态用于指示数据包结束 (EOP),空闲由 J 状态指示。
在高速链路上,空闲状态实际上是一个 SE0,因此该状态不能用于指示 EOP,并且使用了不同的方法来指示数据包结束。在正常的数据传输过程中,连续的 1 不能超过 6 个,因为 0 会自动插入(并且会在接收时删除)。这保证了 NRZI 编码数据流中有足够的转换以允许时钟恢复。
在高速时,通过故意发送一个包含位填充错误的字节来指示 EOP;’01111111’。这适用于除 SOF 之外的所有数据包的末尾。
每个高速 SOF 数据包以包含比特填充错误的 5 个 NRZI 字节结束:01111111 - 11111111 -11111111 -11111111 -11111111。这种模式允许“断开包络检测器”检测到高于 625 mV 的数据幅度上升,以防设备及其终端电阻已被拔出。
兼容性
已注意在高速和全速/低速主机以及高速和全速/低速设备之间提供尽可能多的兼容性。USB 是即插即用系统,不能混淆用户。因此,低速或全速设备将始终与支持高速的主机一起工作。
高速设备将始终与全速/低速主机一起工作,至少在将其身份和功能传达给主机的范围内(它可以全速进行)。然后,如果用户拥有依赖高速带宽来提供任何功能的设备,主机将能够向用户报告。
高速协商
为了保持所需的兼容性,高速设备最初总是将自己显示为全速设备(通过 D+ 上的 1.5K 上拉电阻)。
- 高速协商发生在复位期间,这是主机在尝试数据通信之前必须对设备执行的第一件事。
- 高速检测握手由设备发起。
- 如果集线器具有高速能力,集线器将对其做出响应。
设备的作用
该器件保持其 D+ 1.5K 上拉电阻连接,并且不会像 高速时那样使用 45 欧姆电阻终止线路。但它将高速电流 (17.78mA) 驱动到 D 线至少一毫秒。现在,请记住集线器正在对线路应用复位条件,因此实际上已经终止了高速数据。由于只有链路的一端被终止,集线器将在 D- 上看到大约 800 mV。这种情况称为 K 啁啾。
全速/低速集线器不会注意这种情况,但高速集线器会使用其差分接收器和没有静噪信号来检测它。
如果集线器没有响应,那么其余的复位和随后的数据传输将按照全速设备的正常情况进行。
集线器响应
如果集线器具有高速能力,那么它将监控来自设备的 K-chirp,直到它看到它完成。它必须在 100us 内向设备发送一系列 KJ 啁啾对。这意味着它将交替向 D- 和 D+ 线注入 17.78 mA。这些啁啾中的每一个持续大约 50us,并且它们之间没有间隙。在假设集线器具有高速能力之前,该设备必须看到至少 3 个啁啾对。
切换到高速
此时,设备断开其 1.5K 上拉电阻,应用 45 欧姆高速终端(在 SE0 模式下使用其全速数据驱动器),从而处于执行高速数据传输和接收的状态。集线器将继续发送JK对,直到复位结束前 100 - 500 us,并且设备将监视这些JK。在应用器件端接的时间点,啁啾信号的幅度,在示波器上观察到,幅度从 800mV 到 400mV 减半。
帧和微帧
全速/低速 USB 使用 1 ms 帧速率,例如调度对总线的访问,以及作为中断和同步传输的时序参考。
对于高速,更高的帧速率被认为是合适的,同时仍保持与现有 1 kHz 速率的关系。为此,高速使用 125us 长的“微帧”(每毫秒 8 微帧)。通过在 8 个连续的微帧中重复每个帧号,在高速 SOF 数据包中保持与 1ms 帧编号的对应关系。
数据包长度
每微帧的数据包
在高速下,可以指定每微帧最多 3 次同步或中断传输,而不是全速每帧 1 次传输;最大可能的同步或中断传输速率为 192 Mb/s。
新的数据包标识
为高速添加了一些新的 PID,部分是为了解决在全速协议中公认的一些低效率,部分是为了支持新的同步传输功能,以及对“拆分事务”的新要求。
为解决一些低效率并提高高速带宽使用的标识符是:
为控制每个微帧的多个同步数据包的标识符是:
- DATA2
- MDATA
增加拆分传输的标识符是
兼容全速和低速设备的高速集线器
在最初的 USB 中,存在一个内置的低效率,即整个总线都被阻塞,等待低速事务发生。
费尽心思将数据速率提高到 480 Mb/s,如果这种情况持续下去,那就太浪费了,因此采取了不同的方法。
与 USB V2.00 集线器的所有通信都以高速进行,即使它包含低速或全速设备的流量。在高速集线器树中,数据包以高速沿树向下传输到集线器,低速或全速设备连接到集线器的端口。
有问题的集线器在其内部分配了特殊的控制电路,以接管与总线的低速或全速段通信的角色;启动事务,从设备获取响应,最后将结果高速传送回主机。
处理这个问题所需的机制,在不阻碍总线的高速段的情况下,包括将每个低速或全速事务分成 2 个阶段;来自主机的请求,以及来自设备的最终响应。
主机使用带有 SPLIT 标识符的新数据包与高速集线器通信其要求。此数据包可以定义开始拆分或完整拆分事务。
这两种传输中数据包的实际顺序非常依赖于传输类型和方向。
此图说明了如何将全速和低速流量与高速流量分开。蓝线仅承载高速交通,红线仅承载全速或低速。指向全速或负载速度设备的任何流量都通过高速部分,作为高速拆分事务。
复位
当主机想要复位设备时,主机将保持其 SE0,但不发送任何数据。设备最初会看到 SE0(没有数据活动),并且无法将此情况与挂起区分开来。在此条件的最迟 3.125 ms 之后,设备必须自行恢复到全速终止,然后测试它是否看到 SE0 或空闲。如果它看到 SE0,那么它就知道它正在被重置,并将继续进行上述的握手。
暂停
高速主机通过恢复到全速空闲状态来挂起设备。同样,设备最初会看到 SE0(没有数据活动),并且无法将此情况与复位区分开来。
在此条件的最迟 3.125 ms 之后,设备必须自行恢复为全速终止,然后测试它是否看到 SE0 或空闲。如果它检测到空闲,它必须假定它被挂起,并且必须进入它的低功耗挂起模式。
请注意,链路的两端必须记住它们处于高速模式,这样当 Resume 发生时,不需要高速握手。
恢复/Resume
至于全速/低速,Resume 由 K 状态发出 20 ms 的信号。当链路先前处于高速模式时,通过在恢复结束时转换回 SE0 来完成恢复,并且主机和设备都必须在 2 个低速位时间内处于高速终止模式。
检测设备拔出
在低速或全速链路上,一个简短的单端零 (SE0) 状态用于指示数据包结束 (EOP),空闲由 J 条件指示。
在高速链路上,空闲状态实际上是一个 SE0,因此该状态不能用于指示 EOP,并且使用了不同的方法来指示数据包结束。在正常的数据传输过程中,连续的 1 不能超过 6 个,因为 0 会自动插入(并且会在接收时删除)。这保证了 NRZI 编码数据流中有足够的转换以允许时钟恢复。
在高速时,通过故意发送一个包含位填充错误的字节来指示 EOP;’01111111’。这适用于除 SOF 之外的所有数据包的末尾。
每个高速 SOF 数据包以包含比特填充错误的 5 个 NRZI 字节结束:01111111 - 11111111 -11111111 -11111111 -11111111。这种模式允许“断开包络检测器”检测到高于 625 mV 的数据幅度上升,以防设备及其终端电阻已被拔出。