AltairNsk 0 September 6, 2021 Posted September 6, 2021 (edited) · Report post Досталось "в наследство": STM32L412 опрашивает радиомодуль, пакует принятое и по USB в режиме virtual com port отправляет на хост, тут я немного в теме. STM32CubeIDE 1.6.1, HAL 1.17 - as is. CDC_Transmit_FS(...) для отправки, в коллбэке CDC_TransmitCplt_FS поднимаю флаг окончания передачи. хост - одноплатник OrangePi с Armbian на борту, выгребает данные с usb-com, вроде бы питоновским скриптом и складывает в локальный файл. Вроде бы регулярно опрашивает порт на доступность. Не моё и тут я пока что по нолям. Максимум - зайти по ssh и убедиться, растет ли файл. (1) Включаю одноплатник. После того, как загрузится (и видимо, начнет целевым образом опрашивать порт), включаю STM - так работает. Проблема: (2) Включаю STM до загрузки одноплатника - и что-то случается с USB_CDC - не вызывается CDC_TransmitCplt_FS. Вижу, что hUsbDeviceFS.pClassData инициализируется. Как понял, это происходит в прерывании, при опросе хостом (про порочность malloc читал, но в первом случае ведь работает) До ухода в главный цикл жду while (hUsbDeviceFS.pClassData == 0){} - как аллоцировало pClassData, интерфейс готов, можно работать? После вызова CDC_Transmit_FS TxLength == посылке, TxState == 1 - брейкпоинт на вызове CDC_Transmit_FS, затем один шаг посмотреть состояние. Второй брейкпоинт - внутри CDC_TransmitCplt_FS, в (1) я в него прихожу, в (2) - нет. Ладно, дальше в (2) подождал, останов, и вижу, что стало: TxLength == 0, TxState == 0. Получается, хост данные забрал? В какую сторону разгребать? Как со стороны STM определить, что хост готов к работе? Внутри CDC_Transmit_FS вижу USBD_BUSY только по проверке pClassData->TxState. Как правильно запускать USB CDC на STM в условиях, что я не знаю, как именно хост будет дергать порт? Edited September 6, 2021 by AltairNsk Quote Share this post Link to post Share on other sites More sharing options...
jcxz 124 September 6, 2021 Posted September 6, 2021 · Report post 5 часов назад, AltairNsk сказал: Как правильно запускать USB CDC на STM в условиях, что я не знаю, как именно хост будет дергать порт? Device не запускает работу по USB. Никак. Её запускает Host. Запустив процесс энумерации. А Device всего лишь должен правильно ответить на все запросы процесса энумерации. А сначала вам стоит убедиться, что энумерация вообще началась. Хотя бы первый запрос процесса энумерации получаете от хоста? Quote Share this post Link to post Share on other sites More sharing options...
AltairNsk 0 September 8, 2021 Posted September 8, 2021 · Report post Одноплатник - пока что темный лес, подключил к обычному компу с виндой. "STM32 Virtual ComPort" в системе появлется, данные в терминал приходят. Переподключение к компу без сброса STM - энумерация есть, данных в терминале нет. Смотрю в свой код и вижу, что все так и будет, возможность переподключения я не учел. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 124 September 8, 2021 Posted September 8, 2021 · Report post 8 часов назад, AltairNsk сказал: Переподключение к компу без сброса STM - энумерация есть, данных в терминале нет. Смотрю в свой код и вижу, что все так и будет, возможность переподключения я не учел. Если в момент повторного подключения CDC-device, его COM-порт оставался открытым в винде (от предыдущего открытия), то так и будет (отсутствие данных в терминале). Учитывай / не учитывай это в "своём коде" - не поможет, так работает драйвер винды. А в "своём коде" нужно предусмотреть лишь управление подтяжкой D+ к VCC в нужные моменты времени. Quote Share this post Link to post Share on other sites More sharing options...
aaarrr 42 September 8, 2021 Posted September 8, 2021 · Report post 9 hours ago, AltairNsk said: Смотрю в свой код и вижу, что все так и будет, возможность переподключения я не учел. В OPi энумерация может пройти дважды - сначала в u-boot, затем при старте ядра. Quote Share this post Link to post Share on other sites More sharing options...