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)?

blalor
fonte
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/

Toby Jaffey
fonte
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.

stevenvh
fonte
"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