¿Se puede usar el Arduino para "espiar" una conexión UART entre dos dispositivos?

11

Necesito instalar un Arduino (en realidad, solo el IC) en el hardware existente para mejorar la funcionalidad.

Lo que me gustaría hacer es conectar el Arduino para que "espíe" las líneas de E / S entre dos chips en una placa. Si el Arduino recoge una palabra clave específica en esa conexión UART, realizará una acción específica en un conjunto separado de pines de salida.

¿Tengo dudas sobre cómo conectar el Arduino de manera que pueda decodificar una conexión UART existente sin participar? Si no es posible, estoy interesado en teorías, ideas, etc.

    
pregunta Brad Hein

3 respuestas

17

Si entiendo correctamente, tienes 2 dispositivos conectados a través de UART. ¿Supongo que solo las líneas TX, RX y GND conectadas entre los dispositivos? (es decir, no se utilizan líneas de control DTS / CTS / DTR / RTS, esto es típico).

En este escenario, la transmisión (transmisión) del dispositivo 1 está conectada a la recepción (recepción) del dispositivo 2 y viceversa. Sus motivos están conectados entre sí. Por lo tanto, cada dispositivo puede transmitir y recibir al mismo tiempo (cada uno se transmite por un cable separado, la comunicación es dúplex completo).

La razón por la que menciono todo esto es porque queda claro que para "oler" o "escuchar", en realidad necesitarás 2 UART para escuchar los dos lados de la conversación.

Básicamente, lo único que haría es asegurarse de que los UART GND de los 3 dispositivos estén en cortocircuito, y conectarlos (en realidad, "tee", como en una conexión en T, como tuberías) dispositivo 1 & Las líneas de transmisión del dispositivo 2 a las 2 líneas de RX en 2 UARTs. Asegúrese de que todas las velocidades en baudios estén configuradas de manera idéntica.

Hay muchos tableros / diseños Arduino. El más común en la actualidad, el Duemilanove, usa el ATMega328P, que creo que solo tiene 1 UART (bueno, USART). Así que tendrías que conectar un segundo UART IC o recurrir a "bit banging" en el segundo receptor.

Las comunicaciones asíncronas UART están bien definidas, con start & bits de parada (y, a veces, bits de paridad), por lo que si su procesador es lo suficientemente rápido, simplemente puede conectar una de las líneas UART TX del dispositivo a un GPIO configurado como entrada y sondear la línea lo suficientemente rápido con un sobremuestreo para detectar START & STOP y bits de muestra. El artículo "Bit Banging" de Jack Ganssle te dará mucho que masticar.

Puede encontrar una descripción decente de la forma de onda RS232 en BeyondLogic .

Tenga en cuenta que hay otros problemas, como los niveles de voltaje (0 / + 5, -10V / + 10V, etc.) que deberá tener en cuenta (consulte la sección Más allá de la lógica en "Convertidores de nivel RS232") . No tengo suficiente información en su sistema para hablar sobre la interfaz del hardware, además del enfoque de "conectar las líneas" que se explicó anteriormente. Suponiendo que los niveles de voltaje coinciden, por lo general no es un problema "girar" la línea de TX en un segundo receptor (el sniffer), pero si el TX no tiene suficiente unidad, es posible que deba insertar un búfer / controlador para evitar la señal de degradación.

    
respondido por el Radian
9

Hay un buen truco que puedes hacer si la comunicación es en una dirección solo a la vez (es decir, comunicación semidúplex). No funcionará si ambas partes hablan entre sí al mismo tiempo (dúplex completo), pero si es el típico "haz esto" "ok, aquí está la respuesta" "ahora haz esto" "ok, aquí está la nueva respuesta" tipo de comunicaciones funciona bastante bien.

Dado que el enlace UART usa una condición inactiva del transmisor en un nivel lógico alto (1), usaría una puerta AND de 2 entradas y conectaría el TX de cada lado a una entrada AND. La salida de la compuerta AND es su entrada a la UART de su sniffer (es el pin RX). Ahora tome la línea TX del dispositivo B y llévela a un puerto de E / S en el detector. Configurará el sniffer para generar una interrupción cuando este pin pase de alto a bajo.

Para recapitular: dispositivo A UART TX - > Y entrada de puerta. Dispositivo B UART TX - > otra entrada de compuerta AND Y pin GPIO sniffer. Salida de la puerta AND - > sniffer línea UART RX.

Las comunicaciones UART consisten en un bit de inicio, un cierto número de bits de datos, un bit de paridad opcional y uno o más bits de parada. Dado que el estado inactivo es un nivel lógico alto (1), el inicio de CADA byte será un nivel lógico bajo (0) y se disparará la interrupción en el rastreador. Mientras su sniffer está ejecutando la interrupción de E / S, el hardware de UART recolectará bits de la puerta AND. En el momento en que UART haya recibido el bit de parada, la interrupción de E / S se completará por mucho tiempo y la interrupción de RX de UART se disparará.

La rutina de interrupción de IO-cambio establecerá una variable de "dirección" para indicar que las comunicaciones están en la dirección "B- > A". La interrupción de recepción de UART del sniffer observaría esta variable de "dirección" y escribiría el byte que se acaba de recibir en el búfer apropiado. La interrupción de RX de UART restablecería la variable de "dirección" al estado predeterminado "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 */
}

Este código está escrito para mayor claridad y no necesariamente lo que escribirías en una situación del mundo real. Personalmente, convertiría la "dirección" en un indicador de la estructura FIFO apropiada, pero ese es otro ejercicio completamente. :-)

Cuando el dispositivo A está hablando, la línea de E / S no se mueve (permanece en un '1' lógico ya que el transmisor UART del dispositivo B está inactivo), y la interrupción de RX de UART recibirá un byte, verifique que la dirección es A - > B, y almacena los datos en ese búfer. Cuando el dispositivo B está hablando, la línea de E / S bajará tan pronto como el dispositivo B comience a desplazar los datos, y la rutina de interrupción de E / S establecerá la dirección para indicar que el dispositivo B está hablando. La interrupción de RX de UART finalmente se activará después de que se hayan recopilado todos los bits y, dado que la interrupción de E / S se ha ocupado de configurar el registro de dirección de manera adecuada, el byte recibido se almacenará en el búfer correcto.

Presto: comunicaciones half-duplex entre dos dispositivos capturados con una sola UART y una línea de E / S en el sniffer, sin comunicaciones UART de bit banged.

    
respondido por el akohlsmith
5

No tiene que conectar el pin de datos de transmisión del AVR a su circuito. Simplemente conecte la línea de recepción a la mitad del enlace existente que desea escuchar. Si su AVR en particular tiene dos puertos seriales, debería poder espiar en ambas mitades del enlace existente simultáneamente. Solo tiene que hacer que la configuración del puerto coincida con la velocidad en baudios existente, los bits de parada, etc.

    
respondido por el JustJeff

Lea otras preguntas en las etiquetas