Я использую микроконтроллер STM32F105 с библиотекой USB STM32_USB-FS-Device_Lib_V3.2.1 и адаптировал пример VCP для наших целей (интеграция с RTOS и последовательным API).
Проблема заключается в том, что если USB-кабель подключен, но порт на хосте Windows не открыт, через несколько минут устройство завершает постоянный повторный вход в USB ISR до тех пор, пока порт не будет открыт, а затем все начнется. работает нормально.
Я обработал обработчик прерываний и вижу, что при возникновении ошибки обработчик ISR завершается, а затем сразу же снова входит. Это происходит потому, что при выходе из прерывания флаг IEPINT в OTG_FS_GINTSTS неясен. В данный момент OTG_FS_DAINT содержит 0x00000002 (набор IEPINT1), а DIEPINT1 - 0x00000080 (TXFE). Вызывается строка в OTGD_FS_Handle_InEP_ISR (), которая очищает TXFE, но бит либо не очищается, либо сразу же восстанавливается. При повторном открытии COM-порта на хосте состояние OTG_FS_GINTSTS и OTG_FS_DAINT в конце прерывания всегда равно нулю, и дальнейшие прерывания происходят с нормальной скоростью. Обратите внимание, что проблема возникает, только если данные выводятся, но на хосте нет открытого порта. Если порт открыт или данные не выводятся, система работает бесконечно. Я полагаю, что чем больше данных выводится, тем раньше возникает проблема, но в настоящее время это нереально.
Код VCP имеет переменную состояния, которая принимает следующие перечисляемые значения:
UNCONNECTED,
ATTACHED,
POWERED,
SUSPENDED,
ADDRESSED,
CONFIGURED
и мы используем состояние CONFIGURED, чтобы определить, помещать ли данные в буфер драйвера для отправки. Однако состояние CONFIGURED устанавливается, когда кабель подключен, а не тогда, когда на хосте открыт порт и подключено приложение. Я вижу, что когда Windows действительно открывает порт, происходит множество прерываний, поэтому кажется, что происходит какое-то сообщение об этом событии; Интересно, возможно ли поэтому определить, открыт ли порт на хосте?
Мне нужна одна из двух вещей, возможно:
- Для предотвращения застревания кода USB в ISR в первом случае
- Чтобы определить, открыт ли порт хосту со стороны устройства, и отправлять данные только для отправки при открытии.