высокоскоростной микроконтроллер — связь с ПК

У меня есть проект, в котором я должен непрерывно отбирать 4-битную шину каждые 100 нс для приложения регистрации данных (мне также нужен очень низкий джиттер выборки). У меня есть UC, который может работать на частоте до 300 МГц, поэтому скорость не является проблемой, но моей текущей задачей является передача данных с UC на ПК.

40 Мбит/с в значительной степени исключает UART или аналогичный, оставляя возможности USB и Ethernet. Есть ли другие более быстрые и грязные способы достижения этой скорости? Или, если нет, как лучше начать, поскольку я никогда раньше не использовал Ethernet/USB в дизайне UC.

Работать с USB-устройством довольно просто, можете ли вы сказать нам, какой UC и какой IDE вы используете?
Более серьезной проблемой может быть операционная система на самом ПК. Если у вас нет значительной буферизации на вашем сэмплерном устройстве, вы столкнетесь с задержками на ПК, которые приведут к потере данных. Для чего-то подобного я бы посоветовал вам изучить некоторую форму прямого интерфейса доступа к памяти на ПК. Также «непрерывно» со скоростью 10 мегапикселей в секунду - это МНОГО памяти или места на диске.
@Trevor: Интерфейсы Ethernet и USB, встроенные практически в каждый доступный сегодня ПК, уже настроены на производительность. На таком уровне детализации не нужно беспокоиться о реализации на стороне хоста.
@DaveTweed, серьезно... У тебя ведь есть ПК с Windows, верно... Даже эта штука с SE время от времени зависает на несколько секунд, когда ОС решает заняться домашними делами, а у меня приличный ПК.
@Trevor: Да, и у этого ПК достаточно памяти (16 ГБ), чтобы при необходимости буферизовать большой объем данных. Я могу смотреть видео, загружать огромные файлы и т. д. со скоростью более 40 Мбит/с. Это уже не по теме, но зависания SE в основном вызваны медленными серверами на другом конце, а не браузером. Страницы SE ужасно сложны и требуют буквально сотен сетевых транзакций, чтобы что-то сделать.
ПК должен иметь возможность работать со скоростью 1000BaseT, не замечая этого. Таким образом, 100BaseT, если вы правильно выберете размеры пакетов (чтобы уменьшить накладные расходы и приблизиться к вашим 40 Мбит/с), не должно быть проблемой для ПК. Вероятно, вам может сойти с рук много обмана в сетевом стеке, если вы хотите, но смотрите то, что видите.
в зависимости от данных, хотя может быть лучше просто получить национальные инструменты или другую карту, которая подключается к pci или pcie для ведения журнала, у нее не должно быть проблем с пропускной способностью или хранилищем. просто нужно найти правильную карту/продукт для сигнала, который вы хотите попробовать.
@MudassirHussain самые «простые в использовании» микроконтроллеры с USB будут работать только со скоростью 12 Мбит / с. Очень немногие поддерживают USB HS, и большинству из них потребуется внешний PHY (например, STM32, NXP и т. д.). FX2LP очень дешев и может легко делать то, что вы хотите, но требует, чтобы вы работали с его 8051. FX3 может работать со скоростью 2,5 Гбит/с и использует ARM7.
@Trevor Я лично разработал устройство USB3 с использованием FX3; для ПК 2012 года, работающего под управлением Linux, OSX или Windows 7/8, буквально не было проблем с поддержанием скорости потока данных 2,5 Гбит/с, который я генерировал.
@akohlsmith вздох, я не говорю, что это невозможно сделать, я говорю, что он может столкнуться с проблемами, настройка которых займет намного больше времени, чем он себе представляет. Кое-что, что ему нужно знать, прежде чем он возьмется за разработку аппаратного обеспечения.
@ Тревор, я понимаю, что ты говоришь. Я пытаюсь сказать, что это далеко не та проблема, которую вы представили в своем первом посте по этому вопросу. Это был ненастроенный компьютер с Win7, найденный в обычном офисе в 2012 году. Конечно, YMMV.
Как вы синхронизируете выборку MCU со средним временем передачи, чтобы обеспечить допустимую выборку? Скользящие фазы часов убьют вас.

Ответы (2)

Более серьезной проблемой может быть операционная система на самом ПК. Если у вас нет значительной буферизации на вашем сэмплерном устройстве, вы столкнетесь с задержками на ПК, которые приведут к потере данных.

Я получил полную пропускную способность USB 480 Мбит / с между микро USB2 и приложением Linux для ПК, написанным на Python. Даже не на Си! Он использует libusb, который я рекомендую. libusb позволяет инициировать массовые передачи напрямую, без необходимости писать драйвер. Он довольно прост в использовании.

Вы должны использовать DMA с рассеянием. Хорошо, что это должно быть по умолчанию. Идея в том, что вы передаете список пустых буферов в libusb. Они помещаются в связанный список , которым управляет само оборудование USB . Каждый раз, когда ваше устройство отправляет пакет, микросхема USB внутри ПК захватывает свободный буфер из списка и заполняет его. Затем он периодически запускает прерывание, чтобы ваше приложение могло собирать заполненные буферы. Этот процесс полностью управляется аппаратно, он будет работать, даже если ЦП занят, выполняет подкачку и т. д., если вы предоставите ему достаточно свободных буферов. Процессор ПК не утруждает себя обработкой каждого пакета. На самом деле вы можете передавать большие буферы (например, 64 КБ), и аппаратное обеспечение USB будет накапливать в них пакеты и пинговать ваше приложение, когда буфер будет готов к использованию.

При достаточном количестве буферов вы не должны терять пакеты. Я этого не делал, и эта штука работала часами, пока я компилировал ядра Linux и все остальное, что я мог ей добавить. Чипсеты Smart DMA удивительно умны!

Поскольку микро работает на частоте 300 МГц, я предполагаю, что это зверь, и у него не будет 1 КБ ОЗУ. Вам нужно будет буферизовать несколько кадров, поэтому пара десятков килобайт будет в порядке. Убедитесь, что вы настроили встроенное USB-ядро с правильным DMA, fifo или разбросом, независимо от того, что использует ваш чип, но важно использовать наиболее эффективный режим.

Если вы выберете Ethernet, это в основном то же самое. Сетевые адаптеры ПК имеют DMA с разбросом и сбором, поэтому просто установите для буфера сокета значение «yuuuuge» и дайте аппаратному обеспечению выполнять свою работу. Вы можете использовать UDP, TCP не нужен.

Однако Ethernet потребует создания пакетов UDP в вашей прошивке, что занимает немного времени. Аппаратное обеспечение USB2 будет нарезать данные на пакеты для вас. Но Ethernet изолирован и позволяет использовать кабели гораздо большей длины, что может пригодиться.

Также Ethernet не приведет к сбою ПК. Возня с USB, когда ваше экспериментальное USB-устройство глючит, может сделать забавные вещи с вашим ПК. Драйверы вашей ОС были протестированы только на работающих USB-устройствах. Поэтому, когда ваш микроконтроллер зависает между некоторыми фазами USB-транзакции, особенно перечислением, или отправляет фиктивные данные, из-за чего стек драйверов внезапно чувствует острую необходимость выделить -1 байт памяти, вы можете ожидать, что ПК выдаст «WUT?» и должны нажать клавишу Windows (т. е. кнопку сброса). Я использую ненужный ноутбук без данных на нем.

Если вы беспокоитесь о потере пакетов UDP... Я оставил его включенным на 24 часа, с двумя 10-метровыми кабелями и удлинителем посередине, без потери пакетов при скорости 100 Мбит/с в полнодуплексном режиме.

Хм, это было что-то вроде информационного дампа, но это должно работать нормально. Я бы больше беспокоился о том, как ваш микро будет синхронизировать сбор данных, не ожидайте, что прерывание будет запускаться каждые 100 нс ... для этого вам понадобится оборудование и прямой доступ к памяти. Если вы используете 4 бита, возможно, вы могли бы взломать четырехъядерный порт SPI? Или если он сопоставляет порт DMA с контактами...

Другим решением может стать Cypress FX2LP EZ-USB micro. У него есть аппаратный FIFO, поэтому, если вы дадите ему часы, в каждом цикле он будет захватывать 8 бит со своих выводов данных и отправлять их на ПК через массовую передачу USB2. Все в аппаратуре. Нужно написать про страничку С кода для прошивки, поздороваться с ПК, перечислить, и подключить аппаратный FIFO к конечной точке USB. Вы получаете 8 бит вместо 4... эй, это 4 бесплатных бита!

В любом случае. На самом деле, один из них должен работать.

+1 Хороший ответ. Хорошо, если пользователь узнает, что связано со всей картиной, прежде чем он потратит значительное время и деньги на разработку аппаратного и программного обеспечения со своей стороны. Именно это я и пытался донести до того, как меня удалили... вздох
Да, я согласен. Что спасает ПК, так это механизм DMA на чипсете USB. Даже если ЦП занят чем-то другим, он продолжит передачу. FX2LP, вероятно, будет самым простым. Мне понадобился день, чтобы заставить его работать с libusb, и я никогда раньше не занимался USB... это простой чип.
Я немного покопался в UC серии TMS320, и, видимо, их USB не могут справиться со скоростью, которая мне нужна. Видя, как id приходится писать это с нуля, и поскольку время имеет существенное значение (подходит предложение о гранте), является ли чип cyperess хорошим способом? Кроме того, я использовал логический анализатор Salee, но он постоянно выполняет потоковую передачу, скорее, он буферизует, сбрасывает и снова идет, и я не могу позволить себе терять пакеты.
Извините, но вы не можете получить «полную пропускную способность 480 Мбит / с» на USB 2.0, несмотря ни на что. USB имеет накладные расходы на кадры (SOF-EOP1-EOP2), накладные расходы протокола (IN-ACK, вставка битов не позволяет системе планировать более 11 объемных буферов на микрофрейм, консервативно 10), и есть системные накладные расходы для управления TRB. . Плюс накладные расходы на файловую систему. Лучшее, что можно сделать, это около 45 Мбит/с или 360 Мбит/с.
@AliChen - конечно, как и Ethernet «100 Мбит / с», также включает накладные расходы и дает около 10 МБ / с, плюс-минус, USB 480 Мбит / с включает накладные расходы ... что касается чистой пропускной способности около 45 МБ / с. звучит правильно. Много для нужд ОП. Я подчеркивал, что даже дерьмовое концептуальное приложение для ПК, написанное на python, не имеет проблем с пропускной способностью, поскольку это казалось большим сомнением для OP. Современное оборудование поражает. Что касается накладных расходов на файловую систему, то их не будет, поскольку это не запоминающее устройство...
Написание на Python по-прежнему зависит от примерно 1000 инженерных лет, которые Microsoft и/или Linux вложили в хост-драйвер xHCI/EHCI/OHCI/UHCI USB. Приложение, написанное на Phyton, является доказательством того, что ehci.sys работает так, как задумано. И ОП должен где-то хранить свои результаты. [При его скорости передачи данных на жестком диске емкостью 2 Тб будет храниться около 4-5 дней записи данных.]
Привет всем, Спасибо за вклад! 45 МБ/с достаточно, если это правда. Мы начинаем с 5 МБ/с и можем увеличить до 20, если все получится. Что касается хранения данных, то оно используется для предварительных экспериментов по подсчету фотонов, поэтому сбор данных должен длиться всего около 3-5 часов. @peufeu, похоже, вы предполагаете, что FX2LP может передавать данные через параллельную шину. Наши данные, которые мы читаем, могут быть настроены как 4-битный параллельный интерфейс — возможно ли настроить чип, но данные от сбора данных будут подаваться напрямую, без прохождения через UC?
@JasonYang Да, FX2LP имеет параллельный порт со стробоскопом и часами. Он имеет несколько вариантов конфигурации через прошивку. По сути, накормите его битами и часами, он перенесет на ПК. Однако это 8-битный порт, поэтому вы либо получите четыре дополнительных неиспользуемых бита, которые можно удалить в программном обеспечении на ПК, либо вам придется добавить логическую схему с несколькими триггерами, чтобы превратить два 4-битных слайса в 8-битные. .
@AliChen Я рекомендую FX2LP, потому что я использовал его раньше, но будет ли чип FTDI проще для случая OP?
@peufeu, спасибо за предложение! я посмотрю на это. Что касается программного обеспечения, у вас есть какой-нибудь справочный код о том, как получить доступ к данным через USB? Это похоже на чтение последовательного порта или потребуется дополнительная настройка?
погуглите "libusb python tutorial", вы найдете пример, добавьте "Cypress FX2", вы должны найти пример прошивки для FX2. Я сделал это около 10 лет назад, поэтому я не помню точных деталей, но libusb + Cypress FX2 — популярная комбинация из-за отсутствия драйверов. Нужна некоторая конфигурация, но насколько я помню, она была довольно простой (например, копипастный пример кода, бинго)

Ваша эффективная устойчивая скорость передачи данных составляет 5 Мбайт/с. Эта скорость должна легко обрабатываться любым чипом USB 2.0 FIFO, Cypress или FTDI. USB 2.0 может поддерживать скорость 35-40 Мбайт/с в одну сторону. Я считаю, что обе компании предлагают примеры систем сбора данных, основанных на их архитектурах, с бесплатными драйверами для ПК. Большинство так называемых «анализаторов ПК» и «анализаторов логики ПК» построены на основе этих микросхем USB-FIFO.

Все, что вам нужно, чтобы обеспечить хотя бы простую буферизацию пинг-понга на вашей стороне, упаковать два 4-битных байта в байт, вот и все.