Jak uzyskać więcej niż jeden interfejs Uart

30

Ok, mam jeden interfejs uart (TXD GPIO 14, RXD GPIO 15). Chcę przynajmniej jeszcze jeden interfejs uart.

Możliwe rozwiązania:

  • Uderzanie bitów: użyj dwóch niepowiązanych zapasowych GPIO. Rozumiem, że synchronizacja jest problemem na standardowym linuksie. Czy byłby niezawodny przy bardzo niskiej prędkości transmisji?

  • Przełączanie: RPI decyduje, kiedy rozmawiać z którym urządzeniem. Za pomocą np . CD4066BC .

  • spi do 2 x mostek Uart: Nie znalazłem odpowiedniej części (dostępność, cena, pakiet dil)

  • USB to Uart: Drogie

Czy są inne opcje? Jestem skłonny do zmiany, jeśli można to zrobić. Co byś doradził

tauran
źródło

Odpowiedzi:

10

USB UART, taki jak FTDI, nie jest naprawdę drogi. Wszystkie inne opcje brzmią tak, jakby kosztowały cię więcej części i czasu niż ~ 13 USD, które mogą cię kosztować, i byłyby niewiarygodne lub powolne. Wybierz szybką i bezproblemową opcję, taką jak:

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

Sparkfun też sprzedaje. W rzeczywistości może po prostu wyciągniesz jedno ze starego urządzenia USB lub kupisz w sklepie ze śmieciami, który nie wie, co robi.

Pomieszałem z adapterem SPI do UART dla projektu Arduino, nie było żadnej biblioteki, więc napisałem własną. W końcu działało dobrze, ale gdybym mógł po prostu wpłacić 15 USD, zrobiłbym to. W rzeczywistości, biorąc pod uwagę czas, który mnie to kosztowało, powinienem mieć właśnie mega z 4 portami szeregowymi.

Alternatywnie, jeśli chcesz mieć wiele portów szeregowych, możesz spojrzeć na port szeregowy RS485, który jest podobny do 232 (choć niekompatybilny), który obsługuje wielokrotne upuszczanie, tj. Kilka interfejsów w jednej linii.

jbyrnes
źródło
1
Jest to również łatwa opcja z punktu widzenia oprogramowania. FTDI ma gotową obsługę sterownika Linux. Wszystkie pozostałe opcje będą wymagały starannej pracy sterownika.
Ber
CP2102 to mój ulubiony układ USB UART. Szybkie wyszukiwanie w Amazon pokazuje je za 6,99 USD (edytuj 1,50 USD) z dołączonym kablem! Nie mogę tego przebić!
portforwardpodcast
6

Jeśli zdecydujesz się ominąć dodawanie dodatkowego sprzętu i po prostu pójść drogą bitów, nie jest to tak trudne, jak niektórzy to wyobrażają.

Po pierwsze, twój wątek komunikacyjny musi przejść w czasie rzeczywistym:

#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;
}

Odtąd twój wątek nie będzie wcześniej opróżniany przez 950 ms na sekundę * , chyba że dobrowolnie zwróci kontrolę (przez sched_yield()lub usleep()) w odpowiednim czasie, co nigdy go nie spowoduje. Z procesorem 850 MHz twoja pętla bitowa będzie pracować bezczynnie przez większość czasu, nawet przy najszybszych prędkościach.

Teraz niestety wymóg powrotu kontroli od czasu do czasu oznacza, że ​​gdy twój wątek śpi, cokolwiek wysyła „przeciwna partia”, zostanie utracone na zawsze. Ale w tym celu można użyć kontroli transmisji. Przydziel trochę GPIO dla linii CTS, którą ściągasz przed poddaniem się i cofaj po przywróceniu kontroli:

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

lub (najlepiej IMHO) użyj sterowania transmisją XON / XOFF - wyślij znak XOFF przez RS232 przed snem, XON po wznowieniu pracy. Domyślne kody ASCII są '\x13'dla XOFF / „przestań wysyłać” i '\x11'dla XON / „wznów wysyłanie”.

Oczywiście twoje zdalne urządzenie musi ich przestrzegać. Jeśli nie, niektóre dane zostaną utracone.

SF.
źródło
4

Znalazłem to, czego szukasz: slave I2C / SPI do mostka UART / IrDA / GPIO.

Występują w wersji pojedynczej i podwójnej (czyli 1 lub 2 dodatkowe UART). Oni (NXP) także (w razie potrzeby drugiej strony) mają mostki I2C / SPI master do UART / IrDA / GPIO.

Więcej informacji na temat tych układów znajduje się tutaj i główny odpowiednik.

Maxim ma również żetony, które robią dokładnie to samo.

ikku
źródło
Dobra informacja, ale linki NXP dają tutaj HTTP 403.
Tom
Oto odpowiedni arkusz danych: nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
Tom
3

Mostki USB na UART są tanie i łatwo dostępne, ale mają naprawdę kiepską charakterystykę czasową. Newark sprzedaje płytę „Embedded Pi”, która ma procesor ARM STM32F, na którym można pisać kod od zera. Ten układ ma trzy UART i myślę, że mogą iść dość szybko; jeśli użyjesz jednego z nich do komunikacji z Raspberry Pi, pozostawi dwa z nich do innych celów. Oświadczenie: Kupiłem jedną z tych kart, ale jak dotąd po prostu użyłem samego Raspberry Pi do bezpośredniego obsługi potrzeb I / O.

Jeśli chcesz mieć dużo wolniejszych UART, STM32F na płycie Embedded Pi prawdopodobnie poradziłby sobie z niezłą liczbą, szczególnie jeśli chcesz napisać jakiś język asemblera Arm. Jeśli na jednej płycie dostępne są dwie grupy 16 pinów I / O, może być możliwe jednoczesne działanie 16 jednoczesnych UART oprogramowania z całkiem przyzwoitą szybkością transmisji (okresowe przerwanie z prędkością 3 lub 5 razy większą niż prędkość przechowywania 16-bitowe zatrzaśnięte wartości z portu odbiorczego do bufora, i wysyła 16-bitowe wstępnie obliczone wartości z bufora do portu nadawczego; jeśli to zrobisz, to pod warunkiem, że średni czas obsługi oprogramowania UART nie jest zbyt wielki, to nie będzie miało znaczenia, czy zdarzają się najgorsze trafienia (np. wszystkie szesnaście portów jednocześnie otrzymuje bajt).

Takie podejście może faktycznie zadziałać niezwykle wydajnie w przypadku odbierania, ponieważ kod „zwykłego przypadku” nie musi nawet patrzeć na poszczególne UART. Załóżmy, że próbkujesz dane 5 razy, a ostatnie 47 bajtów bufora jest duplikowanych bezpośrednio przed nim. Zakładając, że dane są zapisywane w buforze w porządku rosnącym, możesz następnie sprawdzić, czy któryś z bajtów został w pełni odebrany na jednym z 16 kanałów, po prostu mówiąc:

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

Jeśli bytes_readywynosi zero, nie otrzymano żadnych danych. W przeciwnym razie, jeśli np. bytes_readyUstawiony jest bit 2 , oznacza to, że odebrany bajt danych można znaleźć w bicie 2 danych [rx_ptr-40], danych [rx_ptr-35], danych [rx_ptr-30] itp. dane, wyczyść bit 2 z armed_flag i ustaw, aby został zresetowany po około 44 próbkach.

Podejście to będzie wymagało trochę pracy na tych próbkach, w których bajt danych jest w pełni odebrany (i potencjalnie dużo pracy, jeśli wszystkie 16 kanałów ma bajt danych docierających jednocześnie), ale w większości próbek ilość pracy będzie bardzo niewielki. Gdyby ktoś miał 64 piny I / O, można by obsłużyć do 32 UART za pomocą tego podejścia bez dodawania dodatkowej pracy do „zwykłego” przypadku.

supercat
źródło
1

Mikrokontroler taki jak Picaxe może pobierać dane szeregowe na jednym pinie i odpowiednio wysyłać dane szeregowe na określonym pinie. Dałoby to efektywnie więcej wyjść szeregowych, gdybyś był gotów powiedzieć Picaxe, który pin na wyjściu. Może to zrobić to samo, ale w odwrotnej kolejności, dzięki czemu może odbierać dane szeregowe z wielu urządzeń i wysyłać je do Raspberry Pi. Inną opcją może być spowodowanie, że podłączone urządzenia będą wymagały kwalifikatora . Oznacza to, że urządzenie 1 musiałoby odebrać dane „d1”, na przykład zanim będzie nasłuchiwać dalszych danych na linii szeregowej. Urządzenie 2 może mieć „d2” jako swój kwalifikator. Oznaczałoby to, że aby przywitać się z urządzeniem 1, wystarczy wysłać „d1hello” w linii UART.

Picaksy są dość tanie, można je uzyskać na stronie http://www.techsupplies.co.uk/ i są w wielu rozmiarach z różną liczbą pinów i tak dalej.

Phillid
źródło
1

Jeśli komunikacja z kilkoma urządzeniami podrzędnymi UART nie musi odbywać się równolegle, możesz udostępnić jeden dostępny port UART między nimi. Możesz użyć tranzystorów, aby włączyć tylko połączenia RxD / TxD z urządzeniem, z którym obecnie chcesz rozmawiać. Tranzystory te mogą być kontrolowane przez inne piny GPIO Raspberry Pi.

Matthias
źródło
1

Raspberry Pi 4 obsługuje teraz do 4 interfejsów UART, które należy włączyć za pomocą nakładki drzewa urządzeń. Możesz dowiedzieć się, jak to zrobić i które piny są tutaj używane:

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

Fundacja RPi wciąż przygotowuje na to dokumentację.

Vanthome
źródło
0

Miałem ten sam problem. Potrzebuję połączyć się z 2-4 modułami GSM i znalazłem rozwiązanie sprzętowe: http://www.instructables.com/id/SPI-to-4-x-UART-Bridge-MULTIUART/

To rozwiązanie jest oparte na PIC24FJ64GA306. Możesz zastąpić PIC Atcu mcu, ale musisz utworzyć nową płytkę drukowaną :)

Jerzy Drożdż
źródło
0

Używam SC16IS752 IC, który jest konwerterem SPI na 2xUART. Działa dobrze z Raspbian Stretch.

Jest nieco droższy niż układ FTDI, ale są dwa uarty i nie muszę używać cennego portu USB.

Kamil
źródło
-1

Spójrz na https://www.kickstarter.com/projects/1915118535/uart-hat-for-raspberry-pi Mam nadzieję, że to rozwiąże problem

Ameen Faraz
źródło
1
Ponieważ to nie jest produkt, który jest faktycznie dostępny, czyni to zły wybór.
Jacobm001
1
Co gorsza, wygląda na to, że firma, która wykonała projekt KS, spasowała bez dostarczenia towaru.
WineSoaked