设置好设备地址(开始设置为0),使能USB,USB中断就会开始工作。
1.设置设备地址,使能USB
_SetDADDR(Val | DADDR_EF);
2. USB中断函数调用CTR_LP()
void CTR_LP(void)
{
__IO uint16_t wEPVal = 0;
while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) //如果一直有正确的传输就一直处理数据。EP0除外,EP0处理完就返回了。
{
EPindex = (uint8_t)(wIstr & ISTR_EP_ID); //获取中断源是哪个端点
if (EPindex == 0) //端点0
{
SaveRState = _GetENDPOINT(ENDP0); //读入端点0的端点寄存器
SaveTState = SaveRState & EPTX_STAT; //保存TX状态
SaveRState &= EPRX_STAT; //保存RX状态
_SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); //设置端0的RX、TX状态都为NAK状态。
if ((wIstr & ISTR_DIR) == 0)
{//IN处理过程,设备发送数据给主机
_ClearEP_CTR_TX(ENDP0); //清TX的CTR位。
In0_Process(); //端点0的IN处理函数
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); //恢复RX和TX状态
return;
}
else
{//SETUP或OUT流程,主机发送数据给设备
wEPVal = _GetENDPOINT(ENDP0); //读入端点0的端点寄存器
if ((wEPVal &EP_SETUP) != 0)
{//SETUP处理流程
_ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
Setup0_Process();
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
return;
}
else if ((wEPVal & EP_CTR_RX) != 0)
{//OUT处理流程
_ClearEP_CTR_RX(ENDP0);
Out0_Process();
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
return;
}
}
}/* if(EPindex == 0) */
else
{//处理其他EP
wEPVal = _GetENDPOINT(EPindex);
if ((wEPVal & EP_CTR_RX) != 0)
{
_ClearEP_CTR_RX(EPindex);
(*pEpInt_OUT[EPindex-1])(); //其他7个EP OUT回调函数
} /* if((wEPVal & EP_CTR_RX) */
if ((wEPVal & EP_CTR_TX) != 0)
{
_ClearEP_CTR_TX(EPindex);
(*pEpInt_IN[EPindex-1])(); //其他7个EP IN回调函数
} /* if((wEPVal & EP_CTR_TX) != 0) */
}/* if(EPindex == 0) else */
}/* while(...) */
}
打印数据看流程:
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process
Out0_Process
Setup0_Process
In0_Process