Como funciona a série TTL?


15

Eu tenho tentado encontrar uma boa descrição do "padrão" serial TTL sem muita sorte. Entendo que as linhas de transmissão serial (TX) e de recepção (RX) ficam ociosas (no VCC) e caem no chão quando um bit é transmitido. Como tal, eles são invertidos da norma, onde um "1" é alto e "0" é baixo.

O que não entendo é quem é responsável por manter a linha alta e como um zero é transmitido. O remetente conduz a linha para alta e baixa? Ou o receptor mantém a linha alta com o remetente puxando a linha para baixo (coletor aberto)?


Leia a resposta de Joby; aparentemente tudo o que eu pensava saber era invertido. :-)
blalor

RS232 real é o contrário 0 = 12v, 1 = 12V, é por isso que é confuso
Toby Jaffey

2
Ponto de terminologia: "TTL serial" é um termo severamente abrangente "(ponto a ponto) série assíncrona (nos níveis TTL)" parece ser o que você está perguntando. (Apesar de que é provavelmente ainda falta, mas pelo menos melhor)
Nick T

3
@Nick O tipo de OP significa o que é alimentado em um MAX232, eu chamaria isso de "RS232 em níveis TTL"
Toby Jaffey

2
@Joby - Se ele usa apenas Tx e Rx, e você também remove seus níveis, então não há mais RS232 sobre isso! Chame isso de UART.
Stevenvh

Respostas:


17

Com o TTL serial, existem duas linhas de dados unidirecionais. Cada um é conduzido pelo remetente, alto e baixo. Um bit 0 é representado por 0V a 1 bit pelo VCC.

O pino do receptor deve ser definido como uma entrada.

Portanto, para um microcontrolador enviar um byte (8-N-1 sem controle de fluxo), ele poderia fazer algo assim:

#define BAUDRATE 9600
#define DELAY (SYS_CLK/BAUDRATE)

#define UART_BITBANG_OFF     UART_BITBANG_PORT |= _BV(UART_BITBANG_PIN)
#define UART_BITBANG_ON      UART_BITBANG_PORT &= ~ _BV(UART_BITBANG_PIN)

#define UART_BITBANG_BIT(bit) {if (bit) UART_BITBANG_ON; else UART_BITBANG_OFF; _delay_us(DELAY);}

void uart_bitbang_init(void)
{
    UART_BITBANG_DDR &= ~ _BV(UART_BITBANG_PIN);        // TX output
}

void uart_bitbang_putc(uint8_t c)
{
    UART_BITBANG_BIT(1)
    UART_BITBANG_BIT((c & 0x1) == 0);
    UART_BITBANG_BIT((c & 0x2) == 0);
    UART_BITBANG_BIT((c & 0x4) == 0);
    UART_BITBANG_BIT((c & 0x8) == 0);
    UART_BITBANG_BIT((c & 0x10) == 0);
    UART_BITBANG_BIT((c & 0x20) == 0);
    UART_BITBANG_BIT((c & 0x40) == 0);
    UART_BITBANG_BIT((c & 0x80) == 0);
    UART_BITBANG_BIT(0);
}

(Este código lê um pouco para trás, pois foi originalmente criado para serial TTL invertida)

Obviamente, a maioria dos MCUs possui UARTs de hardware que fazem tudo isso para você.

Aqui está o que você veria em um escopo:

https://www.pololu.com/docs/0J25/4.a

Aqui está um ótimo vídeo de ladyada explicando a série: http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/


Obrigado, Joby. Portanto, mesmo que a linha fique inativa, um bit 0 ainda é 0v. O receptor normalmente possui um pull-up interno na linha RX, para que não flutue?
blalor

@blalor a linha não flutua, o remetente está dirigindo (assumindo que as duas extremidades estejam conectadas)
Toby Jaffey

O NewSoftSerial do Arduino permite o pull-up interno do AVR no pino RX. Presumo que isso seja necessário se não houver um remetente anexado. Obrigado pela informação e pelo link Adafruit adicionado.
blalor

1
Sendo um pouco pedante, mas "TTL" não implica apenas níveis? Você descreve um link serial ponto a ponto, mas poderia ser também uma topologia multimestre com drivers de coletor aberto e um pullup (como LIN, mas com níveis TTL)? "Série TTL" parece um termo incrivelmente amplo, quase inútil sem algum contexto.
Nick T

1
É apenas a interface da porta serial padrão com os conversores de voltagem removidos.
starblue

8

Você não diz em tantas palavras, mas o "ponto morto" sugere que você quer dizer um UART. O UART é um ponto a ponto conectado aos transceptores de linha, como o onipresente mas datado MAX232 (existem soluções muito melhores hoje em dia). A linha entre microcontrolador e transceptor também será curta; se houver distância a ser superada, será entre os transceptores.
A saída do controlador é um push-pull.

insira a descrição da imagem aqui

O P-MOSFET fornecerá o nível alto, o N-MOSFET o nível baixo. Um deles deve estar ativo ou o nível da linha flutuaria e seria indefinido (ou definido por uma carga no transceptor). Ambos são capazes de obter / absorver alguma corrente e puxam a linha para os trilhos, de modo que o formato do sinal será quase ideal.
O que seria diferente se fosse realmente TTL, como na sua pergunta (o microcontrolador é o HCMOS). As saídas TTL são altamente assimétricas: elas podem fornecer apenas pouca corrente, normalmente 0,4 mA. Corrente de afundamento está OK, a 8mA. A baixa corrente da fonte pode ser um problema se a linha tiver uma alta capacitância e for de alta velocidade. A baixa corrente do inversor significa que a capacitância carregará apenas de forma relativamente lenta e as bordas ascendentes serão lentas, o que em alta velocidade pode causar séria distorção do sinal. TTL nunca é usado para isso.

Sua pergunta também pode se referir a uma linha multiponto , onde vários dispositivos podem conversar. Nesse caso, você não pode usar a saída push-pull: se um dispositivo elevasse a linha alta enquanto outro a reduzisse, haveria um curto-circuito. As linhas multiponto quase sempre usam resistores pull-up para manter a linha ociosa alta. Então, apenas um nível baixo exige a condução da linha e, em vez da saída push-pull, teremos um dreno aberto, apenas com o N-MOSFET. A linha agora também é acionada de forma assimétrica: o resistor pull-up pode fornecer apenas pouca corrente, enquanto o FET pull-down pode conduzir a linha rapidamente ao solo. As linhas multiponto de alta velocidade, portanto, limitam os resistores de pull-up. Um exemplo é o I2C.


"o onipresente mas datado MAX232 (hoje existem soluções muito melhores)" Você poderia dar alguns exemplos?
m.Alin

3
@ m.Alin - diz Maxim : "Muitos projetistas de placas ainda usam o MAX232 hoje, apesar do fato de os dispositivos de fornecimento único terem sofrido grandes melhorias ao longo dos anos". Lista de transceptores
stevenvh
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.