attaboy 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба Есть микроконтроллер STM32F4, к нему подключен(а) USB PHY USB3315. Задача - необходимо прочитать регистры USB3315, в частности Vendor ID и Product ID - 0x00 - 0x03. Работаю в IAR IDE 8.50.9, для общения с USB используется HAL. Вопрос: как прочитать вышеуказанные регистры с помощью HAL? Не нашел таких низкоуровневых функций у HAL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба Пардон, код для ETH был. Перепутал с USB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
attaboy 0 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба Немного перефразирую вопрос. Есть плата с микроконтроллером 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 и на обычном компьютере читаются нормально. Пока такие результаты исследований - причина отказа одной из флэшек непонятна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба Для проверки попробуйте запретить hs и оставить только fs. В более новых версиях host middleware этот момент сильно переработан. Может после обновления hal и middleware полегчает? Не лишним будет поставить debug level 3 а не отладчиком смотреть. Многие ве8и должны укладываться в определённые таймауты Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
attaboy 0 24 ноября, 2021 Опубликовано 24 ноября, 2021 · Жалоба 10 hours ago, GenaSPB said: Не лишним будет поставить debug level 3 а не отладчиком смотреть. Многие ве8и должны укладываться в определённые таймауты Мои познания в STM и его экосистеме крайне поверхностны, поэтому несколько дополнительных вопросов: - Если поставить debug level 3 - где смотреть результаты, если не в отладчике? Я полагаю, что при уровне 3 будет выводиться большое количество сообщений об изменениях состояний и т.д. Но куда дальше эти сообщения будут отправляться? На плате для общения с внешним миром есть USB (который в этом случае будет нерабочим) и SWD для программирования. - Какие например таймауты могут нарушаться и где их можно подстроить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 24 ноября, 2021 Опубликовано 24 ноября, 2021 (изменено) · Жалоба Результаты смотреть в ранее настроеном serial port. Как перенаправить выдачу printf для этих целей зависит от применяемого компилятора. Есть еще способы перенаправления через swo. Я встречался с тем, что если после reset и usb hs chirp у флешки не спросить достаточно быстро device descriptor то она не отвечает. Причем fs режим нормально работал. Смотреть в стандартах на usb скорее всего. Подстроить не получится. В middleware новых версий есть callback не только на connected но и на окончание процесса выяснения скорости подключённого usb device. Изменено 24 ноября, 2021 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
attaboy 0 25 ноября, 2021 Опубликовано 25 ноября, 2021 · Жалоба Поставил 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 в сообщениях не раскрывается. Что с этим делать - тоже непонятно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 25 ноября, 2021 Опубликовано 25 ноября, 2021 (изменено) · Жалоба Так поставьте дополнительные выдачи в месте вознионовния ошибок... скорее всего флешка не ответила на get string descriptor. device descriptor получен, раз vid pid сработало.. Вы пробовали ограничить с4орость на fs? . Изменено 25 ноября, 2021 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
attaboy 0 26 ноября, 2021 Опубликовано 26 ноября, 2021 · Жалоба 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 Результат не изменился. Не совсем понял - как поставить дополнительные выдачи в месте возникновения ошибок? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 26 ноября, 2021 Опубликовано 26 ноября, 2021 (изменено) · Жалоба Посмотрите чем инициализируется полe speed структуры init. В файле usbh_conf.c Это влияет на макс скорость Изменено 26 ноября, 2021 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
attaboy 0 29 ноября, 2021 Опубликовано 29 ноября, 2021 · Жалоба On 11/26/2021 at 8:28 AM, GenaSPB said: Посмотрите чем инициализируется полe speed структуры init. В файле usbh_conf.c Это влияет на макс скорость Было значение HCD_SPEED_HIGH. Помянял на HCD_SPEED_FULL - и проблемная флэшка заработала! Для моего приложения это удовлетворительное решение проблемы - высокая скорость не требуется, нужна стабильность. Большое спасибо за помощь!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться