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

Чтение регистров USB PHY через HAL

Есть микроконтроллер STM32F4, к нему подключен(а) USB PHY USB3315. Задача - необходимо прочитать регистры USB3315, в частности Vendor ID и Product ID - 0x00 - 0x03. Работаю в IAR IDE 8.50.9, для общения с USB используется HAL.

Вопрос: как прочитать вышеуказанные регистры с помощью HAL? Не нашел таких низкоуровневых функций у HAL.

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


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

Немного перефразирую вопрос. Есть плата с микроконтроллером STM32F4 и USB PHY USB3315. Есть управляющая программа для микроконтроллера. USB инициализируется стандартной функцией

void MX_USB_HOST_Init (void);

Порт USB предназначен для подключения флэшек. Устройства определяются функцией

MX_USB_HOST_Process();

В принципе почти все работает нормально, но есть флэшки, которые не определяются. Их немного, но они есть. Причем те, которые не работают, как правило не работают через раз. Но вот я нашел одну флэшку, которая стабильно не работает (а четыре других, которые у меня есть - стабильно работают). Решил провести эксперименты.

Запускаю отладчик, ставлю брейкпоинт на MX_USB_HOST_Process(). В процессе пошагового выполнения наблюдаю за структурой hUsbHostHS (микроконтроллер работает как хост).

device.is_connected = 0x01

gState = HOST_IDLE

 

Вызывается функция:

USBH_StatusTypeDef  USBH_Process(USBH_HandleTypeDef *phost)

В этой функции исполняется ветка:

  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);

#if (USBH_USE_OS == 1U)
      phost->os_msg = (uint32_t)USBH_PORT_EVENT;
#if (osCMSIS < 0x20000U)
      (void)osMessagePut(phost->os_event, phost->os_msg, 0U);
#else
      (void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, NULL);
#endif
#endif
    }
    break;

 

Наблюдаю за изменением phost->gState. Сначала происходит изменение из HOST_IDLE в HOST_DEV_WAIT_FOR_ATTACHMENT (как и должно быть согласно коду), а после USBH_LL_ResetPort(phost); состояние меняется на HOST_DEV_ATTACHED (для всех флэшек).

А вот после break для нормальных флэшек состояние HOST_DEV_ATTACHED сохраняется, а для "ненормальной" - меняется на HOST_DEV_DISCONNECTED.

Флэшка, которая не работает - USB3.0, но в наборе работающих есть как USB2.0, так и USB3.0. Все флэшки отформатированы под FAT32 и на обычном компьютере читаются нормально.

Пока такие результаты исследований - причина отказа одной из флэшек непонятна.

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


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

Для проверки попробуйте запретить hs и оставить только fs.

В более новых версиях host middleware этот момент сильно переработан. Может после обновления hal и middleware полегчает?

Не лишним будет поставить  debug level 3 а не отладчиком смотреть. Многие ве8и должны укладываться в определённые таймауты 

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


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

10 hours ago, GenaSPB said:

Не лишним будет поставить  debug level 3 а не отладчиком смотреть. Многие ве8и должны укладываться в определённые таймауты 

Мои познания в STM и его экосистеме крайне поверхностны, поэтому несколько дополнительных вопросов:

- Если поставить debug level 3 - где смотреть результаты, если не в отладчике? Я полагаю, что при уровне 3 будет выводиться большое количество сообщений об изменениях состояний и т.д. Но куда дальше эти сообщения будут отправляться? На плате для общения с внешним миром есть USB (который в этом случае будет нерабочим) и SWD для программирования.

- Какие например таймауты могут нарушаться и где их можно подстроить?

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


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

Результаты смотреть в ранее настроеном serial port. Как перенаправить выдачу printf для этих целей зависит от применяемого компилятора. Есть еще способы перенаправления через swo.

Я встречался с тем, что если после reset и usb hs chirp у флешки не спросить достаточно быстро device descriptor то она не отвечает. Причем fs  режим нормально работал.

Смотреть в стандартах на usb скорее всего.  Подстроить не получится. 

 

В middleware новых версий есть callback не только на connected  но и на окончание процесса выяснения скорости подключённого usb device.

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

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


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

Поставил debug level 3. Для проблемной флэшки в окне Terminal I/O наблюдаю такие сообщения:

 

Quote

USB Device Attached

PID: 1666h

VID: 951h

ERROR: Control error

ERROR: Control error

....

USB Device disconnected

Сообщение ERROR: Control error повторяется много раз. Что значит Control error в сообщениях не раскрывается. Что с этим делать - тоже непонятно

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


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

Так поставьте дополнительные выдачи в месте вознионовния ошибок... скорее всего флешка не ответила на get string descriptor. device descriptor получен, раз vid pid сработало.. Вы пробовали ограничить с4орость на fs?

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

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


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

6 hours ago, GenaSPB said:

Так поставьте дополнительные выдачи в месте вознионовния ошибок... скорее всего флешка не ответила на get string descriptor. device descriptor получен, раз vid pid сработало.. Вы пробовали ограничить с4орость на fs?

 

Да, скорость ограничивал до fs - по крайней мере поставил в файле usbh_conf.h:

#define HOST_HS          0
#define HOST_FS          1

Результат не изменился.

Не совсем понял - как поставить дополнительные выдачи в месте возникновения ошибок?

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


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

Посмотрите чем инициализируется полe speed структуры init. В файле usbh_conf.c Это влияет на макс скорость 

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

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


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

On 11/26/2021 at 8:28 AM, GenaSPB said:

Посмотрите чем инициализируется полe speed структуры init. В файле usbh_conf.c Это влияет на макс скорость 

 

Было значение HCD_SPEED_HIGH. Помянял на HCD_SPEED_FULL - и проблемная флэшка заработала!  Для моего приложения это удовлетворительное решение проблемы - высокая скорость не требуется, нужна стабильность.

Большое спасибо за помощь!!!

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


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

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

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

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

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

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

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

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

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

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