sunsili 发表于 2024-4-11 11:09:27

深入理解USB2.0通信协议——探秘USB传输机制

本帖最后由 sunsili 于 2024-4-11 11:11 编辑

深入理解USB2.0通信协议——探秘USB传输机制


导言
我们在前几节,分别讲解了包和事务,包是事务的基本单元,而事务是传输的基本单元,USB传输(transfer)是在USB总线上进行数据交换的基本过程。这涉及到将数据从一个USB设备传输到另一个USB设备或从主机传输到设备,以满足各种应用需求。USB传输分为以下四种,批量传输,中断传输,等时传输,控制传输。本节将深入探讨USB传输的基本原理和相关概念,帮助理解USB在各种设备之间可靠传输数据的方法。
1 批量传输(Bulk Transfer)

批量传输的特点是通过错误检测和重试来保证在主机和设备之间无误地传递数据。批量传输(Bulk Transfer)是USB中一种用于大容量、低优先级的数据传输方式。它主要用于那些对数据传输的实时性要求不高,但需要可靠性的场景。如打印机,U盘等。
[*]批量传输由OUT事务和IN事务构成
[*]低速设备不支持批量传输,高速批量端点的最大包长度为512,而全速批量端点的最大包长度可以是8、16、32或64
[*]批量传输在访问USB总线时,相对于其他传输类型具有最低的优先级
[*]高速的批量端点必须支持PING操作,以向主机报告端点的状态

IN事务批量传输过程说明
[*]当主机准备接收批量数据时,它发送一个IN令牌。
[*]功能端点接收到IN令牌后,会做出相应的响应。
    a.如果端点能够返回数据,它会回应一个数据包    b.如果端点暂时无法返回数据,它会返回NAK    c.如果端点被永久停止无法返回数据,它会返回STALL
[*]主机的响应
    a.如果主机成功接收到有效的数据包,它会回应一个ACK握手    b.如果在接收数据时主机检测到错误,它将不返回任何握手给功能端点

OUT事务批量传输过程说明
[*]当主机准备发送批量数据时,首先发送一个OUT令牌包,接着是一个数据包
[*]功能端点的响应它将返回以下三种握手之一(在高速设备上还包括NYET):ACK:表示数据包已经无错误地接收,主机可以发送下一个序列中的数据包。NAK:表示数据已经无错误地接收,但由于功能端点处于暂时无法接受数据的状态(例如,缓冲区已满),主机应重新发送数据。STALL:如果端点已被停滞,表示主机不应重试传输,因为功能端点存在错误条件。
如果数据包在接收过程中存在CRC或比特填充错误,功能端点将不返回任何握手。

批量大数据传输
当数据量较大时,采用切换DATA0/DATA1 PID来实现数据切换同步。主机始终使用配置事件初始化总线传输到 DATA0 PID 的第一个事务。第二个事务使用 DATA1 PID,连续的数据传输交替进行批量传输的其余部分。数据包发送器在收到 ACK 后进行切换,接收器在收到并接受有效数据包后进行切换。如果切换失败,如在发送DATA0,再次发送DATA0而不是DATA1,则错误计数器加一,USB允许连续三次以下的错误,若发送错误则重传,如果重传超过三次,HOST就会认为该端点已损坏STALL,并放弃该对端点的传输任务。



2 控制传输(Control Transfer)
控制传输包含三个事务阶段分别是,建立(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;如果数据损坏,则丢弃数据并不返回握手。
下面是一个例子:
主机通过发送设置令牌包来启动(由 H↓ 指示)控制传输。请注意,PID 指定了 SETUP,表示设置令牌。PID 后跟设备地址和端点地址。对于控制传输,该端点地址始终为 0。
接下来,主机发送数据包。PID 为 DATA0,该值用于数据包的排序。PID 后跟的 8 字节包含有关此请求的主要信息。这 8 字节指示请求的类型以及设备将在其响应中写入的缓冲区的大小。
在这个控制(读取)传输中,主机发送了一个请求,以检索设备描述符,并指定 18 字节作为传输长度,以容纳该描述符。设备发送这 18 字节的方式取决于默认端点在一次事务中可以发送多少数据。这些信息包含在设备在数据事务中返回的设备描述符中。作为响应,设备发送了一个握手包(由 D↓ 指示)。请注意,PID 值为 ACK(ACK 包)。这表示设备已确认了事务。

数据阶段
控制传输的数据阶段(Data Stage)是控制传输的第二个阶段,如果存在的话。该阶段由一个或多个IN或OUT事务组成,遵循与批量传输相同的协议规则。在数据阶段中的所有事务必须是相同方向的(即全部是IN或全部是OUT)。在建立阶段期间,指定了数据阶段中要发送的数据量以及其方向。如果数据的量超过预先协商的数据包大小,数据将通过多个事务(IN或OUT)进行发送,这些事务携带最大数据包大小。任何剩余的数据将在最后一个事务中作为剩余数据发送。
下面是一个例子:
[*]在收到建立阶段的ACK握手包后,主机启动数据事务。为了启动事务,它发送一个方向为IN的令牌包(称为IN令牌)。作为响应,设备发送了一个跟随IN令牌的数据包。这个数据包包含实际的设备描述符。第一个字节表示设备描述符的长度,为18字节(0x12)。在这个数据包中,最后一个字节表示默认端点支持的最大数据包大小。在这种情况下,我们看到设备可以通过其默认端点一次发送8字节。


[*]在设置事务中的数据包的wLength字段中,主机请求了18字节。在数据事务中,我们看到只有设备描述符的前8字节被设备接收。那么,主机如何接收存储在剩余10字节中的信息呢?设备通过两个事务来完成:8字节,然后是最后的2字节。现在主机知道了默认端点的最大数据包大小,它启动了一个新的数据事务,并根据数据包大小请求下一部分。



[*]主机通过发送一个IN令牌并从设备请求下一个8字节来启动上述的数据事务。设备回应一个包含设备描述符的下一个8字节的数据包。在收到这8字节后,主机发送一个ACK数据包给设备。



[*]因此,我们看到要从设备向主机传输 18 个字节,主机会跟踪传输的字节数并发起三个数据传输 (8+8+2)。
[*]通过将合并的数据包映射到设备描述符的结构,我们获得了有关该设备的一些初步信息。该设备是低速 USB 麦克风。默认端点的最大数据包大小为 8 字节。该设备支持一种配置。

状态阶段
控制传输的状态阶段是序列中的最后一个事务,用于完成之前阶段的确认和结束控制传输。状态阶段事务遵循与批量传输相同的协议顺序。在高速操作的设备中,状态阶段还包括 PING 协议。状态阶段通过数据流方向与前一阶段的变化来划分,始终使用 DATA1 PID。例如,如果数据阶段由 OUT 事务组成,则状态是一个单独的 IN 事务。如果控制序列没有数据阶段,则它由一个设置阶段后跟一个状态阶段组成,后者包含一个 IN 事务。
主要作用包括:
[*]确认操作的成功或失败:在控制传输的数据阶段,设备执行主机的请求并提供相应的数据。状态阶段用于确认主机是否成功接收了数据或者设备是否成功执行了请求。如果有数据阶段,ACK表示成功,而如果没有数据阶段,IN 事务的 ACK 也表示成功。
[*]通知下一个控制传输的开始:在控制传输中,状态阶段通常标志着一个传输的结束。下一个控制传输可以是由主机或设备发起的,状态阶段的完成允许系统准备执行下一个控制传输。
下面是一个例子:
[*]在状态阶段,主机发送一个OUT令牌包(OUT token packet),其目的是验证设备是否成功发送了所有请求的数据。在这个状态事务中,不会发送数据包。设备在确认接收到该OUT令牌包后,会回复一个ACK握手包。如果发生错误,PID可能是NAK或STALL。这一状态阶段的设计是为了确保数据的完整性,并验证设备是否按照主机的请求成功执行了数据传输。ACK握手包表示设备已经成功接收到OUT令牌包,而NAK或STALL则可能表示出现了错误,需要主机进一步处理。



3 中断传输(Interrupt Transfer)
中断传输在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总线上,中断传输的请求和处理会相对优先于其他类型的传输,除了同步传输以外。这使得中断传输能够更及时地响应和处理中断事件,适用于需要较快响应时间的应用场景。
4 同步传输(IsochronousTransfer)
同步传输在USB系统中的作用是支持实时性要求较高的应用,主要用于音频和视频传输等场景。
[*]同步传输只包括令牌阶段和数据阶段,没有握手阶段。在数据包阶段所有的数据包都为DATA0
[*]他是一种不可靠不支持错误重传机制但实时性高的传输。
[*]只有高速和全速端点支 持同步传输,高速同步端点的最大包长度为 1024,低速的为1023。
[*]除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多 可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。全速同步传输不得 占用超过 80%的帧时间,高速同步传输不得占用超过 90%的微帧时间。
[*]同步传输通常需要固定的带宽,以确保在规定的时间内传输数据。这有助于避免其他传输类型对同步传输的干扰,从而保证了实时传输的可靠性。同步端点的访问也 和中断端点一样,有固定的时间间隔限制。
[*]在USB传输的优先级中,同步传输通常具有最高的优先级。这是因为实时传输需要更严格的时间约束,以确保音频和视频等数据能够按时传输,而不受其他传输类型的影响。


5 传输优先级

在USB中,各种传输类型的优先级如下所示:同步传输(Isochronous Transfer):同步传输具有最高的优先级。这是因为同步传输通常用于实时性要求非常高的应用,例如音频和视频传输。在同步传输中,数据的实时性对于维持良好的用户体验至关重要。
批量传输(Bulk Transfer):批量传输的优先级较低,仅次于同步传输。批量传输用于大容量数据传输,对于这些传输,时间延迟并不是关键因素,但数据的可靠性和正确性仍然很重要。
控制传输(Control Transfer):控制传输的优先级略低于批量传输。控制传输用于设备配置、管理和控制,通常在需要较低带宽和实时性的情况下使用。
中断传输(Interrupt Transfer):中断传输的优先级最低,仅次于批量传输。中断传输通常用于周期性地传输小量数据,例如设备状态更新。中断传输的周期性能够提供相对实时性,但不如同步传输那么严格。
6 总结
本章主要涵盖了USB中的各种传输类型,包括同步传输、批量传输、控制传输和中断传输。在USB总线上,这些传输类型的选择取决于特定应用的需求。USB提供了灵活的传输机制,使得它适用于各种不同类型的设备和用途。通过理解每种传输类型的特点和用途,可以更好地设计和配置USB设备以满足特定的应用场景。


页: [1]
查看完整版本: 深入理解USB2.0通信协议——探秘USB传输机制