HOST 知道某个 HUB 的某个下行 PORT 上连接的是全速/低速设备(通过查询 HUB 的 端口状态得知)。当 HOST 要向该设备传送数据时,它必须启动一次 OUT 型的分离传输。 首先 HOST 发送一个 SSPLIT 包,表明:下面我要进行分离传输了。SSPLIT 包中指明了该 分离传输所对应的 HUB 地址和 PORT 编号,同时也指明了端点的类型(具体定义参考 Start-Split 包的定义)。然后按照普通批量/中断传输的顺序,先发送一个 OUT/SETUP 的令HUB 的 TT 会在 牌 包,然后发送一个数据包,并等待来自 HUB 的握手包。如果没问题,Buffer 开辟一片缓存保存以上接收到的三个包后,并 ACK 主机,表明已经接收到 Start-Split 阶段的数据包。然后 TT 根据 SSPLIT 包中的信息,通过全速/低速 Handler 向指定的下行 PORT 转发令牌包和数据包,并接收来自设备的握手响应,同样保存在 Buffer 中,并更新此次分 离传输的状态信息。
主机在完成 Start-Split 阶段一段时间后,向 HUB 发起 Complete-Split 传输,查询此次传输的状态。具体过程为,先发送一个 CSPLIT 包,然后是 OUT/SETUP 包,TT 根据这两个 包可以查询到已经存储在 Buffer 中的分离传输,如果查询不到,则认为传输错误,返回 STALL 握手包。如果查询到了,但设备还没有响应,则返回 NYET 握手包,让主机等待一段时间 后 重 新 查 询 。 如 果 传 输 已 经 完 成 , 则 TT 向 HOST 转 发 来 自 设 备 的 握 手 包(STALL/ACK/NAK)。这时一次完整的分离传输完成。
IN 型的批量/控制分离传输有相似的过程,只不过数据包的传输在 C-Split 阶段,下图为 其流程图。
周期型的分离传输基本过程和非周期的分离传输大致相同,但在细节上有很多不一样的地方。如周期性的分离传输使用两个 Buffer 分别存放 S-Split 和 C-Split 阶段的数据,主机
S-Split 和 C-Split 也和非周期分离传输有些不同,有较多的限制。 在安排
TT 采用流水的方式处理周期型的分离传输,一次周期型的分离传输在 TT 中共有四种 状态:New、Pending、Ready 以及 Old。一次分离传输依次经历这四种状态。其中 New 态 为这次分离传输在 TT 中建立的状态,是一个暂态、最长不能超过 1 微帧的时间;Pending 为等待传输完成的状态,最长不能超过 4 微帧;Ready 为传输已经完成,等待 Host 取回 结果的状态,最长不能超过 2 微帧;Old 表示传输已经全部完成,TT 中该传输所占用的 Buffer 可以重新利用。
由于速度不匹配,在一个微帧里,最多可以在全速总线上传输 188 字节的数据,在传输 的数据量较大的情况下,例如同步传输的最大包长度为 1023 字节,如果等到整个包传完再 响应 HOST 的 C-Split,不但要求 TT 有更多的 Buffer,并且会使 HOST 浪费较多的时间在等待数据传输完成。因此 TT 采用了如下的处理方式:上行方向上,即 IN 型的传输:无论何时,只要 TT 收到超过 2 个字节的数据,就响应 HOST 的 C-Split,向 HOST 发回
数据,并在 PID 中以 MDATA,DATA1/0 表明还有没有未 传完的数据。如果还有数据,则以 MDATA 发送,否则以 DATA1/0 发送。HOST 在收到 MDATA 后,应继续在下一个微帧里发起 C-Split 传输,向 HUB 请求数据,知道收到一个 DATA0/1 的数据包。下行方向上,即 OUT 型的传输:HOST 把一个大的数据包拆成最大 188 字节的若干个小包,在连续的多个微帧里用 S-Split 向 TT 发送数据,如左图所示:
OUT 型中断分离传输
OUT 型的同步分离传输:OUT 型的同步分离传输只有 S-Split 阶段,而没有 C-Split 阶段,因为同步传输是不可靠的传输,HOST不需要确认传输是否成功完成。
IN 型的同步分离传输
USB2.0协议入门中文版 - 图文
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)