void CTR_LP(void)
{
__IO uint16_t wEPVal = 0;
while (((wIstr =_GetISTR()) & ISTR_CTR) != 0)
{
EPindex = (uint8_t)(wIstr &ISTR_EP_ID); //读出端点ID
if (EPindex==0) //如果是端点0
{
SaveRState =_GetENDPOINT(ENDP0); //读取端点0寄存器USB_EP0R
SaveTState = SaveRState &EPTX_STAT; //保存发送状态位
SaveRState &= EPRX_STAT; //保存接受状态位
_SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); //端点以NAK分组响应所有的发送和接受请求(解释在上面)
if ((wIstr & ISTR_DIR) ==0) //IN令牌,数据被取走
{
_ClearEP_CTR_TX(ENDP0); //清除正确发送标志位
In0_Process(); //处理INT事件
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
return;
}
else
{
wEPVal =_GetENDPOINT(ENDP0); //得到端点0寄存器的数据
if ((wEPVal &EP_SETUP) !=0) //SETUP分组传输完成标志
{
_ClearEP_CTR_RX(ENDP0);
Setup0_Process(); //处理SETUP事件
//程序会进入到这个函数里面
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
return;
}
else if ((wEPVal & EP_CTR_RX) != 0)
{
_ClearEP_CTR_RX(ENDP0);
Out0_Process(); //处理OUT事件
_SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
return;
}
}
}
else //如果是除端点0以外的端点
{
wEPVal =_GetENDPOINT(EPindex); //得到相应端点寄存器值
if ((wEPVal & EP_CTR_RX) !=0) //检测正确接收标志 PC-USB OUTint
{
_ClearEP_CTR_RX(EPindex); //清除相应的标志
(*pEpInt_OUT[EPindex-1])(); //调用OUT int服务功能
}
if ((wEPVal & EP_CTR_TX) !=0) //检测正确发送标志 USB-PC IN int
{
_ClearEP_CTR_TX(EPindex); //清除相应的标志
(*pEpInt_IN[EPindex-1])(); //调用IN int服务功能
}
}
}
}
usb_coer.c的文件里面,主要是得到主机发来的标准请求命令
uint8_t Setup0_Process(void)
{
union
{
uint8_t*b;
uint16_t*w;
} pBuf;
#ifdef STM32F10X_CL
USB_OTG_EP *ep;
uint16_t offset = 0;
ep = PCD_GetOutEP(ENDP0);
pBuf.b = ep->xfer_buff;
#else
uint16_t offset = 1;
//得到接受缓冲区地址寄存器地址
pBuf.b = PMAAddr + (uint8_t*)(_GetEPRxAddr(ENDP0) * 2);
#endif
if(pInformation->ControlState != PAUSE)
{
pInformation->USBbmRequestType = *pBuf.b++;
pInformation->USBbRequest = *pBuf.b++;
pBuf.w+= offset;
pInformation->USBwValue = ByteSwap(*pBuf.w++);
pBuf.w+= offset;
pInformation->USBwIndex =ByteSwap(*pBuf.w++);
pBuf.w+= offset;
pInformation->USBwLength = *pBuf.w;
}
pInformation->ControlState =SETTING_UP;
if(pInformation->USBwLength == 0)
{
NoData_Setup0();
}
else
{
Data_Setup0(); //由于是有数据的传输,所有要进入到这个函数
}
return Post0_Process();
} |