Перейти к содержанию
    

Olimex STM32-P407 USB OTG HS

Вопрос:

При подключении 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.

Изменено пользователем PheeL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...