当前位置 博文首页 > dadalaohua的博客:【USB笔记】 USB2.0 包格式 握手包Handshake
介绍的是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表示主机或设备已正确接收到数据。
Type | Value |
---|---|
PID Type | Handshake |
PID Name | ACK |
PID<3:0> | 0010B |
PID value<7:0> | 0xD2 |
Transfer types used in | control, bulk, interrupt |
Transaction Type | SETUP, OUT, IN, PING |
Source | host, device |
Bus Speed | high, full, low |
Description | Receiver accepts error-free data packet |
ACK表示接收到的数据包(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中的位置
这里展示下ACK在SETUP, OUT, IN, PING Transaction的示例
SETUP
OUT
NAK表示设备正忙或没有要返回的数据。
Type | Value |
---|---|
PID Type | Handshake |
PID Name | NAK |
PID<3:0> | 1010B |
PID value<7:0> | 0x5A |
Transfer types used in | control, bulk, interrupt |
Transaction Type | OUT, IN, PING |
Source | device |
Bus Speed | high, full, low |
Description | Receiving device cannot accept data or transmitting device cannot send data |
NAK表示设备不能接收来自主机(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在OUT, IN, PING Transaction的示例
STALL表示控制请求不受支持、控制请求失败或端点失败。
Type | Value |
---|---|
PID Type | Handshake |
PID Name | STALL |
PID<3:0> | 1110B |
PID value<7:0> | 0x1E |
Transfer types used in | control, bulk, interrupt |
Transaction Type | OUT, IN, PING |
Source | device |
Bus Speed | high, full, low |
Description | Endpoint is halted or a control pipe request is not supported |
STALL由设备在响应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)。
NYET表示设备接收了一个无错误的数据包,但还没有准备好接受另一个数据包,或者集线器还没有完成分割事务(split-transaction)。
Type | Value |
---|---|
PID Type | Handshake |
PID Name | NYET |
PID<3:0> | 0110B |
PID value<7:0> | 0x96 |
Transfer types used in | control write, bulk OUT, split transactions |
Transaction Type | OUT |
Source | device |
Bus Speed | high |
Description | No response yet from receiver |
NYET是一种在高速(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)。
ERR用于报告从高速集线器返回的分割事务中的低速或全速错误。
Type | Value |
---|---|
PID Type | Special Handshake |
PID Name | ERR |
PID<3:0> | 1100B |
PID value<7:0> | 0x3C |
Transfer types used in | all |
Source | hub |
Bus Speed | high |
Description | Split 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
cs