Вопрос:При подключении 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
Далее, статическая конфигурация и код инициализации:CODE
//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
CODE
/******************************************************************************/
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.
Сообщение отредактировал PheeL - Sep 3 2014, 11:41
Если друг оказался вдруг и не друг и не враг, а - JTAG.