PheeL 0 3 сентября, 2014 Опубликовано 3 сентября, 2014 (изменено) · Жалоба Вопрос: При подключении USB Flash накопителя в порт физически подключённый к USB OTG HS микроконтроллера, в отладчике вижу, что устройство определяется, происходит подключение(конечный автомат драйвера переходит в состояние Connect), верно читается VID/PID устройства, но не проходит этап энумерации. Хотя на OTG FS всё штатно (устройство подключается и работает без сбоев). Включение\выключение VBUS происходит верно, напряжение во включенном состоянии 5.2(В). Исходные данные: IAR 7.10 (Optimizations None). Все настройки проекта пока не буду перечислять, их много и я почти уверен, что проблема не в них. CMSIS 4.0.1 STM32Cube Firmware 1.3.0 STM32 HAL Driver 1.1.0 STM32 USB Host Library 2.2.0 Далее, статическая конфигурация и код инициализации: //USB Host #define USBH_ENABLED 1 #define USBH_FS_ENABLED 0 #define USBH_HS_ENABLED 1 //USBH Classes #define USBH_HID_ENABLED 1 #define USBH_MSC_ENABLED 1 /*---------- -----------*/ #define USBH_MAX_NUM_ENDPOINTS 4 /*---------- -----------*/ #define USBH_MAX_NUM_INTERFACES 10 /*---------- -----------*/ #define USBH_MAX_NUM_CONFIGURATION 1 /*---------- -----------*/ #define USBH_KEEP_CFG_DESCRIPTOR 0 /*---------- -----------*/ #define USBH_MAX_NUM_SUPPORTED_CLASS 2 /*---------- -----------*/ #define USBH_MAX_SIZE_CONFIGURATION 255 /*---------- -----------*/ #define USBH_MAX_DATA_BUFFER 512 /*---------- -----------*/ #define USBH_DEBUG_LEVEL 0 /******************************************************************************/ Status USBH_Init_(void* args_p) { const OS_UsbhHd* usbh_hd_p = (OS_UsbhHd*)args_p; Status s = S_OK; usbh_fs_hd_p = (USBH_HandleTypeDef*)usbh_hd_p->usbh_fs_hd; usbh_hs_hd_p = (USBH_HandleTypeDef*)usbh_hd_p->usbh_hs_hd; // Interface #if (1 == USBH_FS_ENABLED) if (USBH_OK != USBH_Init(usbh_fs_hd_p, USBH_UserProcess, USBH_ID_FS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (USBH_OK != USBH_Init(usbh_hs_hd_p, USBH_UserProcess, USBH_ID_HS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED // Class #if (1 == USBH_HID_ENABLED) #if (1 == USBH_FS_ENABLED) if (USBH_OK != USBH_RegisterClass(usbh_fs_hd_p, USBH_HID_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (USBH_OK != USBH_RegisterClass(usbh_hs_hd_p, USBH_HID_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED #endif // USBH_HID_ENABLED #if (1 == USBH_MSC_ENABLED) #if (1 == USBH_FS_ENABLED) if (S_OK != drv_usbh_v[DRV_ID_USBH_FS_MSC]->itf.Init(usbh_fs_hd_p)) { return s = S_HARDWARE_FAULT; } if (USBH_OK != USBH_RegisterClass(usbh_fs_hd_p, USBH_MSC_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (S_OK != drv_usbh_v[DRV_ID_USBH_HS_MSC]->itf.Init(usbh_hs_hd_p)) { return s = S_HARDWARE_FAULT; } if (USBH_OK != USBH_RegisterClass(usbh_hs_hd_p, USBH_MSC_CLASS)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED #endif // USBH_MSC_ENABLED return s; } /******************************************************************************/ Status USBH_Open(void* args_p) { Status s = S_OK; usbhd_stdin_qhd = (OS_QueueHd)args_p; #if (1 == USBH_FS_ENABLED) if (USBH_OK != USBH_Start(usbh_fs_hd_p)) { return s = S_HARDWARE_FAULT; } #endif // USBH_FS_ENABLED #if (1 == USBH_HS_ENABLED) if (USBH_OK != USBH_Start(usbh_hs_hd_p)) { return s = S_HARDWARE_FAULT; } #endif // USBH_HS_ENABLED return s; } /******************************************************************************/ void HAL_HCD_MspInit(HCD_HandleTypeDef* hhcd) { ... ... else if(hhcd->Instance == USB_OTG_HS) { __GPIOB_CLK_ENABLE(); __GPIOD_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); /**USB_OTG_HS GPIO Configuration PB12 ------> USB_OTG_HS_ID PB13 ------> USB_OTG_HS_VBUS PB14 ------> USB_OTG_HS_DM PB15 ------> USB_OTG_HS_DP */ GPIO_InitStruct.Pin = GPIO_PIN_12|/*GPIO_PIN_13|*/GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* Peripheral clock enable */ __USB_OTG_HS_CLK_ENABLE(); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(OTG_HS_IRQn, OS_PRIORITY_INT_MIN, 0); HAL_NVIC_EnableIRQ(OTG_HS_IRQn); } /******************************************************************************/ USBH_StatusTypeDef USBH_LL_Init (USBH_HandleTypeDef *phost) { ... ... else if (phost->id == USBH_ID_HS) { hcd_hs_hd.Instance = USB_OTG_HS; hcd_hs_hd.Init.Host_channels = 8; hcd_hs_hd.Init.speed = HCD_SPEED_FULL; hcd_hs_hd.Init.dma_enable = DISABLE; hcd_hs_hd.Init.phy_itface = HCD_PHY_EMBEDDED; hcd_hs_hd.Init.Sof_enable = DISABLE; hcd_hs_hd.Init.low_power_enable = DISABLE; hcd_hs_hd.Init.vbus_sensing_enable = ENABLE; hcd_hs_hd.Init.use_external_vbus = ENABLE; /* Link The driver to the stack */ hcd_hs_hd.pData = phost; phost->pData = &hcd_hs_hd; HAL_HCD_Init(&hcd_hs_hd); USBH_LL_SetTimer (phost, HAL_HCD_GetCurrentFrame(&hcd_hs_hd)); } Весь остальной низкоуровневый код реализации драйвера взят из примеров (они все одинаковые, сгенерированные оболочкой Cube), проектов в STM32 Firmware. Изменено 3 сентября, 2014 пользователем PheeL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yakuzaa 0 7 мая, 2015 Опубликовано 7 мая, 2015 · Жалоба Необходимо поправить: USBH_MAX_SIZE_CONFIGURATION 512 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться