Squeak.ru - шаблоны программирования

Можно ли настроить тайм-аут для получения данных через USB в микроконтроллерах STM32?

Мне интересно, возможно ли настроить тайм-аут для получения данных через интерфейс USB в микроконтроллерах STM32. Такой подход возможен, например, в соединении UART (см. AN3109, раздел 2. Тайм-аут приема DMA).

Я не могу найти ничего подобного, связанного с интерфейсом USB. Более того, говорят, что DMA для USB следует включать только в случае крайней необходимости, поскольку передача данных должна быть выровнена по 32-битному слову.

30.06.2019

  • Честно говоря, я не понимаю, в чем ваша проблема. USB — это 100 мастер-слейв, и ваше устройство реагирует только на команды хоста. В HAL внутренние операции истекают по тайм-ауту. Тебе не нужно беспокоиться. 01.07.2019
  • Я пытаюсь найти решение для получения пакетов с разным количеством байтов по размеру. Интерфейс USB VCP. Поскольку я не знаю, каков именно размер сообщения, я хочу настроить какое-то прерывание, какой-то тайм-аут неактивного RX. Когда срабатывает прерывание, я знаю, что хост закончил отправку сообщения, и MCU может начать его обработку. 01.07.2019

Ответы:


1

У вас есть функция обратного вызова (если вы используете HAL) в файле ...._if.c. Скопируйте полученные символы в буфер. Реализуйте тайм-аут там.

30.06.2019

2

В случае UART вы имеете в виду либо тайм-аут приема DMA, как вы сказали, либо (если DMA не используется) прерывание IDLE. Я не знаю, чтобы такая вещь появилась «из коробки» для USB CDC - вам придется реализовать этот тайм-аут самостоятельно, что не должно быть слишком сложно. Имейте таймер (аппаратное обеспечение или программное обеспечение), который вы перезапускаете каждый раз, когда получаете данные. Установите для его периода значение тайм-аута по вашему выбору и выполните синтаксический анализ протокола по истечении тайм-аута.

Если бы мне нужно было что-то добавить - такого рода проблемы (не зная, сколько байтов нужно получить) обычно решаются на уровне протокола. Предполагая двоичный протокол, одним из способов достижения этого является наличие начального и конечного байтов кадра, которые никогда не встречаются в данных (а если они встречаются, вы их экранируете), и в этом случае вы получаете все, начиная с «стартового байта», пока вы не получите «конечный байт» . Еще один способ - иметь «начальный байт» и поле, указывающее, сколько байтов нужно получить. Все это, конечно, должно быть каким-то образом проверено.

Сказав это, если у вас есть возможность изменить протокол, вы действительно должны это сделать. Полагаться на тайминги в вашем общении, особенно на таком низком уровне, в конечном итоге только вызывает проблемы и головную боль. Вы вводите тесную связь между уровнем вашего протокола и уровнем интерфейса. Это будет иметь неприятные последствия каждый раз, когда вы решите использовать другой интерфейс, так как вам придется заново изобретать одно и то же. Не говоря уже о том, как это будет болезненно, когда вы решите перейти на TCP/IP со всеми его достоинствами — сетевым джиттером, потерянными пакетами и т. д.

01.07.2019
  • Да, это еще один подход, который я использовал при соединении UART с низкой скоростью передачи данных. Я просто получаю несколько первых байтов без DMA, затем я могу проверить поле с номером байта и настроить передачу RX DMA. Хотя в случае высокоскоростных интерфейсов, таких как USB, скажем, ручное получение первых байтов без DMA немного сложно с точки зрения использования ЦП. При высокой скорости передачи данных в USB мы не можем быть уверены, что MCU сможет принимать байты один за другим. 01.07.2019
  • Было бы здорово добавить кадры SOF и EOF с предопределенными шаблонами, но мы не можем изменить IP-оборудование в MCU, оно работает так, как работает, и я боюсь, что в STM32 такой функции нет. Но, возможно, я ошибаюсь... Есть ли у вас примеры такого подхода в микроконтроллерах STM32 с точки зрения интерфейсов USB и SPI, чтобы я мог узнать больше? 01.07.2019
  • Что именно вы просите? Если вы спрашиваете о том, как реализовать такой протокол, это то, что касается дизайна протокола, и это целая большая отдельная ветвь, где одного комментария переполнения стека или ответа будет недостаточно. 01.07.2019
  • Я создаю простой протокол отладки и пытаюсь найти простое решение, чтобы справиться с незнанием точного количества байтов на микроконтроллерах STM32 и интерфейсах USB/SPI. На данный момент полагаться на тайм-аут простоя кажется лучшим вариантом. Вопрос в том, как это сделать с существующими ресурсами на этом MCU. Как я уже упоминал о AN3109, это довольно просто с интерфейсом UART, но не с USB. Между физическим интерфейсом и протоколом всегда существует некоторая связь. 01.07.2019
  • Я бы сказал, всегда ли существует какая-то связь - пока абстракция, представленная на уровне протокола, одинакова, т. Е. Получены байты, и они могут или не могут поступать пакетами, задерживаться и т. д., в этот момент это действительно не так. не имеет значения, какой на самом деле интерфейс. С тем же успехом это может быть кусок мокрой веревки. Если вы можете подтвердить, что полученные байты не были повреждены, и вы собрали их все, это должно работать. 01.07.2019
  • Что касается реализации, о которой вы просите - лично, если бы мне нужно было быстро создать что-то только для какой-то отладки, я бы выбрал [STX] [данные кадра] [контрольная сумма] [ETX]. Три байта специального значения (STX=0x02, ETX=0x03 и ESC=0x1B). Если какой-либо байт в данных кадра или контрольной сумме равен одному из этих 3 специальных байтов, вы избегаете его: добавьте к нему ESC и XOR его значения с чем-то (скажем, XOR с ESC также). При приеме вы получаете от STX к ETX с обратным XOR-ингом. После этого проверьте контрольную сумму. 01.07.2019
  • ...и как вы хотите включить сюда DMA? MCU не получает байты один за другим, просто настраивает передачу DMA 01.07.2019
  • Давайте продолжим это обсуждение в чате. 01.07.2019
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...