¿Cómo funciona la serie TTL?

15

He estado tratando de encontrar una buena descripción del "estándar" serial TTL sin mucha suerte. Entiendo que las líneas de transmisión en serie (TX) y de recepción (RX) están inactivas en alto (en VCC) y que caen a tierra cuando se transmite un bit. Como tal, están invertidos de la norma, donde un "1" es alto y "0" es bajo.

Lo que no entiendo es quién es responsable de mantener la línea alta y cómo se transmite un cero. ¿El emisor conduce la línea a alta y baja? ¿O el receptor mantiene la línea alta con el emisor bajando la línea (colector abierto)?

blalor
fuente
Lee la respuesta de Joby; aparentemente todo lo que creía saber estaba invertido. :-)
blalor
RS232 real es al revés 0 = 12v, 1 = -12v, por eso es confuso
Toby Jaffey
2
Punto de terminología: "serie TTL" es un término muy amplio, "serie asíncrona (punto a punto) (en niveles TTL)" parece ser lo que está preguntando. (Aunque probablemente todavía falte, pero al menos mejor)
Nick T
3
@Nick El tipo de OP que significa es lo que se alimenta a un MAX232, yo lo llamaría "RS232 en niveles TTL"
Toby Jaffey
2
@Joby: si usa solo Tx y Rx, y también eliminas sus niveles, ¡entonces ya no hay nada RS232! Llámalo UART.
stevenvh

Respuestas:

17

Con TTL serial, hay dos líneas de datos unidireccionales. Cada uno es impulsado por el remitente, tanto alto como bajo. Un 0 bit está representado por 0V a 1 bit por VCC.

El pin del receptor debe establecerse en una entrada.

Entonces, para que un microcontrolador envíe un byte (8-N-1 sin control de flujo) podría hacer algo como esto:

#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 se lee un poco hacia atrás, ya que originalmente estaba destinado a la serie TTL invertida)

Por supuesto, la mayoría de las MCU tienen UART de hardware que hacen todo esto por usted.

Esto es lo que verías en un alcance:

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

Aquí hay un gran video de ladyada que explica el serial: http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/

Toby Jaffey
fuente
Gracias Joby Entonces, aunque la línea esté inactiva en alto, un bit 0 sigue siendo 0v. ¿El receptor generalmente tiene un pull-up interno en la línea RX, para que no flote?
blalor
@blalor la línea no flota, el remitente la está conduciendo (suponiendo que ambos extremos estén conectados)
Toby Jaffey
NewSoftSerial de Arduino permite el pull-up interno del AVR en el pin RX. Supongo que esto es obligatorio si no hay un remitente adjunto. Gracias por la información y el enlace Adafruit agregado.
blalor
1
Siendo algo pedante, pero ¿"TTL" no solo implica niveles? Describe un enlace serie punto a punto, pero ¿podría ser una topología multimaestro con controladores de colector abierto y un pullup (como LIN pero con niveles TTL)? "Serie TTL" parece un término increíblemente amplio que es casi inútil sin algún contexto.
Nick T
1
Es solo la interfaz de puerto serie estándar con los convertidores de voltaje eliminados.
starblue
8

No dices en muchas palabras, pero el "alto inactivo" sugiere que te refieres a un UART. UART es un punto a punto conectado a transceptores de línea, como el MAX232 ubicuo pero anticuado (hoy en día hay soluciones mucho mejores). La línea entre el microcontrolador y el transceptor también será corta; Si hay una distancia que se va a puentear, será entre transceptores.
La salida del controlador es un push-pull.

ingrese la descripción de la imagen aquí

El P-MOSFET proporcionará el nivel alto, el N-MOSFET el nivel bajo. Uno de ellos debe estar activo o el nivel de línea flotará y no estará definido (o definido por una carga en el transceptor). Ambos pueden generar / hundir algo de corriente y tirarán de la línea hacia los rieles, por lo que la forma de la señal será casi ideal.
Lo que sería diferente si fuera realmente TTL, como en su pregunta (el microcontrolador es HCMOS). Las salidas TTL son altamente asimétricas: solo pueden suministrar poca corriente, típicamente 0.4mA. La corriente de hundimiento está bien, a 8 mA. La baja fuente de corriente puede ser un problema si la línea tiene una alta capacitancia y es de alta velocidad. La baja corriente de accionamiento significa que la capacitancia solo se cargará de manera relativamente lenta, y los bordes ascendentes serán lentos, lo que a alta velocidad puede causar una grave distorsión de la señal. TTL nunca se usa para esto.

Su pregunta también podría referirse a un línea multipunto , donde varios dispositivos pueden hablar. En ese caso, no puede utilizar la salida push-pull: si un dispositivo impulsara la línea hacia arriba mientras otro lo impulsa hacia abajo, tendríamos un cortocircuito. Las líneas multipunto casi siempre usan resistencias pull-up para mantener la línea inactiva en alto. Entonces, solo un nivel bajo requiere conducir la línea, y en lugar de la salida push-pull tendremos un drenaje abierto, con solo el N-MOSFET. La línea ahora también se conduce asimétricamente: la resistencia pull-up solo puede entregar poca corriente, mientras que el FET pull-down puede conducir la línea rápidamente a tierra. Las líneas multipunto de alta velocidad, por lo tanto, ponen un límite a las resistencias pull-up. Un ejemplo es I2C.

stevenvh
fuente
"el MAX232 ubicuo pero anticuado (hay soluciones mucho mejores hoy en día)" ¿Podría dar algunos ejemplos?
m.Alin
3
@ m.Alin - Dice Maxim : "Muchos diseñadores de placas todavía usan el MAX232 hoy, a pesar del hecho de que los dispositivos de un solo suministro han experimentado grandes mejoras a lo largo de los años". Lista de transceptores
stevenvh