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

GD32F450 + USBHS MassStorage

День добрый!

Мб кто-то сталкивался..

В проекте использовался МК 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 анализатора, то запись также обламывается, но сильно позже.

gd_logs.png

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


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

А куда пишите данные от ПК? На м/с флеш-памяти (SPI\QUADSPI и т.д.) или куда? А DMA включен у Вас?

hpcd_USB_OTG_HS.Init.dma_enable

Или, в этом hal-е и контроллере, нет такого?

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


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

RX FIFO = 512 * 4 - Уточните какой у вас на процессоре размер памяти есть. Да, DMA есть только на тех где 4К

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


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

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Кб и есть

gd_logs_2.png

Ещё из "странностей", которые я пока не могу объяснить - это то, что иногда у меня транзакция обламывается практически сразу (как на первом скриншоте), а иногда через несколько десятков Мб

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

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


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

Добрый день! Недавно столкнулся тоже же проблемой 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 на вход.

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


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

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, там альтернативная функция.

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


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

Сегодня попробовал подключить своё устройство к другому компу и всё заработало. Ещё к одному - тоже норм. Хм. К первому компу, на котором воспроизводила проблема, устройство было подключено к USB на передней панели. Попробовал подключить сзади - и тоже заработало. В переднюю панель через USB хаб - тоже работает. Работает - это конечно громкое заявление, полноценного тестирования ещё не было, но тесты мои проходят, которые раньше обламывались. Вот такие дела..

 

Ещё, если писать одни нули, то тесты всегда проходят, куда бы я не подключал устройство

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


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

Ешё при работе с 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 такого вообще не делается.

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


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

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ом мне тоже пришлось включать, хотя на стм все и без вбуса прекрасно работает.

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


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

On 6/28/2022 at 10:36 AM, barzebuba said:

В проекте использовался МК STM32F437, вместо него поставили GD32F450

Здравствуйте. Скажите, а что у него по совместимости с функциями LCD (параллельный интерфейс)? Не получится случайно один в один заменить? 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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