(3)JoyStick_Reset()函数的处理。
这里将一句句来分析:
void Joystick_Reset(void)
{
pInformation->Current_Configuration = 0;
//当前配置为0
pInformation->Current_Interface = 0;/当前接口为0
pInformation->Current_Feature = Joystick_ConfigDescriptor[7];
//需要总线供电
SetBTABLE(BTABLE_ADDRESS); //设置包缓冲区地址。
SetEPType(ENDP0, EP_CONTROL);
//端点0为控制端点
SetEPTxStatus(ENDP0, EP_TX_STALL);
//端点状态为发送无效,也就是主机IN令牌包来的时候,回送一个STALL。
SetEPRxAddr(ENDP0, ENDP0_RXADDR); //设置端点0描述符表,包括接收缓冲区地址、最大允许接收的字节数、发送缓冲区地址三个量。
SetEPTxAddr(ENDP0, ENDP0_TXADDR); //这是发送缓冲区地址
Clear_Status_Out(ENDP0);
//清除EP_KIND的STATUS_OUT位,如果改位被设置,在控制模式下只对0字节数据包相应。其它的都返回STALL。主要用于控制传输的状态过程。
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); //接收缓冲区支持64个字节。
SetEPRxValid(ENDP0);
//使能端点0的接收,因为很快就要接收SETUP令牌包后面跟着的数据包了。
SetEPType(ENDP1, EP_INTERRUPT);
//端点1为中断端点。
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //设置发送缓冲区地址。
SetEPTxCount(ENDP1, 4);
//每次发送四个字节
SetEPRxStatus(ENDP1, EP_RX_DIS);
//接收禁止,只发送Mouse信息,而不从主机接收。
SetEPTxStatus(ENDP1, EP_TX_NAK); //现在发送端点还不允许发送数据。
bDeviceState = ATTACHED;
//连接状态改为已经连接,默认地址状态。
SetDeviceAddress(0); //地址默认为0.
}
复位中断执行完成后,开发板的USB接口能够以默认地址对主机来的数据包进行响应了。这个阶段的分析到此结束,下一个阶段就是正式分析代码实现的枚举过程了。