Как получить более одного интерфейса UART


30

Хорошо, у меня есть один интерфейс UART (TXD GPIO 14, RXD GPIO 15). Я хочу по крайней мере еще один интерфейс UART.

Возможные решения:

  • Бит бит: используйте два не связанных запасных GPIO. Я понимаю, что синхронизация является проблемой на стандартном Linux. Будет ли это надежным с очень низкой скоростью передачи данных?

  • Переключение: RPI решает, когда говорить с каким устройством. Используя, например, CD4066BC .

  • spi to 2 x uart bridge: Не нашли подходящую деталь (наличие, цена, комплектация)

  • USB к UART: дорогой

Есть ли другие варианты? Я склонен к переключению, если это можно сделать. Что бы вы посоветовали?


Ответы:


10

USB UART, такой как FTDI, не очень дорогой. Все остальные ваши варианты звучат так, будто они будут стоить вам больше по частям и времени, чем ~ 13 долларов США, и могут быть ненадежными или медленными. Просто выберите быстрый и беспроблемный вариант, например:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

Sparkfun продает один тоже. На самом деле, может быть, вы можете просто вытащить одно из какого-нибудь старого USB-устройства или купить его в магазине нежелательной продукции, который не знает, что он делает.

Я запутался с адаптером SPI в UART для проекта Arduino, существующей библиотеки не было, поэтому я написал свою собственную. В конце концов, это сработало нормально, но если бы я мог просто проиграть 15 долларов, я бы сделал это. На самом деле, учитывая то, что это стоило мне времени, я должен был получить мега с 4 последовательными портами.

В качестве альтернативы, если вам нужно много последовательных портов, вы можете посмотреть на RS485 serial, который похож на 232 (хотя и не совместим), который поддерживает multi-drop, то есть несколько интерфейсов по одной линии.


1
Это также простой вариант с программной точки зрения. FTDI имеет встроенную поддержку драйверов Linux. Все остальные варианты потребуют кропотливой работы водителя.
Ber

Cp2102 - мой любимый чип usb uart. Быстрый поиск в Амазонии показывает их за 6,99 долл. США (фактически отредактируйте 1,50 долл. США) с кабелем в комплекте! Не могу победить это!
portforwardpodcast

6

Если вы решите пропустить добавление дополнительного оборудования и просто пойти по пути бит-битов, это не так сложно, как некоторые представляют.

Прежде всего, ваша коммуникационная нить должна работать в реальном времени:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

С этого момента ваш поток не будет иметь приоритет перед 950 мсек каждую секунду * , если он не вернет управление своевременно (через sched_yield()или usleep()) своевременно, что никогда не сделает его приоритетным. С 850 МГц процессором ваш цикл синхронизации будет работать вхолостую большую часть времени даже на самых высоких скоростях.

Теперь, к сожалению, требование время от времени возвращать контроль означает, что когда ваш поток спит, что бы ни отправляла ваша «противная сторона», он будет потерян навсегда. Но для этой цели вы можете использовать управление передачей. Либо выделите еще немного GPIO для линии CTS, которую вы опускаете, прежде чем уступить, и вернитесь обратно после восстановления управления:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

или (ИМХО предпочтительно) использовать управление передачей XON / XOFF - отправьте символ XOFF через RS232 перед сном, XON после возобновления работы. Коды ASCII по умолчанию для них предназначены '\x13'для XOFF / «остановить отправку» и '\x11'для XON / «возобновить отправку».

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


4

Я нашел то, что вы ищете: мост I2C / SPI от UART / IrDA / GPIO.

Они бывают одно- и двухместные (например, 1 или 2 дополнительных UART). Они (NXP) также (для другой стороны в случае необходимости) имеют мост I2C / SPI к мостам UART / IrDA / GPIO.

Более подробную информацию об этих чипах можно найти здесь и у главного аналога.

У Максима также есть фишки, которые делают то же самое.


Хорошая информация, но ссылки NXP дают HTTP 403 здесь.
Том


3

Мосты USB-UART дешевы и легко доступны, но имеют очень плохие временные характеристики. Newark продает плату «Embedded Pi» с процессором STM32F ARM, на котором вы можете писать голый код. На этом чипе три UART, и я думаю, что они могут работать довольно быстро; если бы вы использовали один для связи с Raspberry Pi, который оставил бы два доступных для других целей. Отказ от ответственности: я купил одну из этих плат, но до сих пор просто использовал сам Raspberry Pi для непосредственной обработки потребностей ввода / вывода.

Если вы хотите много более медленных UART, STM32F на плате Embedded Pi, вероятно, может обработать значительное число, особенно если вы хотите написать некоторый язык ассемблера Arm. Если на одной плате имеется две группы из 16 выводов ввода / вывода, возможно, будет возможно иметь 16 одновременных программных UART, которые все будут работать одновременно с довольно приличной скоростью передачи (иметь периодическое прерывание со скоростью 3x или 5x, которая хранит 16-разрядные фиксированные значения из порта приема в буфер и выводят 16-разрядные предварительно вычисленные значения из буфера в порт передачи, если вы это сделаете, то при условии, что среднее время обслуживания для программных UART не слишком велико, оно не имеет значения, случается ли случайное попадание в худшем случае (например, все шестнадцать портов получают байт одновременно).

Этот подход может действительно работать с удивительной эффективностью для приема, так как код "общего случая" даже не должен рассматривать отдельные UART. Предположим, что вы выбираете данные в 5x, а последние 47 байтов буфера дублируются непосредственно перед ним. Предполагая, что данные записываются в буфер в порядке возрастания, вы можете проверить, был ли какой-либо байт полностью получен на любом из 16 каналов, просто сказав:

bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);

Если bytes_readyноль, данные не были получены. В противном случае, если, например, установлен бит 2 bytes_ready, это означает, что принятый байт данных может быть найден в бите 2 данных [rx_ptr-40], данных [rx_ptr-35], данных [rx_ptr-30] и т. Д. Один раз захватывается данные, очистите бит 2 параметра arm_flag и настройте его для сброса после примерно 44 выборок.

Этот подход потребует небольшого количества работы над теми выборками, где байт данных полностью получен (и потенциально большая работа, если все 16 каналов имеют байт данных, поступающих сразу), но на большинстве выборок объем работы будет очень незначителен. Если бы у каждого было 64 контакта ввода / вывода, он мог бы обрабатывать до 32 UART, используя этот подход, не добавляя никакой дополнительной работы в «общий» случай.


1

Микроконтроллер, такой как Picaxe, может принимать последовательные данные на одном выводе и выводить последовательные данные на определенный вывод соответствующим образом. Это даст вам больше последовательных выходов, если вы будете готовы сообщить Picaxe, на какой вывод выводить данные. Он также может делать то же самое, но в обратном порядке, поэтому он может получать последовательные данные с нескольких устройств и отправлять их в Raspberry Pi. Другой вариант может заключаться в том, чтобы подключенные устройства требовали квалификатора . Это означает, что Устройство 1 должно будет принять данные «d1», например, прежде чем оно будет прослушивать дополнительные данные в последовательной линии. Устройство 2 может иметь в качестве спецификатора «d2». Это означало бы, что для того, чтобы сказать «привет» устройству 1, вам просто нужно отправить «d1hello» на линии UART.

Киксы довольно дешевы, вы можете купить их по адресу http://www.techsupplies.co.uk/, они бывают разных размеров с разным количеством штифтов и так далее.


1

Если связь с несколькими подчиненными устройствами UART не должна осуществляться параллельно, вы можете использовать один доступный порт UART между ними. Вы можете использовать транзисторы, чтобы разрешить только те подключения RxD / TxD к устройству, с которыми вы сейчас хотите общаться. Эти транзисторы могут управляться другими выводами Raspberry Pi GPIO.


1

Raspberry Pi 4 теперь поддерживает до 4 интерфейсов UART, которые необходимо включить с помощью наложения дерева устройств. Вы можете найти, как это сделать, и какие пины используются здесь:

https://www.raspberrypi.org/forums/viewtopic.php?t=244827

Фонд RPi все еще готовит документацию для этого.



0

Я использую микросхему SC16IS752, которая является преобразователем SPI в 2xUART. Хорошо работает с Raspbian Stretch.

Это немного дороже, чем чип FTDI, но есть два UART, и мне не нужно использовать драгоценный USB-порт.


-1

Посмотрите https://www.kickstarter.com/projects/1915118535/uart-hat-for-raspberry-pi Я надеюсь, что это может решить вашу проблему


1
Поскольку это не продукт, который на самом деле доступен, это делает его плохим выбором.
Jacobm001

1
Что еще хуже, кажется, что компания, которая сделала проект KS, свернулась, не поставив товар.
WineSoaked
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.