Як отримати більше одного інтерфейсу uart


30

Гаразд, у мене є один інтерфейс uart (TXD GPIO 14, RXD GPIO 15). Я хочу хоча б ще один інтерфейс uart.

Можливі рішення:

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

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

  • spi до мосту 2 x uart: не знайшли підходящу частину (наявність, ціна, пакет для розведення)

  • usb to 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 серійний, який схожий на 232 (хоч і не сумісний), який підтримує багатопроменеву передачу, тобто кілька інтерфейсів через одну лінію.


1
Це також легкий варіант з точки зору програмного забезпечення. FTDI не підтримує драйвер Linux. Усі інші варіанти вимагають кропіткої роботи водія.
Бер-

Cp2102 - мій улюблений мікросхем usb uart. Швидкий пошук Amazon показує їх за $ 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);

або (бажано IMHO) використовувати керування передачею 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.
Том

Ось відповідний лист даних: nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
Том

3

Мости через USB до UART є дешевими та легко доступними, але мають дійсно хиткі характеристики часу. Ньюарк продає плату "Embedded Pi", на якій є процесор ARM STM32F, на який можна писати голий метал. Цей чіп має три UART на ньому, і я думаю, що вони можуть пройти досить швидко; якби ви використовували один для спілкування з Raspberry Pi, це дозволить залишити два доступних для інших цілей. Відмова: Я купив одну з цих дощок, але поки що просто використовував Raspberry Pi сам для обробки потреб вводу / виводу безпосередньо.

Якщо ви хочете багато повільніших UART, STM32F на вбудованій дошці 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 IC, який є перетворювачем SPI в 2xUART. Він добре працює з Raspbian Stretch.

Це трохи дорожче, ніж чіп FTDI, але є два уарти, і мені не потрібно використовувати дорогоцінний порт 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.