《圈圈教你玩 USB》学习笔记-批量传输

    批量传输使用批量事务(bulk transaction) 传输数据。一次批量事务有三个阶段:令牌包阶段,数据包阶段和握手包阶段。这里的每个阶段都是一个独立的包。批量传输分为批量读和批量写(记住,输入还是输出是以主机为参考的),批量读使用批量输入事务,批量写使用批量输出事务。

    批量传输没有规定数据包中数据的意义和结构,具体的数据结构要由设备自己定义。批量传输通常用在数据量大,对数据的实时性要求不高的场合,例如 USB 打印机、扫描仪、大容量存储设备等。

1、批量输出事务

主机端

    主机先发出一个 OUT 令牌包,这个令牌包中包含了设备地址、端点号。然后,再发送一个 DATA 包(具体是什么类型的 DATA 包,要看数据切换位),这时地址和端点匹配的设备就会收下这个数据包。然后主机切换到接收模式,等待设备返回握手包。

设备端

    设备解码令牌包,数据包都正确无误,并且有足够的缓冲区来保存数据后,就会使用 ACK 握手包或者 NYET 握手包来应答主机(只有高速模式才有 NYET 握手包,它表示本次数据成功接收,但是没有能力接收下一次传输)。

    如果没有足够的缓冲区来保存数据,那么它就会返回一个 NAK 握手包,告诉主机目前没有缓冲区可用,主机会在稍后的时间重试该批量输出事务。

    如果设备检测到数据正确,但是端点处于挂起状态,则返回一个 STALL 握手包。

    如果检测到有错误(例如校验错误、位填充错误),则不做任何响应,让主机等待超时。

2、批量输入事务

主机端

    主机首先发出一个 IN 令牌包,同样,这个 IN 令牌包中包含了设备地址和端点号。然后主机切换到接收数据状态,等待设备返回数据。

设备端

    如果设备检测到错误,那么不做任何响应,主机等待超时

    如果此时有地址和端点匹配的设备,并且没有检测到错误,则设备要做出响应:如果设备有数据需要返回,那么它把一个数据包放到总线上,如果设备没有数据需要返回,则它直接使用 NAK 握手包来响应主机;

    如果该端点处于挂起状态,设备会返回一个 STALL 握手包

    如果主机接收到设备发送的数据包并解码正确后,使用 ACK 握手包应答设备。

    如果主机检测到错误则不做任何响应,设备会检测到超时。USB 协议规定,不允许主机使用 NAK 握手包来拒绝接收数据包。

    主机在收到 NAK 握手包后,知道设备暂时无数据返回,主机会在稍后的时间里重试该输入事务。

3、PING 令牌包

USB2.0 高速设备增加了一个 PING 令牌包,它不发出数据,直接等待设备的握手包。因此 PING 事务只有令牌包和握手包。用于探测设备是否有空间接收数据。设备根据实际的情况返回握手包。ACK 握手包表示有空间接收数据,NAK 握手包表示无空间接收,STALL 握手包表示端点挂起。

4、一次正确的批量输入事务如下

主机发送

同步域 IN PID 7 位地址 4 位端点号 5 位 CRC5 校验 EOP

设备返回

同步域 DATA0 PID 字节 0 字节 1 16 位 CRC16 校验 EOP

主机应答

同步域 ACK PID EOP

5、一次正确的批量输出事务如下

主机发送

同步域 OUT PID 7 位地址 4 位端点号 5 位 CRC5 校验 EOP

主机发送

同步域 DATA0 PID 字节 0 字节 1 16 位 CRC16 校验 EOP

设备应答

同步域 ACK PID EOP
发布了124 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/103974246