amaora 20 22 ноября, 2022 Опубликовано 22 ноября, 2022 · Жалоба Использую библиотеку CherryUSB на stm32f405 и stm32f722 чтобы сделать CDC ACM устройство. На F4 все работает стабильно, а на F7 обнаруживаются проблемы. Если давать достаточно плотный поток данных от устройства к хосту, то работа быстро прерывается. Прерывание по завершению передачи не приходит, бит XFRC в регистре DIEPINT. Отлаживаю с помощью записи логов в кольцевой буфер в RAM. По коду, делается вызов usbd_ep_start_write() из моих модулей, дальше случается прерывание DIEPINT_TXFE и в обработчике вызывается dwc2_tx_fifo_empty_process(). После чего обычно происходит прерывание DIEPINT_XFRC и в обработчике вызывается callback в котором я снова делаю usbd_ep_start_write() либо не делаю в зависимости от наличия данных на отправку. Но на F7 иногда все заканчивается на вызове dwc2_tx_fifo_empty_process(), дальше прерывания нет. https://github.com/sakumisu/CherryUSB/blob/master/port/dwc2/usb_dc_dwc2.c Проблем возникает непредсказуемо, никаких зависимостей выявить не удалось. Обычно передаётся несколько Кб текста и все останавливается, если передавать небольшие порции и редко то проблема возникает с меньшей вероятностью. Проявляется на F7, от DCache не зависит. Собирал с помощью GCC и Clang с разными настройками оптимизации, не зависит. При отладке, когда ставил точки останова на код обработчика прерывания OTG_FS то были случаи разлипания и продолжения передачи. В моем коде нет обработки случая неприхода callback после вызова usbd_ep_start_write(), разлипнуть можно только если вызов callback все таки случится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 20 20 февраля, 2023 Опубликовано 20 февраля, 2023 · Жалоба Оказалось все просто. У меня на F7 частота для usb формировалась с большой ошибкой (~6%) из-за округлений при расчете делителей. Исправил и теперь работает стабильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться