barzebuba 0 28 июня, 2022 Опубликовано 28 июня, 2022 · Жалоба День добрый! Мб кто-то сталкивался.. В проекте использовался МК STM32F437, вместо него поставили GD32F450. Помимо прочего МК реализует USB MassStorage через USBHS с помощью внешнего ULPI. Чтение в MassStorage работает отлично, а вот с записью проблема. На картинке логи USB анализатора (ellisys). Вначале транзации идут нормально. В какой-то момент времени (в текущем примере это вообще OUT, иногда сразу первый, иногда сильно позже), МК в ответ на OUT + Data ничего не отвечает. Далее идут PING'и до ACK. После чего МК может ответить ACK, может также ничего не ответить. В какой-то момент он отвечает NYET. И через сколько-то транзаций, после того как МК снова ничего не отвечает, приходят PING'и, но МК на всё отвечает NAK. Собственно раньше использовались драйвера из STM32Cube. И на STM32F437 проблем не было. С GD32 получаю вот такую проблему. Скачал драйвера и hal с gigadevice.com, ничего не изменилось, поэтому дело как будто бы не в реализации драйвера. Размер RX FIFO = 512 * 4 зы. если запускаю без USB анализатора, то запись также обламывается, но сильно позже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 28 июня, 2022 Опубликовано 28 июня, 2022 · Жалоба А куда пишите данные от ПК? На м/с флеш-памяти (SPI\QUADSPI и т.д.) или куда? А DMA включен у Вас? hpcd_USB_OTG_HS.Init.dma_enable Или, в этом hal-е и контроллере, нет такого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 28 июня, 2022 Опубликовано 28 июня, 2022 · Жалоба RX FIFO = 512 * 4 - Уточните какой у вас на процессоре размер памяти есть. Да, DMA есть только на тех где 4К Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barzebuba 0 28 июня, 2022 Опубликовано 28 июня, 2022 (изменено) · Жалоба On 6/28/2022 at 1:31 PM, AleksBak said: А куда пишите данные от ПК? На м/с флеш-памяти (SPI\QUADSPI и т.д.) или куда? При чтении делаю memset константой, а запись просто делает return 0. Чтение/запись через dd On 6/28/2022 at 1:31 PM, AleksBak said: А DMA включен у Вас? hpcd_USB_OTG_HS.Init.dma_enable Или, в этом hal-е и контроллере, нет такого? Поддержка DMA имеется. Но с ним есть проблема. Вначале мне попала более старая версия FirmwareLibrary от GD. И там включение DMA ничего не меняло. Вчера скачал последнюю версию FirmwareLibrary с оф сайта и там с DMA вообще отказывается работать (логи во вложении). Разбираюсь с этим.. On 6/28/2022 at 1:56 PM, GenaSPB said: RX FIFO = 512 * 4 - Уточните какой у вас на процессоре размер памяти есть. Да, DMA есть только на тех где 4К Собственно размер FIFO 4Кб и есть Ещё из "странностей", которые я пока не могу объяснить - это то, что иногда у меня транзакция обламывается практически сразу (как на первом скриншоте), а иногда через несколько десятков Мб Изменено 28 июня, 2022 пользователем barzebuba Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexLir 0 29 июня, 2022 Опубликовано 29 июня, 2022 · Жалоба Добрый день! Недавно столкнулся тоже же проблемой MassStorage. Использовался STM32F427 заменил на GD32F450. В файле usbd_conf.c, в функции "void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)" вызывается "__HAL_PCD_GATE_PHYCLOCK(hpcd)" для приостановки клока USB. А в функции "void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)" клок USB не восстанавливался, для того что бы заработало нужно добавить в эту функцию "__HAL_PCD_UNGATE_PHYCLOCK(hpcd)" после функции "USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData)". Может это и не ваш случай, но мне помогло. И еще заметил, что GD32F450 не работает USB если не активировать vbus_sensing_enable и не настроить ногу USB_OTG_FS_VBUS на вход. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barzebuba 0 29 июня, 2022 Опубликовано 29 июня, 2022 · Жалоба On 6/29/2022 at 11:55 AM, AlexLir said: В файле usbd_conf.c, в функции "void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)" вызывается "__HAL_PCD_GATE_PHYCLOCK(hpcd)" для приостановки клока USB. У меня в "HAL_PCD_SuspendCallback" вызывается только "USBD_LL_Suspend". Посмотрел примеры usbd_conf.c из проектов в STM32Cube и там "__HAL_PCD_GATE_PHYCLOCK(hpcd)" делают только в драйверах для HID_Standalone. Зачем оно Вам для MassStorage? On 6/29/2022 at 11:55 AM, AlexLir said: И еще заметил, что GD32F450 не работает USB если не активировать vbus_sensing_enable и не настроить ногу USB_OTG_FS_VBUS на вход. Я так понимаю Вы с MassStorage работаете на FS? У меня HS. На FS висит DFU и да, пришлось тоже включать vbus_sensing_enable, чтобы он заработал. А на ноге USB_OTG_FS_VBUS у меня висит UART, там альтернативная функция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barzebuba 0 29 июня, 2022 Опубликовано 29 июня, 2022 · Жалоба Сегодня попробовал подключить своё устройство к другому компу и всё заработало. Ещё к одному - тоже норм. Хм. К первому компу, на котором воспроизводила проблема, устройство было подключено к USB на передней панели. Попробовал подключить сзади - и тоже заработало. В переднюю панель через USB хаб - тоже работает. Работает - это конечно громкое заявление, полноценного тестирования ещё не было, но тесты мои проходят, которые раньше обламывались. Вот такие дела.. Ещё, если писать одни нули, то тесты всегда проходят, куда бы я не подключал устройство Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barzebuba 0 29 июня, 2022 Опубликовано 29 июня, 2022 · Жалоба Ешё при работе с GD и драйвером от STM была обнаружена следующая проблема. Если устройство извлечь из хоста, а потом снова подключить, то USB корка начинает отвечает NAK'ами, так как BULK endpoint'ы оказываются в выключенном состоянии. Выключаются они тут HAL_PCD_IRQHandler (ENUMDNE) -> HAL_PCD_ResetCallback -> USBD_LL_Reset -> USBD_MSC_DeInit -> USBD_LL_CloseEP -> HAL_PCD_EP_Close -> USB_DeactivateEndpoint (EPDIS). И обратно уже не включаются. USB корка не очищает биты EPDIS и EPENA. Я пока что убрал деактивацию. В драйвере от GD такого вообще не делается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
0men 2 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба On 6/29/2022 at 9:54 PM, barzebuba said: Я так понимаю Вы с MassStorage работаете на FS? У меня HS. На FS висит DFU и да, пришлось тоже включать vbus_sensing_enable, чтобы он заработал. А на ноге USB_OTG_FS_VBUS у меня висит UART, там альтернативная функция. Похоже, проблема vbus_sensing_enable есть у всех гдшников, на 405ом мне тоже пришлось включать, хотя на стм все и без вбуса прекрасно работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vit496 0 8 июля, 2022 Опубликовано 8 июля, 2022 · Жалоба On 6/28/2022 at 10:36 AM, barzebuba said: В проекте использовался МК STM32F437, вместо него поставили GD32F450 Здравствуйте. Скажите, а что у него по совместимости с функциями LCD (параллельный интерфейс)? Не получится случайно один в один заменить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться