Jump to content
    

STM32L412, HAL Virtual COM port и OrangePi

Досталось "в наследство":

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 by AltairNsk

Share this post


Link to post
Share on other sites

5 часов назад, AltairNsk сказал:

Как правильно запускать USB CDC на STM в условиях, что я не знаю, как именно хост будет дергать порт?

Device не запускает работу по USB. Никак. Её запускает Host. Запустив процесс энумерации. А Device всего лишь должен правильно ответить на все запросы процесса энумерации.

А сначала вам стоит убедиться, что энумерация вообще началась. Хотя бы первый запрос процесса энумерации получаете от хоста?

Share this post


Link to post
Share on other sites

Одноплатник - пока что темный лес, подключил к обычному компу с виндой. "STM32 Virtual ComPort" в системе появлется, данные в терминал приходят.

Переподключение к компу без сброса STM - энумерация есть, данных в терминале нет. Смотрю в свой код и вижу, что все так и будет, возможность переподключения я не учел. 

Share this post


Link to post
Share on other sites

8 часов назад, AltairNsk сказал:

Переподключение к компу без сброса STM - энумерация есть, данных в терминале нет. Смотрю в свой код и вижу, что все так и будет, возможность переподключения я не учел. 

Если в момент повторного подключения CDC-device, его COM-порт оставался открытым в винде (от предыдущего открытия), то так и будет (отсутствие данных в терминале). Учитывай / не учитывай это в "своём коде" - не поможет, так работает драйвер винды.

А в "своём коде" нужно предусмотреть лишь управление подтяжкой D+ к VCC в нужные моменты времени.

Share this post


Link to post
Share on other sites

9 hours ago, AltairNsk said:

Смотрю в свой код и вижу, что все так и будет, возможность переподключения я не учел. 

В OPi энумерация может пройти дважды - сначала в u-boot, затем при старте ядра.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...