1、事务
在介绍USB传输类型之前,请允许我先简答介绍一下USB事务。
事务一般由令牌包、数据包(可选)、握手包组成。
- 令牌包:用来启动一个事务,总是由主机发送。
- 数据包:可以从主机到设备,也可以由设备到主机,方向由令牌包决定。
- 握手包:通常情况,数据的接收者发送握手包(ACK或者NAK)。
USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。下面简答介绍一下这四种传输类型及其注意事项。
2、控制传输
2.1. 控制传输分为三个过程:建立过程、数据过程(可选)、状态过程。
建立过程:
a. 主机发送令牌包:SETUP
b. 主机发送数据包:DATA0
c. 设备返回握手包:ACK或不应答,注意:设备不能返回NAK或STALL,即设备必须接收建立事务的数据。
数据过程(可选):
一个数据过程可以包含多个数据事务,但所有数据事务必须是同一方向的。若数据方向发生了改变,则认为进入状态过程。数据过程的第一个数据包必须为DATA1,然后每次正确传输一个数据包后就在DATA0和DATA1之间交替。
状态过程:
状态过程只使用DATA1包,并且传输方向与数据过程相反。
2.2. 控制传输的应用场合:主要应用于设备的枚举过程和对数据准确性要求较高的场合。
3、同步传输
- 同步传输的应用场合:主要用在数据量大,对实时性要求较高的场合。如视频设备、音频设备等。
4、批量传输
- 批量传输使用批量传输事务,一次批量传输事务分为三个阶段:令牌包阶段、数据包阶段、握手包阶段。
- 批量传输分为批量读和批量写,批量读使用批量输入事务,批量写使用批量输出事务。注意:不论输入还是输出都是以主机为参考的。
- 批量传输的应用场合:主要用在数据量大、对数据实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等等。
批量输出流程:
1) 主机发送OUT令牌包。
说明:令牌包中包含设备地址、端点号。
2) 设备处理令牌包。
- 令牌包正确:设备等待接收数据包。
- 令牌包错误:设备既不接收、处理数据包,也不返回握手包,让主机等待超时。
注:令牌包的正确与否包括设备地址和端点号是否匹配。
3) 主机发送数据包,然后切换到接收模式,等待接收设备返回的握手包。
说明:数据包中包含一个DATA(具体是什么类型的DATA,取决于数据切换位)。
4) 设备处理数据包。
- 数据包正确,并有足够的空间保存数据:设备返回ACK握手包或NYET握手包(只有告诉模式才有NYET握手包,它表示本次数据接收成功,但是没有能力接收下一次传输)。
- 数据包正确,但是没有足够的空间保存数据:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输出事务。
- 数据包正确,但端点处于挂起状态:设备返回一个STALL握手包。
- 数据包错误:设备不返回任何握手包,让主机等待超时。
批量输入流程:
1) 主机发送IN令牌包,然后切换到接收数据状态,等待设备返回数据。
说明:令牌包中包含设备地址、端点号。
2) 设备处理令牌包。
- 令牌包正确,且有数据需要返回:设备将一个数据包放到总线上。
- 令牌包正确,但没有数据需要返回:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输入事务。
- 令牌包正确,但端点处于挂起状态:设备返回一个STALL握手包。
- 令牌包错误:设备不做任何响应,让主机等待超时。
3) 主机接收并处理数据包。
- 数据包正确:主机发送一个ACK握手包。
- 数据包错误:主机不做任何响应,让设备等待超时。
注:USB协议规定,不允许主机使用NAK握手包来拒绝接收数据包。
PING事务:
- PING事务只有令牌包和握手包。
- PING事务是USB2.0高速模式特有的,全速模式和低速模式没有。
- PING事务作用:主机探测设备是否有空间接收数据。
PING流程:
1. 主机发送PING令牌包。
2. 设备返回状态。
- 设备有空间接收数据:设备返回ACK握手包。
- 设备没有空间接收数据:设备返回NAK握手包。
- 设备端点挂起:设备返回STALL握手包。
5、中断传输
- 中断传输是一种保证查询频率的传输。
- 中断端点在端点描述符中报告它的查询间隔,主机会保证在不小于这个时间间隔的范围内安排一次传输。
- 中断传输可以用来不断检测某个状态,当条件满足后,再使用批量传输来传送大量的数据。
- 中断传输和批量传输的结构基本上一样(除了对端点查询策略)。
- 中断传输的应用场合:主要用在数据量小,但对时间要求严格的场合。如人机接口设备(HID)中的鼠标、键盘、轨迹球等。
6、端点
- 一个具体的端点只能工作在一种传输模式下。通常我们把工作在什么模式下的端点,叫做什么端点。如控制端点、批量端点、同步端点、中断端点。
- 端点0是设备的默认控制端点,在设备上电后就存在并可以使用,在Set Config之前所有的传输都是通过端点0传输的。
- 端点描述符中规定了端点所能支持的最大包长。
- 控制传输:高速模式的最大包长固定为64个字节;全速模式可在8、16、32、64字节中选择;低速模式的最大包长固定为8个字节。
- 批量传输:高速模式固定为512个字节;全速模式最大包长可在8、16、32、64字节中选择;低速模式不支持批量传输。
- 同步传输:高速模式的最大包长上限为1024个字节;全速模式的最大包长上限为1023个字节;低速模式不支持同步传输。
- 中断传输:告诉模式的最大包长上限为1024个字节;全速模式最大包长上限为64个字节;低速模式最大最大包长上限为8个字节。