---------------------------------------------------------------------------------------------------------------------------------
导言:USB传输是在USB总线上进行数据交换的基本过程。这涉及将数据从主机到设备或者从一个USB设备到另一个USB设备。USB传输包括以下四种:批量传输,中断传输,同步传输,控制传输。
1 事务
在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction),分别有 IN、OUT 和SETUP 三大事务。一个事务由一系列packet组成,具体由哪些packet组成, 它取决于具体的事务,可能由一个token packet、可选的data packet、可选的handshake packet 和可选的special packet 组成。
1.1IN事务
表示USB主机从总线上的某个USB设备接收一个数据包的过程。
- 令牌包阶段:主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;
- 数据包阶段:设备根据情况会做出三种反应(要注意:数据包阶段也不总是传送数据 的,根据传输情况还会提前进入握手包阶段)。
- 握手包阶段:主机正确接收后会发送ACK包,失败则不会发任何包
正常的IN事务处理:设备往主机里面发出数据包(DATA0与DATA1交替)
设备忙时的IN事务处理:设备端点暂时无法往主机发出数据包,就发送NAK无效包,IN事务提前结束,到下一个IN事务才继续
设备出错时的IN事务处理,如果端点被永久停止无法返回数据,发送错误包STALL包,事务提前结束,总线进入空闲状态
1.2OUT事务
输出事务处理:表示USB主机把一个数据包输出到总线上的某个USB设备接收的过程。
- 令牌包阶段:主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;
- 数据包阶段:比较简单,就是主机会往设备送数据,DATA0与DATA1交替
- 握手包阶段:设备根据情况会作出三种反应
正常的输出事务处理:设备给主机返回 ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息
设备忙时的输出事务处理:无法给主机返回ACK,就发送NAK无效包,表示数据已经无错误地接收,但由于功能端点处于暂时无法接受数据的状态(例如,缓冲区已满),主机应重新发送数据。
设备出错的输出事务处理:发送错误包STALL包,事务提前结束,总线进入空闲状态。
1.3SETUP事务
- 令牌包阶段:主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;
- 数据包阶段:比较简单,就是主机往设备送数据,注意,这里只有一个固定为8个字 节的DATA0包,这8个字节的内容就是标准的USB设备请求命令。
- 握手包阶段:设备接收到主机的命令信息后,返回 ACK,此后总线进入空闲状态, 并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)。
正常的SETUP事务处理
设备忙时的SETUP事务处理
设备出错时的SETUP事务处理
2 传输
2.1批量传输
批量传输的特点是通过错误检测和重试来保证在主机和设备之间无误地传递数据。批量传输(Bulk Transfer)是USB中一种用于大容量、低优先级的数据传输方式。它主要用于那些对数据传输的实时性要求不高,但需要可靠性的场景。如打印机,U盘等。
-
批量传输由OUT事务和IN事务构成
-
低速设备不支持批量传输,高速批量端点的最大包长度为512,而全速批量端点的最大包长度可以是8、16、32或64
-
批量传输在访问USB总线时,相对于其他传输类型具有最低的优先级
-
高速的批量端点必须支持PING操作,以向主机报告端点的状态
批量大数据传输
当数据量较大时,采用切换DATA0/DATA1 PID来实现数据切换同步。主机始终使用配置事件初始化总线传输到 DATA0 PID 的第一个事务。第二个事务使用 DATA1 PID,连续的数据传输交替进行批量传输的其余部分。数据包发送器在收到 ACK 后进行切换,接收器在收到并接受有效数据包后进行切换。如果切换失败,如在发送DATA0,再次发送DATA0而不是DATA1,则错误计数器加一,USB允许连续三次以下的错误,若发送错误则重传,如果重传超过三次,HOST就会认为该端点已损坏STALL,并放弃该对端点的传输任务。
2.2控制传输
控制传输包含三个事务阶段分别是,建立(SETUP)阶段,数据(DATA)阶段,状态(STATUS)阶段,其中数据阶段是可选的。控制传输的用途非常广泛,包括配置USB设备、读取设备信息、进行设备初始化等。在USB中,大多数与设备配置和管理相关的操作都会使用控制传输。
建立阶段
建立阶段(Setup Stage)是控制传输的第一阶段,通常由SETUP事务触发。该阶段的作用是向USB设备的控制端点传递信息,以执行特定的控制操作。在典型的控制传输中,建立阶段用于发送控制请求,例如设备初始化、配置设备、获取设备描述符等。根据USB规范,建立阶段的数据包使用DATA0 PID。SETUP事务与OUT事务在格式上相似,但使用SETUP PID而不是OUT PID。SETUP事务始终使用DATA0 PID作为SETUP事务的数据字段。接收SETUP的设备必须接受SETUP数据并回复ACK;如果数据损坏,则丢弃数据并不返回握手。
数据阶段
控制传输的数据阶段(Data Stage)是控制传输的第二个阶段,如果存在的话。该阶段由一个或多个IN或OUT事务组成,遵循与批量传输相同的协议规则。在数据阶段中的所有事务必须是相同方向的(即全部是IN或全部是OUT)。在建立阶段期间,指定了数据阶段中要发送的数据量以及其方向。如果数据的量超过预先协商的数据包大小,数据将通过多个事务(IN或OUT)进行发送,这些事务携带最大数据包大小。任何剩余的数据将在最后一个事务中作为剩余数据发送。
状态阶段
控制传输的状态阶段是序列中的最后一个事务,用于完成之前阶段的确认和结束控制传输。状态阶段事务遵循与批量传输相同的协议顺序。在高速操作的设备中,状态阶段还包括 PING 协议。状态阶段通过数据流方向与前一阶段的变化来划分,始终使用 DATA1 PID。例如,如果数据阶段由 OUT 事务组成,则状态是一个单独的 IN 事务。如果控制序列没有数据阶段,则它由一个设置阶段后跟一个状态阶段组成,后者包含一个 IN 事务。
主要作用包括:
-
确认操作的成功或失败:在控制传输的数据阶段,设备执行主机的请求并提供相应的数据。状态阶段用于确认主机是否成功接收了数据或者设备是否成功执行了请求。如果有数据阶段,ACK表示成功,而如果没有数据阶段,IN 事务的 ACK 也表示成功。
-
通知下一个控制传输的开始:在控制传输中,状态阶段通常标志着一个传输的结束。下一个控制传输可以是由主机或设备发起的,状态阶段的完成允许系统准备执行下一个控制传输。
2.3中断传输
中断传输在USB中用于在设备和主机之间传递短小且实时性要求不高的数据。这种传输类型适用于需要及时响应但数据量相对较小的应用,例如鼠标、键盘或其他需要定期发送短小数据包的设备。中断传输具有周期性,以确保数据及时传输,但并不像同步传输那样有严格的时间限制。
数据传输
-
中断传输既可以是设备发送数据给主机(IN传输),也可以是主机发送数据给设备(OUT传输)
-
主机希望从设备获取中断信息时,它发送一个IN令牌。设备在接收到IN令牌后,可以采取以下行动之一:
返回数据包:如果有中断信息等待传输,设备将其作为数据包返回给主机。
返回NAK:如果没有中断信息等待传输,设备可能返回NAK握手,表示暂时无数据可传。
返回STALL:如果中断端点的Halt功能被设置,设备可能返回STALL握手,表示由于某些错误或条件,该端点无法传输数据。
-
如果设备返回数据包,该数据包携带中断信息。主机在接收数据包后,可以发出ACK握手表示数据接收正常,或者不发送握手,表示数据包已损坏。
-
对于高速/全速/低速端点,最大包长度分别可以达到 1024/64/8 Bytes。高速中 断传输不得占用超过 80%的微帧时间,全速和低速不得超过 90%。
- 除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输。高速高带宽端点最多 可以在一个微帧内进行三次中断事务传输,传输高达 3072 字节的数据。
周期性
中断传输是周期性的,其周期由设备和主机之间的协商确定。这确保了在一定时间间隔内能够及时传递中断信息,适用于需要实时响应的应用。主机通过固定的时间间隔对设备的中断端点进行查询。这是为了检查是否有中断信息等待传输或设备是否准备好接收数据。如果中断端点有待传输的中断信息,主机将请求数据传输。反之,如果主机有数据要发送给设备的中断端点,它将发送数据。中断端点的轮询间隔由端点描述符中定义。全速端点的轮询间隔可以在1到255毫秒之间选择;低速端点的轮询间隔为10到255毫秒;高速端点的轮询间隔由(2^interval-1)*125微秒确定,其中interval的取值范围是1到16。
优先级
中断传输被赋予较高的优先级,这意味着在USB总线上,中断传输的请求和处理会相对优先于其他类型的传输,除了同步传输以外。这使得中断传输能够更及时地响应和处理中断事件,适用于需要较快响应时间的应用场景。
2.4同步传输
同步传输在USB系统中的作用是支持实时性要求较高的应用,主要用于音频和视频传输等场景。
-
同步传输只包括令牌阶段和数据阶段,没有握手阶段。在数据包阶段所有的数据包都为DATA0
-
它是一种不可靠不支持错误重传机制但实时性高的传输。
-
只有高速和全速端点支 持同步传输,高速同步端点的最大包长度为 1024,全速的为1023。
-
除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多 可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。全速同步传输不得 占用超过 80%的帧时间,高速同步传输不得占用超过 90%的微帧时间。
-
同步传输通常需要固定的带宽,以确保在规定的时间内传输数据。这有助于避免其他传输类型对同步传输的干扰,从而保证了实时传输的可靠性。同步端点的访问也 和中断端点一样,有固定的时间间隔限制。
-
在USB传输的优先级中,同步传输通常具有最高的优先级。这是因为实时传输需要更严格的时间约束,以确保音频和视频等数据能够按时传输,而不受其他传输类型的影响。
3 传输优先级
在USB中,各种传输类型的优先级如下所示:
同步传输(Isochronous Transfer):同步传输具有最高的优先级。这是因为同步传输通常用于实时性要求非常高的应用,例如音频和视频传输。在同步传输中,数据的实时性对于维持良好的用户体验至关重要。
批量传输(Bulk Transfer):批量传输的优先级较低,仅次于同步传输。批量传输用于大容量数据传输,对于这些传输,时间延迟并不是关键因素,但数据的可靠性和正确性仍然很重要。
控制传输(Control Transfer):控制传输的优先级略低于批量传输。控制传输用于设备配置、管理和控制,通常在需要较低带宽和实时性的情况下使用。
中断传输(Interrupt Transfer):中断传输的优先级最低,仅次于批量传输。中断传输通常用于周期性地传输小量数据,例如设备状态更新。中断传输的周期性能够提供相对实时性,但不如同步传输那么严格。
参考:
[2] USB2.0中文版协议详解
---------------------------------------------------------------------------------------------------------------------------------
需重新编辑3/24/2025