USB2.0 SPLIT事务
当一个低速或全速的USB设备连接到高速的HUB时,高速USB主机使用SPLIT事务来解决从高速模式到全速模式的转换。
SPLIT事务分为SSplit(Start Split)事务和CSplit(Complete Split)事务两种。
- 如果高速HUB无法处理SPLIT事务,高速HUB会向USB主机返回一个NYET包。
- 如果低速或者全速设备和高速HUB之间的事务一直没有完成,高速HUB也会向主机返回一个NYET包。
- 当高速HUB端口下的低速或者全速设备出现错误时,高速HUB会向USB主机发送一个ERR包。
SPLIT事务的格式
SPLIT事务:
CSplit格式:
SPLIT事务的HUB与设备之间的接力过程
中断输入SPLIT事务
中断输出SPLIT事务
SPLIT事务示例1
这说明了一个典型的拆分交易序列;在这种情况下,拆分中断 IN。
SPLIT事务示例2
SPLIT BULK OUT事务
对于拆分批量 OUT 事务,主机发送一个 Start Split 数据包,指定集线器地址和端口号以及速度(全速),并将“端点类型”设置为“批量”。
然后它发送一个 OUT 令牌包来识别全速事务类型、设备和端点地址,然后发送数据包以向前传输到目标端点。
如果 Transaction Translator 正确接收到这些数据包并且有可用的缓冲区,它将以 ACK 数据包响应,否则它将以 NAK 数据包响应。
此时,事务转换器继续将此事务发送到指定的全速端点,并获得响应,并将其存储,准备好在完成拆分事务期间传递回主机。
当主机控制器决定它是合适的时,它通过发出一个完整的拆分事务来检查结果。Complete Split 数据包和 OUT 令牌数据包与 Start Split 事务相同,但数据包的 Start/Complete 位除外。这允许集线器验证它将呈现哪个事务的结果。
如果全速事务尚未完成,集线器将以 NYET 数据包响应,主机将在稍后的某个时间尝试竞争拆分事务。如果完成,则将包含实际结果(ACK、NAK 或 STALL)的数据包发送到主机。
SPLIT BULK IN事务
拆分批量 IN 事务类似于拆分批量 OUT,只是 DATA0/1 数据包发生在 Complete Split 阶段,因为它现在是响应的一部分。如果返回了数据,则数据包将代替握手包出现。
全速事务的实际 ACK 由事务转换器在接收到来自设备的 DATA0 或 DATA1 数据包时发送到设备,主机将跟踪它接收到的数据。如果它未能接收到有效的数据包,它将重试 Complete Split Transaction。
周期SPLIT事务-中断传输和同步传输
拆分中断和同步事务需要特殊处理,因为它们提供了带宽保证。每个使用这些端点类型的全速/低速设备添加到总线上,都会在全速/低速总线上得到保证分配,这也必须在高速总线上传送。该机制很复杂,在 USB 规范的第 11 章中有完整的描述。
这种机制的结果是,全速或低速总线上的周期性事务以最多 188 字节的数据包进行传输。
因此,对于同步端点而言,较长的事务(最长可达 1023 字节)将在 OUT 传输的多个 Start Split 事务或 IN 传输的多个 Complete Split 事务中传输。
此外,在周期性 IN 事务中,集线器在给定微帧内从设备接收到的数据是响应完全拆分而发送的,即使它仅代表全速或低速数据包的一部分。一个跨越两个微帧的全速中断 IN 数据包,例如 64 字节,将在最多两个完整拆分中传送。第一部分中的数据包将使用一个 MDATA PID 来指示它不完整。
等时 IN 事务类似,但最多可跨越 6 个微帧。
拆分中断 OUT 事务
对于中断 OUT 事务,最大数据大小为 64 字节,因此这些始终在单个开始拆分事务中传输。不需要来自集线器的握手包,因为如果错过了中断,则不会在同一帧中重试中断。
与批量事务一样,完整拆分将在设备自身响应时从设备引发握手数据包,或在全速或低速总线上出现错误时使用 ERR,或在事务转换器未完成其时使用 NYET任务。
分割中断 IN 事务
对于拆分中断 IN,我们发出 Start Split(不期望来自集线器的握手)。
Complete Split 可能会导致返回完整的数据包(DATA0 / DATA1),但也有可能在微帧期间,到目前为止仅收集了部分数据,在这种情况下,使用 MDATA PID 来指示在下一个微帧中将需要进一步的完全拆分。
握手数据包 NAK 或 STALL 将指示设备使用此数据包进行响应。ERR 表示全速或低速总线上存在错误。NYET 表示事务翻译器尚未完成其任务。
拆分同步 OUT 事务
从表面上看,这是最简单的拆分交易。没有来自集线器的握手,也没有完全拆分,因为不检查同步事务的交付。
复杂的事实是,单个全速同步事务被分成单独的开始拆分事务,每个事务最多 188 字节,每微帧发送一个。
Start Split 数据包设置了其 Start和 End位,以识别正在传输的有效负载的哪一部分。
拆分同步 IN 事务
对于拆分同步 IN,我们发出 Start Split(不期望来自集线器的握手)。
Complete Split 可能会导致返回完整的数据包(DATA0),但也有可能在微帧期间,到目前为止仅收集了部分数据,在这种情况下,使用 MDATA PID 来指示进一步的 Complete在下一个微帧中将需要拆分。
ERR 表示全速或低速总线上存在错误。NYET 表示事务翻译器尚未完成其任务。