Arduino può essere utilizzato per "spiare" una connessione UART tra due dispositivi?


11

Ho bisogno di installare un Arduino (in realtà solo l'IC) nell'hardware esistente per migliorare la funzionalità.

Quello che vorrei fare è collegare Arduino in modo che "spiani" sulle linee I / O tra due chip su una scheda. Se Arduino rileva una parola chiave specifica su quella connessione UART, eseguirà un'azione specifica su un set separato di pin di output.

Ciò di cui non sono sicuro è come collegare Arduino in modo tale da poter decodificare una connessione UART esistente senza partecipare? Se non è possibile, sono interessato a teorie, idee, ecc.

Risposte:


17

Se ho capito bene hai 2 dispositivi collegati tramite UART. Presumo solo le linee TX, RX e GND collegate tra i dispositivi? (cioè, nessuna linea di controllo DTS / CTS / DTR / RTS utilizzata - questo è tipico).

In questo scenario, il TX (trasmissione) del dispositivo 1 è collegato all'RX (ricezione) del dispositivo 2 e viceversa. I loro motivi sono collegati tra loro. Pertanto, ogni dispositivo può essere trasmesso e ricevuto contemporaneamente (ciascuno trasmette su un filo separato, la comunicazione è full duplex).

Il motivo per cui menziono tutto questo è perché diventa chiaro che per "annusare" o "ascoltare", avrai effettivamente bisogno di 2 UART per ascoltare entrambi i lati della conversazione.

Fondamentalmente, tutto ciò che dovresti fare è assicurarti che i GND UART di tutti e 3 i dispositivi siano in cortocircuito e connetti (davvero, "tee", come in un raccordo a T, come un impianto idraulico) le linee TX del dispositivo 1 e del dispositivo 2 alle 2 linee RX su 2 UART. Assicurarsi che i baud rate siano tutti configurati in modo identico.

Ci sono molte schede / disegni Arduino. Il più comune al giorno d'oggi, il Duemilanove, utilizza ATMega328P, che credo abbia solo 1 UART (beh, USART). Quindi dovresti collegare un secondo UART IC o ricorrere al "bit banging" sul secondo ricevitore.

Le comunicazioni UART asincrone sono ben definite, con bit di avvio e arresto (e talvolta bit di parità), quindi se il tuo processore è abbastanza veloce, puoi semplicemente collegare una delle linee UART TX del dispositivo a un GPIO configurato come input e eseguire il polling della linea abbastanza veloce con sovracampionamento per rilevare START & STOP e bit di campionamento. L'articolo "Bit Banging" di Jack Ganssle ti darà molto da masticare.

Una descrizione decente della forma d'onda RS232 è disponibile su BeyondLogic .

Nota che ci sono altri problemi come i livelli di tensione (0 / + 5, -10V / + 10V, ecc.) Che dovrai prendere in considerazione (vedi la sezione Beyond Logic su "Convertitori di livello RS232"). Non ho abbastanza informazioni sul tuo sistema per discutere dell'interfaccia hardware oltre all'approccio "connetti le linee" discusso sopra. Supponendo che i livelli di tensione siano abbinati, di solito non è un problema "collegare" la linea TX in un secondo ricevitore (lo sniffer), ma se il TX non ha abbastanza unità, potrebbe essere necessario inserire un buffer / driver per impedire segnale dal degrado.


Bellissimo! Mi serviranno solo i dati che viaggiano in una direzione, quindi il singolo UART sul chip ATMega è appena sufficiente! I due chip comunicano con +/- 5 V UART, che penso sia lo stesso di ATMega. Wow, dovrebbe essere così! Grazie!
Brad Hein,

@BradHein, quello che stai chiamando "+/- 5V" di solito viene chiamato "livello TTL" - vedi en.wikipedia.org/wiki/Logic_level .
Mels

3
@Mels +/- 5V NON è TTL, TTL NON va sotto terra. Questo è RS-232.
nmz787,

9

C'è un trucco che puoi fare se la comunicazione è in una direzione solo alla volta (cioè comunicazione half-duplex). Non funzionerà se entrambe le parti parlano contemporaneamente (full duplex) ma se è il tipico "fai questo" "ok ecco la risposta" "ora fai questo" "ok ecco la nuova risposta" tipo di comunicazioni funziona abbastanza bene.

Poiché il collegamento UART utilizza una condizione di inattività del trasmettitore a un livello logico alto (1), è necessario utilizzare una porta AND a 2 ingressi e collegare il TX da ciascun lato a un ingresso AND. L'output della porta AND è il tuo input per l'UART dello sniffer (è il pin RX). Ora prendi la linea TX del dispositivo B e portala anche a una porta I / O sullo sniffer. Configurerai lo sniffer per generare un interrupt quando questo pin passa da alto a basso.

Ricapitolando: dispositivo A UART TX -> AND gate input. Dispositivo B UART TX -> altro ingresso AND AND AND sniffer pin GPIO. Uscita di AND gate -> sniffer UART RX line.

Le comunicazioni UART sono costituite da un bit di inizio, un certo numero di bit di dati, un bit di parità opzionale e uno o più bit di arresto. Poiché lo stato inattivo è un logico alto (1), l'inizio di OGNI byte sarà un logico basso (0) e verrà attivato l'interrupt sullo sniffer. Mentre lo sniffer sta eseguendo l'interruzione I / O, l'hardware UART raccoglierà i bit dalla porta AND. Quando UART ha ricevuto il bit di stop, l'interrupt I / O sarà eseguito a lungo e l'interrupt UART RX verrà attivato.

La routine di interrupt-on-IO-change imposterà una variabile "direction" per indicare che le comunicazioni sono nella direzione "B-> A". L'interrupt di ricezione UART dello sniffer guarderebbe questa variabile "direction" e scriverà il byte appena ricevuto nel buffer appropriato. L'interrupt UART RX reimposterà quindi la variabile "direction" allo stato "A-> B" predefinito:

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 */
}

Questo codice è stato scritto per chiarezza e non necessariamente per ciò che scriveresti in una situazione del mondo reale. Personalmente farei "direzione" un puntatore alla struttura FIFO appropriata, ma questo è un altro esercizio. :-)

Quando il dispositivo A sta parlando, la linea I / O non si sposta (rimane su un '1' logico poiché il trasmettitore UART del dispositivo B è inattivo) e l'interruzione UART RX riceverà un byte, vedere che la direzione è A-> B e archiviare i dati in quel buffer. Quando il dispositivo B sta parlando, la linea di I / O si abbassa non appena il dispositivo B inizia a spostare i dati e la routine di interruzione I / O imposterà la direzione per indicare che il dispositivo B sta parlando. L'interrupt UART RX verrà infine attivato dopo che tutti i bit sono stati raccolti e poiché l'interrupt I / O si è occupato di impostare il registro di direzione in modo appropriato, il byte ricevuto verrà memorizzato nel buffer corretto.

Presto: comunicazioni half-duplex tra due dispositivi acquisiti con una singola linea UART e I / O sullo sniffer, senza comunicazioni UART a bit di bit.


Intrigante. Questo sta spingendo i limiti delle mie comprensioni, ma è grandioso! Una parte che non capisco è come l'UART dello sniffer è collegato al bersaglio in modo che possa intercettare entrambe le direzioni di comunicazione? Ho diversi pin I / O disponibili, quindi posso semplicemente usare due pin I / O usando questo metodo e raccogliere efficacemente entrambe le direzioni del traffico?
Brad Hein,

La linea UART RX dello sniffer è collegata all'uscita della porta AND. L'UART TX del dispositivo A è collegato a un ingresso della porta AND, mentre l'UART TX del dispositivo B è collegato all'altro ingresso della porta AND. Poiché la condizione inattiva (nessun traffico) di un UART è una logica "1", la porta AND combina efficacemente entrambi i segnali di trasmissione in uno. La linea I / O sullo sniffer viene utilizzata per rilevare il bit di avvio del dispositivo B in modo che possa prendere il byte che sta ricevendo sul suo UART e inserirlo nel buffer appropriato (traffico del dispositivo A o traffico del dispositivo B).
akohlsmith il

Il frammento di codice e il cablaggio del gate AND consentono allo sniffer di registrare entrambe le direzioni del flusso di traffico con un singolo UART. Funziona SOLO se il traffico è half-duplex. Ciò significa che quando un dispositivo sta parlando, l'altro sta ascoltando. Se entrambi parlano allo stesso tempo (full duplex), ciò non funzionerebbe affatto.
akohlsmith il

5

Non è necessario collegare il pin di trasmissione dei dati dell'AVR al circuito. Basta collegare la linea di ricezione alla metà del collegamento esistente che si desidera intercettare. Se il tuo particolare AVR ha due porte seriali, dovresti essere in grado di spiare simultaneamente entrambe le metà del collegamento esistente. Devi solo fare in modo che le impostazioni della porta corrispondano al baud rate esistente, ai bit di stop, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.