首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32——USB详细使用说明(5)

STM32——USB详细使用说明(5)

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();
}
继承事业,薪火相传
返回列表