深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

深入理解USB2.0通信协议——深度剖析USB事务

导言

在 USB 中,事务(Transaction)是指在 USB 总线上进行数据传输的基本单元。每个事务包括一个或多个数据包,用于有效地在主机和设备之间传递信息。USB 规范明确定义了几种事务类型,每种类型都专门用于处理特定的数据传输场景。主要的事务类型包括 OUT 事务、IN 事务、SETUP 事务等。

图片[1]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

1事务组成 

图片[2]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

一个USB事务通常有三种包组成,分别是令牌包、数据包和握手包,这三种包的组合形成了一个完整的 USB 事务,通过这种方式,USB 设备和主机之间可以进行可靠的数据交换。

如果设备对主机的请求做出响应,并且相关的循环冗余校验(CRC)正确,整个通信事件将在一个事务中完成。如果设备以 NAK 或 STALL 的形式做出响应,根据应用的要求,主机将在下一个预定的帧上重试该事务。在多次不成功的重试后,主机可能会使用控制命令暂停设备。

在接下来的事务介绍中,会以蓝色块作为来自主机(Host)的数据,以绿色块作为来自设备(Device)的数据,如下图所示:

图片[3]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

2OUT事务

OUT事务用于将有效负载数据从主机发送到指定的外部设备端点,这一过程通过一系列的数据包和握手包来完成。

OUT事务包括以下三个阶段:

1.数据令牌(Token):事务的开始由主机发起,主机发送一个数据令牌,其中包含了目标端点地址和事务方向(OUT)。这个数据令牌指示了外部设备应该接收数据的端点。

2.数据包(Data):随后的数据包携带了实际的数据负载,这是主机要传输到外部设备的信息。数据包中的PID(数据标记位)可能是DATA0或DATA1。

3.握手包(Handshake):最后,接收端点将返回一个握手包,用于确认数据的接收情况。握手包可能是ACK(成功接收并接受数据)、NAK(拒绝数据,需要重试)或STALL(指示设备无法接收数据)。

OUT事务正常传输

在正常的OUT事务中,设备在接收到数据包后会向主机发送一个ACK以确认成功接收。这通知主机数据已经安全抵达,随后主机就可以继续发送新的数据。值得注意的是,在接收到ACK后,主机在发送数据包时会交替使用DATA0和DATA1这两种PID,以保持数据的同步状态。

图片[4]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[5]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

OUT事务设备无法接收数据

在设备无法接收数据的情况下,例如设备繁忙或者其接收缓冲区已满,设备会向主机发送NAK,通知主机重新发送数据。需要注意的是,当设备返回NAK时,主机将继续发送先前未成功传输的数据,而不会更改数据包的PID。这意味着数据包的PID将保持一致,而不会像在ACK情况下那样交替切换。

图片[6]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[7]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

OUT事务数据包损坏

在主机发送数据包损坏的情况下,例如设备接收到的数据CRC校验错误,设备会向主机发送STALL。STALL的目的是通知主机数据错误,同时结束当前的事务。随后,USB总线将进入空闲状态,等待可能的重传(如果重传,STALL和NAK对于数据包PID的处理是相同的)或其他处理。STALL的发送表明设备不能接受或处理当前的数据包,可能由于数据包的损坏或其他错误。主机会根据需要采取相应的措施,可能会进行重传、中断通信,或者根据具体情况采取其他处理方式。

图片[8]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

OUT事务令牌包损坏

如果在OUT事务中,设备接收到的令牌包损坏,如CRC校验错误,设备会忽略该错误的令牌包,并且不会响应该事务。设备通常会等待下一个令牌包,以期望在下一个事务中收到正确的令牌包。主机会根据超时或其他机制,再次尝试发送相同的事务,以确保数据的可靠传输。

3IN事务

IN事务是一种用于从设备向主机传输数据的类型。与OUT事务类似只是数据方向不同,通常涉及三个主要的数据包:令牌包、数据包和握手包。令牌包由主机发送,其中包含了请求数据的信息。数据包携带实际的数据内容,而握手包则用于在主机和设备之间传递状态和确认信息。在IN事务中,设备充当数据的源,而主机则是数据的目的地。设备收到主机的令牌包后,会在随后的数据包中发送请求的数据。主机在接收数据包后,可能会返回一个握手包,以确认数据的接收情况。

IN事务正常传输

在正常的IN事务中,设备收到主机的令牌包后,会在随后的数据包中发送请求的数据,主机在接收到设备发送的数据包后会向设备发送一个ACK以确认成功接收。这通知设备数据已经安全抵达,随后设备就可以继续发送新的数据。值得注意的是,在接收到ACK后与IN事务类似,设备在发送数据包时会交替使用DATA0和DATA1这两种PID,以保持数据的同步状态。

图片[9]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

IN事务设备无法接收数据

当设备收到主机的令牌包时,如果设备当前无法接收数据,例如设备正在处理其他任务或其接收缓冲区已满,设备会向主机发送NAK,以通知主机当前情况。NAK表示设备暂时无法接收请求的数据,因此当前的IN事务结束,设备将等待下一个IN事务的到来,以便继续数据传输。

主机在收到NAK后,具体的行为取决于通信的上下文和应用场景。一般情况下,主机可能会采取以下一些操作:

1.重试:主机可以选择在稍后的时候重新发起相同的IN事务,以查看设备是否已准备好接收数据。这可以是在下一个帧或帧的某个点,具体取决于系统的要求。

2.等待:主机也可以选择等待一段时间,以便设备有足够的时间来处理其当前任务,然后再次尝试进行IN事务。

3.处理错误:在某些情况下,主机可能会根据NAK的原因采取其他措施,例如中断传输、进行错误处理或采取特定的应用逻辑。

图片[10]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

IN事务设备发送端点触发停滞功能(Function Tx Endpoint Halt Feature)

在USB中,Function Tx Endpoint Halt Feature(功能传输端点停滞功能)是一种用于暂停数据传输的机制。如果设备发送端点触发了停滞功能,当设备收到IN事务的令牌后,会返回STALL。通知主机:设备端点暂停接收数据,主机将不再尝试在该端点上进行数据传输,直到Halt Feature被清除。主机可以通过特定的命令或操作来清除Halt Feature,以便恢复正常的数据传输。

以下是触发Function Tx Endpoint Halt Feature的一些常见情况:

1.错误处理:当传输数据的端点出现错误时,设备可能会触发Halt Feature,以指示主机暂停在该端点上的数据传输。例如,如果接收到的数据包的CRC校验失败,设备可能会暂停相应的端点。

2.设备繁忙:如果设备当前无法及时处理传入的数据,可能会触发Halt Feature。这通常是在设备的数据缓冲区已满或设备正在处理其他任务时发生的。

3.主机控制:在某些情况下,主机可以通过控制命令显式地将某个端点的Halt Feature设置为暂停传输。这可以通过在USB总线上发送相关的命令来实现。

4.命令控制:设备可能会通过命令控制来触发端点的Halt Feature,例如,在特定条件下,设备可以通过接收到的特殊命令主动暂停传输。

「Hatl Feature与NAK的区别」在IN事务中,如果设备无法接收数据,可以返回NAK,通知主机设备暂时无法接收数据。这是一种暂时的、可恢复的状态,主机会在稍后的时间再次尝试发送数据。Halt Feature是一种更强烈的暂停机制,表示端点停滞,可能是由于某些错误或问题导致的,需要主机进行特殊的处理来清除这个状态。在Halt状态下,主机将不再尝试在该端点上进行数据传输,直到Halt Feature被清除。清除Halt Feature通常需要主机发出特定的命令或采取适当的措施。

图片[11]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

IN事务令牌包损坏

在IN事务中,如果主机发送的令牌包损坏,他与OUT事务处理方式是一样的。因此不做赘述。

IN事务主机无法接收数据或数据包损坏

在IN事务中,如果设备发送给主机数据包,而主机无法接收数据(例如,接收缓冲区已满或者主机处于繁忙状态)或者主机接收的数据包损坏,主机将会丢弃该数据包,并且不会做出任何响应。这种情况下,主机不会发送ACK或者其他握手信号,因为主机未能成功接收数据。这样的处理方式是为了确保在主机无法处理或接收数据时,不会引起通信错误或数据混乱。主机可以在适当的时候重新尝试进行数据传输,或者执行其他相关的错误处理策略。

4SETUP事务

SETUP事务是一种特殊类型的事务,用于初始化和配置设备以及执行控制操作。SETUP事务仅作用于控制端点,如果非控制端点收到 SETUP 令牌,则它必须忽略该事务并且不返回任何响应。

SETUP事务通常包含三个阶段:SETUP阶段、DATA阶段和HANDSHAKE阶段。

1.SETUP阶段:主机向设备发送SETUP令牌包,其中包含了用于指示设备应执行的控制请求的信息。这些信息包括设备地址、端点号、数据传输方向(如读或写)、请求类型和请求码等。SETUP阶段的目的是告知设备将要执行的控制操作。

2.DATA阶段:该阶段只有在SETUP事务需要传输数据时才会出现。根据SETUP阶段的请求类型和方向,可能需要在DATA阶段传输数据。如果主机需要从设备获取信息,数据阶段将是IN方向;如果主机需要向设备发送信息,数据阶段将是OUT方向。下图的DATA阶段仅用“主机需要向设备发送信息的DATA传输”做一个代表。

3.HANDSHAKE阶段:其中设备向主机返回一个握手包,表示对SETUP事务的处理结果。握手包可以是ACK(操作成功)、NAK(操作无法完成,需要重试)或STALL(请求不受支持或操作失败)等。这个阶段是对SETUP事务的最终确认,用于确保设备和主机之间的通信状态正确。

SETUP事务正常传输

在USB通信中,一个成功的SETUP事务包含三个连续的数据包,与OUT事务类似,但数据有效负载恰好为8字节,并且令牌包中的SETUP PID通知设备,这是控制传输中的第一个事务。

与OUT事务不同,SETUP事务总是使用DATA0开始数据包。这是因为SETUP事务是控制传输的开始,而在控制传输中,数据包的开始通常使用DATA0 PID。在SETUP事务中,主机向设备发送包含控制请求信息的SETUP令牌包,然后可能在后续的数据阶段发送数据包,最后由设备返回握手包表示对操作的响应。

图片[12]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

SETUP事务设备无法接收数据

在SETUP事务中,设备无法接收数据的处理方式与OUT事务类似,因此不做赘述。

图片[13]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

SETUP事务数据包损坏

在SETUP事务中,数据包损坏设备的处理方式与OUT事务类似,因此不做赘述。

图片[14]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

SETUP事务令牌包损坏

在SETUP事务中,如果主机发送的令牌包损坏,他与OUT事务处理方式是一样的。因此不做赘述。

5数据切换同步

在IN和OUT事务中数据包阶段,PID是DATA0和DATA1交替使用的。是不是很好奇,为什么要有这种机制,一直发送DATA0或者DATA1不就可以成功完成一次事务的传输。试想一下,我们的发送器在什么情况下才能感知到数据被发送给接收器了呢,答案是发送器只有在接收到接收器返还的握手包(ACK,NAK,STALL),才能感知到数据被发送器接收,这是唯一的反馈机制。那如果握手包在传输过程中丢失或损坏了,发送器如何感知到接收器并未接收到发送器返还的握手包呢,这就引入了数据切换同步。

下图,发送端发出有效的数据包,被接收端成功获取,然而,ACK 握手已损坏。在事务 i 结束时,发送器和接收器之间的一致性会暂时丢失,这可以通过它们各自的序列位之间的不匹配来证明。接收方收到了正确的数据,但发送方不知道数据是否发送成功。在下一个事务中,发送器将使用先前的 DATA0 PID 重新发送先前的数据。接收器的序列位和数据PID将不匹配,因此接收器知道它之前已经接受过该数据。因此,它丢弃传入的数据包并且不切换其序列位。然后接收方发出 ACK,这会导致发送方将重试的事务视为成功。收到 ACK 会导致发送器切换其序列位。在事务 i+1 开始时,序列位已切换并再次同步。

图片[15]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug

6总结

本章主要讨论了OUT事务、IN事务、SETUP事务,并介绍了数据同步机制。USB事务是USB传输的基本单元。在下一章,我们将继续探讨USB传输的相关内容。

7往期回顾

1.深入理解USB2.0通信协议——框架概述

2.深入理解USB2.0通信协议——数据流传输模型

3.深入理解USB2.0通信协议——电气及物理层规范

4.深入理解USB2.0通信协议——解读USB报文的神秘语言!

8写在最后

创作不易,如果觉得这篇文章对您有用的话,记得点赞关注哦~

END

图片[16]-深入理解USB2.0通信协议——深度剖析USB事务-Anlogic-安路社区-FPGA CPLD-ChipDebug