stm32f3 USB VCP работает нестабильно

Я программирую STM32F373RCT и пытаюсь создать виртуальное USB-устройство comport. если я отправляю данные со скоростью примерно до 960 бит в секунду (я использовал таймер (50 Гц) и передаю 14 байтов в каждом цикле), связь работает правильно, но если я попытаюсь отправить данные больше, некоторые данные будут потеряны. Мне нужно увеличить скорость передачи данных. Как увеличить?


person Emre Erbas    schedule 27.06.2016    source источник
comment
На это невозможно ответить без более подробной информации о том, что ваш код делает с данными, отправленными в стек USB или полученными из него, какие-либо выходные данные отладки, которые вы генерируете, и т. д. Обычно правила сайта требуют, чтобы вы включили минимальный пример, демонстрирующий проблему, в тело самого вашего вопроса, но для проекта с голым металлом это было бы немного большим...   -  person Chris Stratton    schedule 28.06.2016


Ответы (3)


USB имеет встроенное управление потоком, поэтому вы сможете отправлять данные как можно быстрее, не теряя никаких данных. Ошибка либо в используемом вами стеке USB, либо в коде, который вы используете для отправки данных в стек USB. Если вы сможете определить и исправить эту ошибку, вы сможете отправлять данные намного быстрее, ничего не теряя.

person David Grayson    schedule 27.06.2016
comment
Я использую внутренние библиотеки KEIL для передачи данных через USB: CDC_Transmit_FS(receive_p, 14); --для обнаружения соединения: void USB_LP_IRQHandler(void) { HAL_TIM_Base_Stop_IT(&htim3); HAL_PCD_IRQHandler(&hpcd_USB_FS); петля++; } если значение цикла больше 40, я говорю, что он подключен. - person Emre Erbas; 29.06.2016

Это может быть ошибка драйвера или связанных с ним настроек. Один из моих проектов, который использует STM32F103 для отправки данных со скоростью ~ 600 КБ / с через USB, когда-то был выполнен с VCP и работал нормально, пока не было обновлено ядро ​​​​Linux. Новое ядро ​​поставляется с драйвером, который случайным образом отбрасывает данные на высокой скорости, предположительно из-за разных настроек буфера.

Чтобы решить эту проблему, я переключился на libusb и обрабатывал все BULK-пакеты в пользовательском пространстве. Он работал очень хорошо, как по надежности, так и по задержке (если используется асинхронный API).

Я также создал устройства на базе STM32F103, которые работают с flashrom и могут передавать данные со скоростью более 800 КБ/с через VCP без любая потеря или проблема, так что я думаю, что это больше о настройке буфера.

person Chi Zhang    schedule 02.07.2016

Я нашел проблему. В моем коде активны 3 прерывания таймера, и они имеют высокий приоритет. Прерывание USB имеет низкий приоритет. когда USB подключен к компьютеру, новый код остановит прерывания таймеров. USB-связь теперь стабильна. Большое спасибо за ваш комментарий.

person Emre Erbas    schedule 03.07.2016