Categories
坐骑幻化

USB笔记 USB2.0 包格式Packet Formats 握手包Handshake Packets

说明

介绍的是USB 2.0协议中包格式(Packet Formats)的握手包(Handshake Packets)。

介绍

握手包(Handshake packets)里只有一个PID。握手包用于报告数据事务(data transaction)的状态,并可以返回表示成功接收数据、命令接受或拒绝、流控制(flow control)和停止条件(halt conditions)的值。只有支持流控制的事务类型(transaction types)才能返回握手。握手总是在事务的握手阶段(handshake phase)返回,并且可能在数据阶段(data phase)返回,而不是返回数据。握手包在包字段(packet field)的一个字节后由EOP进行分隔。如果一个包被解码为有效的握手,但在一个字节后没有以EOP结束,那么它必须被认为是无效的,并且被接收器忽略。

握手包(Handshake packets)的包格式(Packet Formats)如图所示:

有四种类型的握手包ACK, NAK, STALL, NYET,和一种特殊的握手包ERR。

下面进行具体介绍。

ACK

ACK表示主机或设备已正确接收到数据。

TypeValuePID TypeHandshakePID NameACKPID<3:0>0010BPID value<7:0>0xD2Transfer types used incontrol, bulk, interruptTransaction TypeSETUP, OUT, IN, PINGSourcehost, deviceBus Speedhigh, full, lowDescriptionReceiver accepts error-free data packetACK表示接收到的数据包(data packet)在数据字段(data field)上没有位填充(bit stuff)或CRC错误,并且数据PID已正确接收。当序列位(sequence bits)匹配并且接收器可以接受数据时,或者当序列位不匹配并且发送器和接收器必须彼此重新同步(resynchronize)时,可以发出ACK。ACK握手仅适用于已传输数据并且期望握手的事务。主机可以对IN事务返回ACK,设备可以对OUT、SETUP或PING事务返回ACK。

下面看下ACK在Bulk Transaction, Control Transfers和Interrupt Transactions中的位置

Bulk Transaction

Control SETUP Transaction

Interrupt Transaction

ACK示例

这里展示下ACK在SETUP, OUT, IN, PING Transaction的示例

SETUP

OUT

IN

PING

NAK

NAK表示设备正忙或没有要返回的数据。

TypeValuePID TypeHandshakePID NameNAKPID<3:0>1010BPID value<7:0>0x5ATransfer types used incontrol, bulk, interruptTransaction TypeOUT, IN, PINGSourcedeviceBus Speedhigh, full, lowDescriptionReceiving device cannot accept data or transmitting device cannot send dataNAK表示设备不能接收来自主机(OUT)的数据,或者设备没有要传输到主机(IN)的数据。NAK只能由IN事务的数据阶段(data phase)或者OUT或PING事务的握手阶段(handshake phase)的设备返回。NAK用于实现流控制(flow control),以表示设备暂时不能发送或接收数据,但最终将能够发送或接收数据,而不需要主机干预。主机永远不能发出NAK。 等时事务(Isochronous Transactions)不使用NAK,因为它们没有用于返回NAK的握手包。 如果设备或主机未收到传输的等时数据,则数据就会丢失。

NAK在Bulk Transaction, Control Transfers和Interrupt Transactions中的位置可以参照ACK章节的图示。

NAK示例

这里展示下NAK在OUT, IN, PING Transaction的示例

OUT

IN

PING

STALL

STALL表示控制请求不受支持、控制请求失败或端点失败。

TypeValuePID TypeHandshakePID NameSTALLPID<3:0>1110BPID value<7:0>0x1ETransfer types used incontrol, bulk, interruptTransaction TypeOUT, IN, PINGSourcedeviceBus Speedhigh, full, lowDescriptionEndpoint is halted or a control pipe request is not supportedSTALL由设备在响应IN令牌(IN token)或OUT的数据阶段(data phase)后,或响应PING事务(PING transaction)时返回。

例如下图的Bulk Transaction在IN,OUT,PING Transaction的STALL响应:

STALL表示设备无法发送或接收数据,或者不支持控制管道(control pipe)请求。在返回STALL后,设备的状态(对于除默认端点以外的任何端点)未定义。主机在任何情况下都不允许返回STALL。

设备在以下两种情况下使用STALL握手。

第一种情况,称为“功能停止(functional stall)”,即设置了与端点关联的停止特性(Halt feature)。STALL作为端点的停止特性(Halt feature)被设置时的响应,这意味着端点根本无法发送或接收数据。 功能停止的一种特殊情况是“命令停止(commanded stall)”。当主机明确设置端点的停止特性时,就会发生命令停止。一旦设备的端点被停止,设备必须继续返回STALL,直到通过主机干预清除了引起停止的条件。

批量和中断端点(Bulk and interrupt endpoints )必须支持功能停止(functional stall)。

控制管道也可以支持功能停止(functional stall),但是不建议这样做。 这是一种退化的情况,因为控制管道上的功能停止(functional stall)表明它已失去与主机进行通信的能力。 如果控制管道确实支持功能停止(functional stall),则它必须具有停止特性(Halt feature),主机可以设置或清除该功能。

等时事务(Isochronous transactions)不使用STALL,因为它们没有用于返回STALL的握手包。增强型超高速控制端点不使用功能停止(functional stall)。 在接收到功能停止(functional stall)时,主机会丢弃所有对设备的待处理请求,并且在主机发送成功的控制请求以清除设备上的停止特性(Halt feature)之前,不会恢复通信。

第二种情况,称为“协议停止(protocol stall)”。协议停止对于控制管道(control pipes)是唯一的。协议停止与功能停止(functional stall)的含义和持续时间上不同。协议停止在控制传输的数据或状态阶段(Data or Status stage)返回,并且STALL条件在下一个控制传输(Setup)开始时终止。

控制传输的控制管道具有返回STALL握手的能力。如果设备无法完成命令,它就会在控制传输的数据或状态阶段(Data or Status stages )返回一个STALL。与功能停止(functional stall)的情况不同,协议停止(protocol stall)并不表示设备出错。协议停止(protocol stall)的情况会持续到接收到下一个SETUP事务(SETUP transaction)为止,在收到SETUP事务之前,设备将响应管道上的任何IN或OUT事务返回STALL。一般来说,协议停止(protocol stall)表示设备不理解请求或其参数,因此提供了一种扩展USB请求的机制。

例如,如果主机发送Set Configuration请求将设备配置设置为2,而设备只支持配置1,则设备返回STALL。要清除这种类型的stall,主机将发送另一个Setup包以开始新的控制传输(control transfer)。

STALL示例

NYET

NYET表示设备接收了一个无错误的数据包,但还没有准备好接受另一个数据包,或者集线器还没有完成分割事务(split-transaction)。

TypeValuePID TypeHandshakePID NameNYETPID<3:0>0110BPID value<7:0>0x96Transfer types used incontrol write, bulk OUT, split transactionsTransaction TypeOUTSourcedeviceBus SpeedhighDescriptionNo response yet from receiverNYET是一种在高速(high-speed)中才有的握手,只在以下两种情况下返回。

一种情况是,它作为PING协议的一部分由高速端点(high-speed endpoint)返回。

高速批量和控制传输支持NYET。在接收到一个数据包之后,端点可以返回一个NYET握手,表示该端点接收了数据,但是还没有准备好接收另一个数据包。当主机认为端点可能已准备就绪时,主机可以发送PING令牌包(PING token packet),如果端点已经准备好接收下一个数据包,那么端点将返回ACK,或者如果端点未准备就绪,则返回NAK或STALL。主机和低速或全速设备从不发送NYET。

另一种是,当集线器(hub)在全/低速事务(full-/low-speed transaction)中尚未完成或无法处理分割事务(split-transaction)时,可以返回NYET以响应分割事务(split-transaction)。

NYET示例

ERR

ERR用于报告从高速集线器返回的分割事务中的低速或全速错误。

TypeValuePID TypeSpecial HandshakePID NameERRPID<3:0>1100BPID value<7:0>0x3CTransfer types used inallSourcehubBus SpeedhighDescriptionSplit Transaction Error Handshake (reuses PRE value)ERR是一种在高速(high-speed)中才有的握手,将其返回以允许高速集线器(high-speed hub)在全/低速总线(full-/low-speed bus)上报告错误。它仅由高速集线器作为分割事务协议(split transaction protocol)的一部分返回。

附录

Universal Serial Bus Specification Revision 2.0

Bulk Transactions

Control SETUP Transaction

Interrupt Transaction

参考资料

Universal Serial Bus Specification Revision 2.0

USB Complete, 5th Edition

本文链接:https://blog.csdn.net/u012028275/article/details/112427189