O Arduino pode ser usado para "espionar" uma conexão UART entre dois dispositivos?


11

Eu preciso instalar um Arduino (na verdade, apenas o IC) no hardware existente para aprimorar a funcionalidade.

O que eu gostaria de fazer é conectar o Arduino para que ele "espie" nas linhas de E / S entre dois chips em uma placa. Se o Arduino pegar uma palavra-chave específica nessa conexão UART, ele executará uma ação específica em um conjunto separado de pinos de saída.

O que não tenho certeza é como conectar o Arduino de forma que ele possa decodificar uma conexão UART existente sem participar? Se não for possível, estou interessado em teorias, idéias etc.

Respostas:


17

Se bem entendi, você tem 2 dispositivos conectados via UART. Presumo apenas linhas TX, RX e GND conectadas entre os dispositivos? (ou seja, nenhuma linha de controle DTS / CTS / DTR / RTS usada - isso é típico).

Nesse cenário, o TX do dispositivo 1 (transmissão) está conectado ao RX do dispositivo 2 (recebimento) e vice-versa. Seus fundamentos estão conectados um ao outro. Assim, cada dispositivo pode transmitir e receber ao mesmo tempo (cada um transmite em um fio separado, a comunicação é full-duplex).

A razão de eu mencionar tudo isso é porque fica claro que, para "cheirar" ou "escutar", você realmente precisará de 2 UARTs para ouvir os dois lados da conversa.

Basicamente, tudo o que você faria é garantir que os UNDs dos GARTs de todos os três dispositivos estejam em curto e conecte (realmente, "tee", como em um encaixe em T, como um encanamento) as linhas TX do dispositivo 1 e do dispositivo 2 e as linhas TX do dispositivo 2 às 2 linhas RX em 2 UARTs. Verifique se as taxas de transmissão estão todas configuradas de forma idêntica.

Existem muitas placas / designs do Arduino. O mais comum atualmente, o Duemilanove, usa o ATMega328P, que acho que possui apenas 1 UART (bem, USART). Então, você teria que conectar um segundo UART IC ou recorrer a "batidas" no segundo receptor.

As comunicações assíncronas do UART são bem definidas, com bits de início e parada (e às vezes bits de paridade); portanto, se o seu processador for rápido o suficiente, você pode simplesmente conectar uma das linhas UART TX do dispositivo a um GPIO configurado como entrada e pesquisar a linha rápido o suficiente com oversampling para detectar START & STOP e amostras de bits. O artigo "Bit Banging" de Jack Ganssle lhe dará muito o que comentar.

Uma descrição decente da forma de onda RS232 pode ser encontrada no BeyondLogic .

Observe que existem outros problemas, como níveis de tensão (0 / + 5, -10V / + 10V, etc.) que você precisará levar em consideração (consulte a seção Além da lógica em "Conversores de nível RS232"). Não tenho informações suficientes em seu sistema para discutir a interface de hardware além da abordagem "conectar as linhas" discutida acima. Supondo que os níveis de tensão sejam compatíveis, geralmente não é um problema "colocar" a linha TX em um segundo receptor (o sniffer), mas se o TX não tiver unidade suficiente, talvez seja necessário inserir um buffer / driver para impedir sinal de degradação.


Bonita! Vou precisar apenas dos dados que viajam em uma direção, para que o único UART no chip ATMega seja suficiente! Os dois chips se comunicam com +/- 5V UART, que eu acho que é o mesmo que o ATMega. Uau, deve ser isso! Obrigado!
Brad Hein

@BradHein, o que você chama de "+/- 5V" geralmente é chamado de "nível TTL" - consulte en.wikipedia.org/wiki/Logic_level .
Mels

3
@Mels +/- 5V NÃO é TTL, TTL NÃO fica abaixo do solo. Este é o RS-232.
fácil

9

Há um truque interessante que você pode fazer se a comunicação estiver em uma direção apenas de cada vez (isto é, comunicação half-duplex). Não funcionará se os dois lados conversarem ao mesmo tempo (full duplex), mas se for o seu tipo típico de comunicação "faça isso" "ok, aqui está a resposta" "agora faça isso" "ok, aqui está a nova resposta" funciona muito bem.

Como o link UART usa uma condição ociosa do transmissor em um nível lógico alto (1), você usaria uma porta AND de 2 entradas e conectaria o TX de cada lado a uma entrada AND. A saída da porta AND é sua entrada para o UART do seu sniffer (é o pino RX). Agora pegue a linha TX do dispositivo B e leve-a para uma porta de E / S no sniffer. Você configurará o sniffer para gerar uma interrupção quando esse pino for de alto a baixo.

Para recapitular: entrada do dispositivo A UART TX -> AND gate. Dispositivo B UART TX -> outra entrada AND gate E pino do farejador GPIO. Saída da porta AND -> sniffer da linha UART RX.

As comunicações UART consistem em um bit inicial, algum número de bits de dados, um bit de paridade opcional e um ou mais bits de parada. Como o estado ocioso é uma lógica alta (1), o início de CADA byte será uma lógica baixa (0) e a interrupção no sniffer será acionada. Enquanto o seu sniffer estiver executando a interrupção de E / S, o hardware do UART coletará bits do portão AND. Quando o UART receber o bit de parada, a interrupção de E / S será realizada por muito tempo e a interrupção do UART RX será acionada.

A rotina de interrupção na troca de IO definirá uma variável "direction" para indicar que as comunicações estão na direção "B-> A". A interrupção de recebimento UART do sniffer examinaria essa variável "direction" e gravaria o byte recém-recebido no buffer apropriado. A interrupção do UART RX retornaria a variável "direction" ao estado "A-> B" padrão:

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

Esse código foi escrito para maior clareza e não necessariamente o que você escreveria em uma situação do mundo real. Pessoalmente, eu faria da "direção" um ponteiro para a estrutura FIFO apropriada, mas isso é outro exercício inteiramente. :-)

Quando o dispositivo A está falando, a linha de E / S não se move (permanece no lógico '1', pois o transmissor UART do dispositivo B está ocioso) e a interrupção do UART RX receberá um byte, veja se a direção é A-> B e armazene os dados nesse buffer. Quando o dispositivo B está falando, a linha de E / S fica baixa assim que o dispositivo B inicia a transferência de dados e a rotina de interrupção de E / S define a direção para indicar que o dispositivo B está falando. A interrupção do UART RX será acionada depois que todos os bits tiverem sido coletados e, como a interrupção de E / S cuidou de definir o registro de direção adequadamente, o byte recebido será armazenado no buffer correto.

Presto: comunicações half-duplex entre dois dispositivos capturados com uma única linha de UART e E / S no sniffer, sem comunicação UART.


Intrigante. Isso está empurrando os limites do meu entendimento, mas é ótimo! Uma parte que não entendo é como o UART do farejador está conectado ao alvo para que ele possa interceptar as duas direções da comunicação? Eu tenho vários pinos de E / S disponíveis, então eu poderia apenas usar dois pinos de E / S usando esse método e coletar efetivamente as duas direções de tráfego?
Brad Hein

A linha UART RX do farejador está conectada à saída da porta AND. O UART TX do dispositivo A está conectado a uma entrada da porta AND e o UART TX do dispositivo B está conectado à outra entrada da porta AND. Como a condição de inatividade (sem tráfego) de um UART é lógica '1', a porta AND combina efetivamente ambos os sinais de transmissão em um. A linha de E / S no sniffer é usada para detectar o bit inicial do dispositivo B, para que ele possa pegar o byte que está recebendo no UART e colocá-lo no buffer apropriado (tráfego do dispositivo A ou tráfego do dispositivo B).
akohlsmith

O fragmento de código e a fiação da porta AND permitem que o farejador registre as duas direções do fluxo de tráfego com um único UART. Isso só funciona se o tráfego for half-duplex. Isso significa que, quando um dispositivo está falando, o outro está ouvindo. Se os dois falarem ao mesmo tempo (full duplex), isso não funcionará.
akohlsmith

5

Você não precisa conectar o pino de dados de transmissão do AVR ao seu circuito. Basta conectar a linha de recebimento à metade do link existente no qual você deseja escutar. Se o seu AVR específico tiver duas portas seriais, você poderá espionar as duas metades do link existente simultaneamente. Você só precisa fazer as configurações da porta corresponderem à taxa de transmissão, bits de parada etc.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.