STM32之USB host库:USBH_Process学习理解

void USBH_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost)
{
  volatile USBH_Status status = USBH_FAIL;
 
 
 
  if ((HCD_IsDeviceConnected(pdev) == 0)&& (phost->gState != HOST_IDLE))  // 若是 未连接&&不空闲状态下
  {
    if(phost->gState != HOST_DEV_DISCONNECTED)
    {
      phost->gState = HOST_DEV_DISCONNECTED;
    }
  }
   
  switch (phost->gState)
  {
 
  case HOST_IDLE :    //空闲状态
   
    if (HCD_IsDeviceConnected(pdev))   //如果 设备连接上了
    {
      phost->gState = HOST_DEV_ATTACHED;  //就把状态转入 -> HOST_DEV_ATTACHED
      USB_OTG_BSP_mDelay(100);     //延时
    }
    break;
  
  case HOST_DEV_ATTACHED :   //接触状态(但是没有连接上)
   
    phost->usr_cb->DeviceAttached();  //调用usbh_usr.c中的用户回调函数 ->USBH_USR_DeviceAttached()
    phost->Control.hc_num_out = USBH_Alloc_Channel(pdev, 0x00);    //给USB终端设备分配的传出通道
    phost->Control.hc_num_in = USBH_Alloc_Channel(pdev, 0x80);      //分配USB设备的传入通道
 
   
    if ( HCD_ResetPort(pdev) == 0)  //如果 检测到 复位命令
    {
      phost->usr_cb->ResetDevice();  //那么执行 USB复位,不是主机复位!
     
     
      phost->device_prop.speed = HCD_GetCurrentSpeed(pdev);   //获得当前设备的速度
     
      phost->gState = HOST_ENUMERATION;        //然后 状态转入 -> HOST_ENUMERATION
      phost->usr_cb->DeviceSpeedDetected(phost->device_prop.speed);  //调用用户回调函数,在LCD上显示设备速度信息
       
     
      USBH_Open_Channel (pdev,      //开启入口通道
                           phost->Control.hc_num_in,
                           phost->device_prop.address,
                           phost->device_prop.speed,
                           EP_TYPE_CTRL,
                           phost->Control.ep0size);
     
     
      USBH_Open_Channel (pdev,      //开启出口通道
                           phost->Control.hc_num_out,
                           phost->device_prop.address,
                           phost->device_prop.speed,
                           EP_TYPE_CTRL,
                           phost->Control.ep0size);         
   }
    break;
   
  case HOST_ENUMERATION:          //枚举进程
     
    if ( USBH_HandleEnum(pdev , phost) == USBH_OK)  //如果枚举完成
    {
     
     
     
      phost->usr_cb->EnumerationDone();   //就执行用户回调,可以在显示器上显示枚举完毕信息
     
      phost->gState  = HOST_USR_INPUT;       //然后转入下一个状态 -> HOST_USR_INPUT
    }
    break;
   
  case HOST_USR_INPUT:       //用户输入行为
   
    if ( phost->usr_cb->UserInput() == USBH_USR_RESP_OK) //如果对用户输入有响应
    {
      if((phost->class_cb->Init(pdev, phost))\
        == USBH_OK)
      {
        phost->gState  = HOST_CLASS_REQUEST;      //然后转入下一个状态 -> HOST_CLASS_REQUEST
      }    
    }  
    break;
   
  case HOST_CLASS_REQUEST: 
   
    status = phost->class_cb->Requests(pdev, phost);
   
     if(status == USBH_OK)    //如果类请求事件完成
     {
       phost->gState  = HOST_CLASS;   //则进入下一状态 -> HOST_CLASS
     } 
    
     else         //否则
     {
       USBH_ErrorHandle(phost, status);   //主机进行错误处理
     }
 
   
    break;   
  case HOST_CLASS:      //主机类
   
    status = phost->class_cb->Machine(pdev, phost);
    USBH_ErrorHandle(phost, status);
    break;      
   
  case HOST_CTRL_XFER:
   
    USBH_HandleControl(pdev, phost);   
    break;
   
  case HOST_SUSPENDED:
    break;
 
  case HOST_ERROR_STATE:
   
    USBH_DeInit(pdev, phost);    //重初始化
    phost->usr_cb->DeInit();    //执行用户回调:重初始化
    phost->class_cb->DeInit(pdev, &phost->device_prop);
    break;
   
  case HOST_DEV_DISCONNECTED :
   
   
    phost->usr_cb->DeviceDisconnected();  //用户回调:在显示器上显示->设备未连接
   
   
    USBH_DeInit(pdev, phost);  //主机重新初始化,进入新的枚举过程
    phost->usr_cb->DeInit(); //执行用户回调:重初始化
    phost->class_cb->DeInit(pdev, &phost->device_prop);
    USBH_DeAllocate_AllChannel(pdev);     //收回通道
    phost->gState = HOST_IDLE;     //主机回到初始状态 -> HOST_IDLE(空闲)
   
    break;
   
  default :
    break;
  }

}

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32 HOST USB代码 u8 USH_User_App(void) { u32 total,free; u8 res=0; Show_Str(30,140,200,16,"É豸Á¬½Ó³É¹¦!.",16,0); res=exf_getfree("2:",&total,&free); if(res==0) { POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É« LCD_ShowString(30,160,200,16,16,"FATFS OK!"); LCD_ShowString(30,180,200,16,16,"U Disk Total Size: MB"); LCD_ShowString(30,200,200,16,16,"U Disk Free Size: MB"); LCD_ShowNum(174,180,total>>10,5,16); //ÏÔʾUÅÌ×ÜÈÝÁ¿ MB LCD_ShowNum(174,200,free>>10,5,16); } while(HCD_IsDeviceConnected(&USB_OTG_Core))//É豸Á¬½Ó³É¹¦ { LED1=!LED1; delay_ms(200); } POINT_COLOR=RED;//ÉèÖÃ×ÖÌåΪºìÉ« Show_Str(30,140,200,16,"É豸Á¬½ÓÖÐ...",16,0); LCD_Fill(30,160,239,220,WHITE); return res; } int main(void) { u8 t; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2 delay_init(168); //³õʼ»¯ÑÓʱº¯Êý uart_init(115200); //³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200 LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú KEY_Init(); //°´¼ü LCD_Init(); //³õʼ»¯LCD W25QXX_Init(); //SPI FLASH³õʼ»¯ usmart_dev.init(84); //³õʼ»¯USMART my_mem_init(SRAMIN); //³õʼ»¯ÄÚ²¿ÄÚ´æ³Ø exfuns_init(); //ΪfatfsÏà¹Ø±äÁ¿ÉêÇëÄÚ´æ piclib_init(); //³õʼ»¯»­Í¼ f_mount(fs[0],"0:",1); //¹ÒÔØSD¿¨ f_mount(fs[1],"1:",1); //¹ÒÔØSD¿¨ f_mount(fs[2],"2:",1); //¹ÒÔØUÅÌ POINT_COLOR=RED; while(font_init()) //¼ì²é×Ö¿â { LCD_ShowString(60,50,200,16,16,"Font Error!"); delay_ms(200); LCD_Fill(60,50,240,66,WHITE);//Çå³ýÏÔʾ delay_ms(200); } Show_Str(30,50,200,16,"̽Ë÷ÕßSTM32F407¿ª·¢°å",16,0); Show_Str(30,70,200,16,"USB UÅÌʵÑé",16,0); Show_Str(30,90,200,16,"2014Äê7ÔÂ22ÈÕ",16,0); Show_Str(30,110,200,16,"ÕýµãÔ­×Ó@ALIENTEK",16,0); Show_Str(30,140,200,16,"É豸Á¬½ÓÖÐ...",16,0); //³õʼ»¯USBÖ÷»ú USBH_Init(&USB_OTG_Core,USB_OTG_FS_CORE_ID,&USB_Host,&USBH_MSC_cb,&USR_Callbacks); while(1) { USBH_Process(&USB_OTG_Core, &USB_Host); delay_ms(1); t++; if(t==200) { LED0=!LED0; t=0; } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值