Come funziona il seriale TTL?


15

Ho provato a trovare una buona descrizione dello "standard" seriale TTL senza molta fortuna. Comprendo che le linee di trasmissione seriale (TX) e ricezione (RX) sono inattive (su VCC) e che cadono a terra quando viene trasmesso un bit. Come tali, sono invertiti dalla norma, dove uno "1" è alto e "0" è basso.

Quello che non capisco è chi è responsabile di mantenere alta la linea e come viene trasmesso uno zero. Il mittente guida la linea verso l'alto e il basso? Oppure il ricevitore mantiene la linea in alto con il mittente che tira la linea in basso (open collector)?


Leggi la risposta di Joby; apparentemente tutto ciò che pensavo di sapere era invertito. :-)
blalor il

Il vero RS232 è il contrario di 0 = 12v, 1 = -12v, ecco perché è confuso
Toby Jaffey,

2
Punto di terminologia: "seriale TTL" è un termine severamente troppo ampio ", il seriale asincrono (punto a punto) (ai livelli TTL)" sembra essere ciò di cui ti stai chiedendo. (Anche se probabilmente è ancora carente, ma almeno migliore)
Nick T,

3
@Nick Il tipo che OP indica è tutto ciò che viene immesso in un MAX232, che chiamerei "RS232 a livelli TTL"
Toby Jaffey,

2
@Joby - Se usa solo Tx e Rx e ne rimuovi anche i livelli, allora non c'è più nulla di RS232! Chiamalo UART.
Stevenvh,

Risposte:


17

Con il seriale TTL, ci sono due linee di dati unidirezionali. Ciascuno è guidato dal mittente, sia in alto che in basso. Uno 0 bit è rappresentato da 0 V a 1 bit da VCC.

Il pin del ricevitore deve essere impostato su un ingresso.

Quindi, per un microcontrollore che invia un byte (8-N-1 nessun controllo di flusso) potrebbe fare qualcosa del genere:

#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);
}

(Questo codice legge un po 'all'indietro in quanto originariamente pensato per seriale TTL invertita)

Naturalmente, la maggior parte degli MCU ha UART hardware che fanno tutto questo per te.

Ecco cosa vedresti su un ambito:

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

Ecco un ottimo video di ladyada che spiega il serial: http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/


Grazie Joby. Quindi, anche se la linea è inattiva alta, uno 0 bit è ancora 0v. Il ricevitore in genere ha un pull-up interno sulla linea RX, in modo che non galleggi?
Blalor,

@blalor la linea non galleggerà, il mittente la sta guidando (supponendo che entrambe le estremità siano collegate)
Toby Jaffey,

NewSoftSerial di Arduino abilita il pull-up interno dell'AVR sul pin RX. Presumo che ciò sia necessario se non è presente un mittente allegato. Grazie per le informazioni e il collegamento Adafruit aggiunto.
Blalor,

1
Essere un po 'pedanti, ma "TTL" non implica solo livelli? Descrivi un collegamento seriale punto a punto, ma potrebbe anche essere una topologia multi-master con driver open collector e un pullup (come LIN ma con livelli TTL)? "TTL seriale" sembra un termine incredibilmente ampio che è quasi inutile senza un certo contesto.
Nick T,

1
È solo l'interfaccia della porta seriale standard con i convertitori di tensione rimossi.
Starblue,

8

Non dici in così tante parole, ma il "minimo inattivo" suggerisce che intendi un UART. UART un punto-punto collegato a ricetrasmettitori di linea, come l'onnipresente ma datato MAX232 (al giorno d'oggi ci sono soluzioni molto migliori). Anche la linea tra microcontrollore e ricetrasmettitore sarà breve; se c'è una distanza da colmare sarà tra i ricetrasmettitori.
L'uscita del controller è un push-pull.

inserisci qui la descrizione dell'immagine

Il P-MOSFET fornirà l'alto livello, l'N-MOSFET il livello basso. Uno di questi deve essere attivo o il livello della linea fluttuerebbe e non sarebbe definito (o definito da un carico nel ricetrasmettitore). Entrambi sono in grado di erogare / assorbire un po 'di corrente e tireranno la linea verso le rotaie, quindi la forma del segnale sarà quasi ideale.
Sarebbe diverso se fosse davvero TTL, come nella tua domanda (il microcontrollore è HCMOS). Le uscite TTL sono altamente asimmetriche: possono fornire solo poca corrente, in genere 0,4 mA. La corrente di affondamento è OK, a 8 mA. La corrente di sorgente bassa può essere un problema se la linea ha un'alta capacità ed è ad alta velocità. La corrente di pilotaggio bassa significa che la capacità si caricherà solo relativamente lentamente e che i fronti di salita saranno lenti, il che ad alta velocità può causare gravi distorsioni del segnale. TTL non viene mai utilizzato per questo.

La tua domanda potrebbe anche riferirsi a una linea multidrop , in cui diversi dispositivi possono parlare. In tal caso non è possibile utilizzare l'uscita push-pull: se un dispositivo spinge la linea in alto mentre un altro la spinge in basso avremmo un corto circuito. Le linee multidrop usano quasi sempre resistenze pull-up per mantenere la linea inattiva. Quindi solo un livello basso richiede di guidare la linea e invece dell'uscita push-pull avremo uno scarico aperto, con solo l'N-MOSFET. Anche la linea ora è guidata in modo asimmetrico: la resistenza di pull-up può fornire solo poca corrente, mentre il FET pull-down può guidare la linea velocemente verso terra. Le linee multidrop ad alta velocità quindi limitano le resistenze di pull-up. Un esempio è I2C.


"l'onnipresente ma datato MAX232 (al giorno d'oggi ci sono soluzioni di gran lunga migliori)" Potresti fare qualche esempio?
m.,

3
@ m.Alin - Dice Maxim : "Molti progettisti di schede usano ancora oggi il MAX232, nonostante il fatto che i dispositivi a singola alimentazione abbiano subito notevoli miglioramenti nel corso degli anni". Elenco dei ricetrasmettitori
stevenvh,
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.