Czy można używać Arduino do „szpiegowania” połączenia UART między dwoma urządzeniami?

11

Muszę zainstalować Arduino (właściwie tylko IC) na istniejącym sprzęcie, aby zwiększyć funkcjonalność.

Chciałbym podłączyć Arduino, aby „szpiegowało” na liniach we / wy między dwoma chipami na płycie. Jeśli Arduino wybierze określone słowo kluczowe na tym połączeniu UART, wykona określoną akcję na osobnym zestawie pinów wyjściowych.

Nie jestem pewien, jak podłączyć Arduino w taki sposób, aby mógł dekodować istniejące połączenie UART bez udziału? Jeśli nie jest to możliwe, interesują mnie teorie, pomysły itp.

Brad Hein
źródło

Odpowiedzi:

17

Jeśli dobrze rozumiem, masz 2 urządzenia podłączone przez UART. Zakładam tylko linie TX, RX i GND podłączone między urządzeniami? (tzn. nie zastosowano linii kontrolnych DTS / CTS / DTR / RTS - jest to typowe).

W tym scenariuszu urządzenie TX 1 (transmisja) jest podłączone do urządzenia RX urządzenia (odbiór) i na odwrót. Ich podstawy są ze sobą połączone. Zatem każde urządzenie może jednocześnie nadawać i odbierać (każde przesyła osobnym przewodem, komunikacja jest w trybie pełnego dupleksu).

Powodem, dla którego wspominam o tym wszystkim, jest to, że staje się jasne, że aby „wąchać” lub „słuchać”, faktycznie potrzebujesz 2 UART, aby słuchać obu stron rozmowy.

Zasadniczo wystarczy upewnić się, że masy UART wszystkich 3 urządzeń są zwarte, i połączyć (naprawdę „trójnik”, jak w trójniku, jak hydraulika) urządzenie 1 i linie TX urządzenia 2 z 2 liniami RX na 2 UARTach. Upewnij się, że wszystkie prędkości transmisji są skonfigurowane identycznie.

Istnieje wiele płyt / wzorów Arduino. Najpopularniejszy obecnie, Duemilanove, używa ATMega328P, który, jak sądzę, ma tylko 1 UART (no, USART). Będziesz musiał albo podłączyć drugi UART IC, albo zastosować „bit banging” na drugim odbiorniku.

Asynchroniczna komunikacja UART jest dobrze zdefiniowana, z bitami start i stop (a czasami bitami parzystości), więc jeśli twój procesor jest wystarczająco szybki, możesz po prostu podłączyć jedną z linii UART TX urządzenia do GPIO skonfigurowanego jako wejście i odpytać linię wystarczająco szybko z oversamplingiem, aby wykryć START & STOP i próbki bitów. Artykuł „Bit Banging” Jacka Ganssle'a da ci wiele do żucia.

Przyzwoity opis przebiegu RS232 można znaleźć w BeyondLogic .

Należy pamiętać, że istnieją inne problemy, takie jak poziomy napięcia (0 / + 5, -10 V / + 10 V itp.), Które należy wziąć pod uwagę (patrz sekcja Beyond Logic w „Konwerterach poziomu RS232”). Nie mam wystarczających informacji w twoim systemie, aby omówić interfejs sprzętowy oprócz omówionego powyżej podejścia „połącz linie”. Zakładając, że poziomy napięcia są dopasowane, zwykle nie jest problemem „przełączyć” linię TX do drugiego odbiornika (sniffera), ale jeśli TX nie ma wystarczającej ilości napędu, może być konieczne włożenie bufora / sterownika, aby zapobiec sygnał z degradacji.

Radian
źródło
Piękny! Potrzebuję danych przesyłanych tylko w jednym kierunku, więc wystarczy jeden UART na chipie ATMega! Dwa układy komunikują się z +/- 5 V UART, co moim zdaniem jest takie samo jak ATMega. Wow, to powinno być to! Dzięki!
Brad Hein
@BradHein, to, co nazywacie „+/- 5V”, jest zwykle określane jako „poziom TTL” - patrz en.wikipedia.org/wiki/Logic_level .
Mels
3
@Mels +/- 5 V NIE JEST TTL, TTL NIE schodzi poniżej uziemienia. To jest RS-232.
nmz787
9

Istnieje fajna sztuczka, którą możesz zrobić, jeśli komunikacja odbywa się tylko w jednym kierunku (tj. Komunikacja półdupleksowa). Nie zadziała, jeśli obie strony będą ze sobą rozmawiać w tym samym czasie (pełny dupleks), ale jeśli jest to typowe „zrób to” „ok, oto odpowiedź” „teraz zrób to” „ok, oto nowy rodzaj odpowiedzi” działa całkiem dobrze.

Ponieważ łącze UART wykorzystuje stan bezczynności nadajnika na wysokim poziomie logicznym (1), użyłbyś bramki AND z 2 wejściami i łączy TX z każdej strony z wejściem AND. Wyjście bramki AND jest Twoim wejściem do UART twojego sniffera (jest to pin RX). Teraz weź linię TX urządzenia B, a także przenieś ją do portu we / wy w snifferze. Sniffer skonfigurujesz tak, aby generował przerwanie, gdy ten pin zmieni się z wysokiego na niski.

Podsumowując: urządzenie A UART TX -> AND bramka wejściowa. Urządzenie B UART TX -> inne ORAZ wejście bramki ORAZ sniffer pin GPIO. Wyjście bramki AND -> sniffer linii UART RX.

Komunikacja UART składa się z bitu początkowego, pewnej liczby bitów danych, opcjonalnego bitu parzystości i jednego lub więcej bitów stopu. Ponieważ stan bezczynności jest wysokim poziomem logicznym (1), początek KAŻDEGO bajtu będzie miał niski poziom logiczny (0), a przerwanie na snifferze zostanie uruchomione. Podczas gdy Twój sniffer wykonuje przerwanie we / wy, sprzęt UART będzie zbierał bity z bramki AND. Zanim UART otrzyma bit stopu, przerwanie we / wy będzie długo trwało, a przerwanie UART RX zadziała.

Procedura zmiany przerwania przy IO ustawi zmienną „kierunek”, aby wskazać, że komunikacja odbywa się w kierunku „B-> A”. Przerwanie odbierania UART sniffera spojrzy na tę zmienną „kierunek” i zapisze właśnie odebrany bajt do odpowiedniego bufora. Przerwanie UART RX przywróciłoby wówczas zmienną „direction” powrót do domyślnego stanu „A-> B”:

volatile int direction = 0;           /* 0 = A -> B */

void io_interrupt(void)
{
    direction = 1;                    /* switch direction, now B -> A */
}

void uart_interrupt(void)
{
    unsigned char b;

    b = UART_RX_REG;
    if(direction) {
        store_byte_to_device_b_sniff_buffer(b);
    } else {
        store_byte_to_device_a_sniff_buffer(b);
    }

    direction = 0;                   /* reset direction to default A -> B */
}

Ten kod został napisany dla zachowania przejrzystości i niekoniecznie tego, co napisałbyś w rzeczywistej sytuacji. Osobiście uczyniłbym „kierunek” wskaźnikiem odpowiedniej struktury FIFO, ale to zupełnie inne ćwiczenie. :-)

Gdy urządzenie A mówi, linia we / wy nie porusza się (pozostaje na logicznym „1”, ponieważ nadajnik UART urządzenia B jest bezczynny), a przerwanie UART RX otrzyma bajt, sprawdź, czy kierunek to A-> B i przechowuj dane w tym buforze. Gdy urządzenie B mówi, linia we / wy obniży się, gdy tylko urządzenie B zacznie wysyłać dane, a procedura przerwania we / wy ustawi kierunek wskazujący, że urządzenie B mówi. Przerwanie UART RX ostatecznie uruchomi się po zebraniu wszystkich bitów, a ponieważ przerwanie We / Wy zajęło się odpowiednim ustawieniem rejestru kierunku, odebrany bajt zostanie zapisany w odpowiednim buforze.

Presto: komunikacja w trybie półdupleksu między dwoma urządzeniami przechwyconymi za pomocą pojedynczej linii UART i linii we / wy w węźle podsłuchowym, bez komunikacji UART w postaci bitów.

akohlsmith
źródło
Intrygancki. To przesuwa granice mojego zrozumienia, ale to świetnie! Jedna część, której nie rozumiem, to sposób, w jaki UART sniffera jest podłączony do celu, aby mógł przechwytywać oba kierunki komunikacji? Mam kilka dostępnych pinów we / wy, więc czy mogę po prostu użyć dwóch pinów we / wy za pomocą tej metody i skutecznie zbierać oba kierunki ruchu?
Brad Hein,
Linia UART RX sniffera jest podłączona do wyjścia bramki AND. UART TX urządzenia A jest podłączony do jednego wejścia bramki AND, a UART TX urządzenia B jest podłączony do drugiego wejścia bramki AND. Ponieważ stan bezczynności (brak ruchu) UART jest logiczną „1”, bramka AND skutecznie łączy oba sygnały transmisji w jeden. Linia we / wy w snifferze służy do wykrywania bitu startowego urządzenia B, aby mógł pobrać bajt odbierany przez swój UART i umieścić go w odpowiednim buforze (ruch urządzenia A lub ruch urządzenia B).
akohlsmith,
Fragment kodu i okablowanie bramki AND umożliwiają snifferowi rejestrowanie obu kierunków przepływu ruchu za pomocą jednego UART. Działa to TYLKO, jeśli ruch jest w trybie półdupleksu. Oznacza to, że gdy jedno urządzenie mówi, drugie nasłuchuje. Jeśli obaj rozmawiają jednocześnie (pełny dupleks), to w ogóle nie zadziała.
akohlsmith,
5

Nie musisz podpinać pinu transmisji danych AVR do swojego obwodu. Po prostu podłącz linię odbiorczą do połowy istniejącego łącza, na którym chcesz podsłuchiwać. Jeśli twój AVR ma dwa porty szeregowe, powinieneś mieć możliwość szpiegowania obu połówek istniejącego łącza jednocześnie. Musisz tylko dopasować ustawienia portu do istniejącej prędkości transmisji, bitów stopu itp.

JustJeff
źródło