关于usbh_core.c中的USBH_Process(USBH_HandleTypeDef *phost)分析

本文深入分析了`USBH_Process(USBH_HandleTypeDef *phost)`函数在USB Host枚举过程中的作用,包括检查设备连接、等待稳定、主机端口复位等关键步骤,以确保稳定可靠的USB主机通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//主要用于Host枚举的全过程
USBH_StatusTypeDef USBH_Process(USBH_HandleTypeDef *phost)
{
__IO USBH_StatusTypeDef status = USBH_FAIL;
uint8_t idx = 0U;

  /* check for Host port events */
  if (((USBH_IsPortEnabled(phost) == 0U)) && (phost->gState != HOST_IDLE))
  {//如果没设备连接,并且端口没有使能,则更新主机状态
    if(phost->gState != HOST_DEV_DISCONNECTED) //如果状态机不是“未连接”
    {
      phost->gState = HOST_DEV_DISCONNECTED; //则修改为“未连接”
    }
  }

switch (phost->gState)//状态机函数结构
{
case HOST_IDLE :
if (phost->device.is_connected)//设备是否插入
{
/* Wait for 200 ms after connection */
phost->gState = HOST_DEV_WAIT_FOR_ATTACHMENT;//状态机更新到“等待使能端口连接”
USBH_Delay(200U);//为了稳定设备供电
USBH_LL_ResetPort(phost);//主机复位端口,用于连接;如不需要热插拔,则跳过
}
break;

	case HOST_DEV_WAIT_FOR_ATTACHMENT: /* Wait for Port Enabled */
    if (phost->device.PortEnabled == 1U)//端口是否使能
    {
      phost-&g
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; } } }
我是一名嵌入式驱动工程师,最近在开发USB hub的驱动,目前已经实现了hub本身的驱动,下一步要实现hub上设备的驱动,目前在端口复位之后,设备枚举出现了一些问题。 我的理解是,当复位之后,主机需要分配两个通道,对应设备的端点0 ,然后主机设置状态机为枚举,调用主流程去枚举,然后发现问题是设备无响应。 下面是代码,请你告诉我详细的过程(能够对应编码实现的),然后看看代码中不正确的地方以及需要改进的地方。 ///////////////////////////////////////////////////////////////// // 文件说明:本文件实现USBhub的类描述 // by jinyh 2025-2-11 //////////////////////////////////////////////////////////////// #include "hubclass.h" #include "hubctrl.h" #include "usb_host_core.h" #include "usb_host_stdreq.h" #include "usb_host_ctrltrans.h" #include "usb_host_cfgch.h" #include "usb_host_driver.h" #include "usb_host_user.h" DESCRIPTOR_HUB_DESC_T myHubDesc; //hub描述符,本工程中只有唯一的一个hub HUB_Machine_TypeDef myHUB_Machine; // Hub的操作结构体 extern __USB_ALIGN_BEGIN USBH_HOST usb_app_host; // 连接一个设备, extern __USB_ALIGN_BEGIN USBH_HOST usb_child_host[5]; // 如何是hub的话,则连接最多4个设备。 //function //void usb_hub_dev_process(usb_core_instance *pdev, USBH_HOST *phost); extern HOST_STATUS usb_host_enumprocess(usb_core_instance *pdev, USBH_HOST *phost); // 跟应用相关,照猫画虎写一写 2025-1-22 static HOST_STATUS usb_host_hub_init(usb_core_instance *pdev, void *phost); void usb_host_hub_deinit(usb_core_instance *pdev,void *phost); static HOST_STATUS usb_host_hub_classreq(usb_core_instance *pdev, void *phost); static HOST_STATUS usb_host_hub_process(usb_core_instance *pdev, void *phost); usb_host_class_callback_func USBH_hub_cb = { usb_host_hub_init, usb_host_hub_deinit, usb_host_hub_classreq, usb_host_hub_process }; static HOST_STATUS usb_host_hub_init(usb_core_instance *pdev, void *phost) { // hub 初始化,已经枚举结束 USBH_HOST *pphost = phost; myHUB_Machine.hub_reqState=HUB_GET_DESC_REQUEST; // 控制hub的req状态为HUB_GET_DESC_REQUEST myHUB_Machine.hub_process_state=HUB_GET_PORT_STATUS; // 默认是读取端口状态 HOST_STATUS status = HSTATUS_BUSY ; if (pphost->device_prop.devitfdesc[0].bInterfaceClass == USB_HUB_CLASS) { myHUB_Machine.dev_addr=pphost->device_prop.devaddr
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值