У меня есть проект, в котором я должен непрерывно отбирать 4-битную шину каждые 100 нс для приложения регистрации данных (мне также нужен очень низкий джиттер выборки). У меня есть UC, который может работать на частоте до 300 МГц, поэтому скорость не является проблемой, но моей текущей задачей является передача данных с UC на ПК.
40 Мбит/с в значительной степени исключает UART или аналогичный, оставляя возможности USB и Ethernet. Есть ли другие более быстрые и грязные способы достижения этой скорости? Или, если нет, как лучше начать, поскольку я никогда раньше не использовал Ethernet/USB в дизайне UC.
Более серьезной проблемой может быть операционная система на самом ПК. Если у вас нет значительной буферизации на вашем сэмплерном устройстве, вы столкнетесь с задержками на ПК, которые приведут к потере данных.
Я получил полную пропускную способность 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 бесплатных бита!
В любом случае. На самом деле, один из них должен работать.
Ваша эффективная устойчивая скорость передачи данных составляет 5 Мбайт/с. Эта скорость должна легко обрабатываться любым чипом USB 2.0 FIFO, Cypress или FTDI. USB 2.0 может поддерживать скорость 35-40 Мбайт/с в одну сторону. Я считаю, что обе компании предлагают примеры систем сбора данных, основанных на их архитектурах, с бесплатными драйверами для ПК. Большинство так называемых «анализаторов ПК» и «анализаторов логики ПК» построены на основе этих микросхем USB-FIFO.
Все, что вам нужно, чтобы обеспечить хотя бы простую буферизацию пинг-понга на вашей стороне, упаковать два 4-битных байта в байт, вот и все.
Мудассир Хусейн
Тревор_G
Дэйв Твид
Тревор_G
Дэйв Твид
Старожил
Старожил
аколсмит
аколсмит
Тревор_G
аколсмит
аналоговые системы рф