基本上在每次IN,OUT或SETUP事务之后,我们在事务结束时都有一个ACK / NAK数据包。如果握手包是每个传输的一部分,因为它是在令牌包之前的数据包之后,那么为什么我们需要一个状态阶段?这似乎存在于控制转移中。
答案 0 :(得分:1)
在协议中,端点处于以下状态:ACTIVE,HALT,STALL,...
在状态阶段,确定此状态(GET_STATUS
(0x00)请求(http://www.beyondlogic.org/usbnutshell/usb6.shtml))
状态阶段检查有点像整个请求的CRC校验和,而不是每个数据包。
http://www.beyondlogic.org/usbnutshell/usb4.shtml:
<强>&#34; 强>
状态阶段报告整体请求的状态,这又因转移方向而异。状态报告始终由功能执行。
IN :如果主机在数据阶段发送IN令牌以接收数据,则主机必须确认此数据的成功接收。这是由主机发送OUT令牌后跟零长度数据包完成的。该功能现在可以在握手阶段报告其状态。 ACK表示功能已完成,命令现在已准备好接受另一个命令。如果在处理此命令期间发生错误,则该函数将发出STALL。但是,如果该功能仍处理,则返回NAK,指示主机稍后重复状态阶段。
OUT :如果主机在数据阶段发送OUT令牌以传输数据,则该功能将通过发送零长度数据包来响应IN令牌来确认数据的成功接收。但是,如果发生错误,它应该发出STALL,或者如果它仍然忙于处理数据,它应该发出NAK,要求主机稍后重试状态阶段。
<强>&#34; 强>
或查看http://wiki.osdev.org/Universal_Serial_Bus
<强>&#34; 强> 最后,从函数到主机的STATUS事务指示[控制]传输是否成功。 的&#34; 强>