库里面的中断部分处理的部分代码:
void CTR_LP(void)
{
.....
SaveRState = _GetENDPOINT(ENDP0);
SaveTState = SaveRState & EPTX_STAT;
SaveRState &= EPRX_STAT;
SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK)
.....
_ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
Setup0_Process();
/* before terminate set Tx & Rx status */
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
........
}
问题1:下面的理解是否正确?
_ClearEP_CTR_RX(ENDP0)执行之后,设备的硬件会立刻给主机发送一个ACK握手包?
问题2:下面的理解是否正确?
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState)只是说明设备准备好了收或者发数据。
但此时设备不能立刻把已经准备好的数据发送给主机,而是要等IN令牌包过来。
收到IN令牌包的一瞬间,设备的硬件自动把待发的数据发送给主机。
问题3:下面的理解是否正确?
因为一开始的时候设置了SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK),所以在执行_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState)之前,对来自主机的任何令牌包,设备都会不予接收而回复NAK。在设备回复NAK的情况下,主机会不停地发送控制传输第二阶段的令牌包(IN包或OUT包)。
下面,以第二阶段的IN包为例理解:
当设备执行了_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState)之后,接收功能被打开。一旦设备收到主机的IN令牌包,就会使CTR_RX或者CTR_TX置位,同时已经准备好的待发数据被发送给主机。然后在设备的中断程序里面,软件再次清除CTR_RX或者CTR_TX,于是硬件发送ACK握手包给主机。完成第二阶段的传输。
不知以上的理解是否正确,望香版主和各位高手指点下。
|