TTL seri nasıl çalışır?


15

Ben çok şans olmadan TTL seri "standart" iyi bir açıklama bulmaya çalışıyorum. Seri iletim (TX) ve alma (RX) hatlarının yüksek (boşta VCC) boşta olduğunu ve biraz iletildiğinde toprağa düştüğünü anlıyorum. Bu nedenle, "1" in yüksek ve "0" ın düşük olduğu normdan ters çevrilirler.

Anlamadığım şey, kimin çizgiyi yüksek tutmaktan ve sıfırın nasıl iletildiğinden sorumlu. Gönderen hattı yüksek ve alçak seviyeye mi çekiyor? Veya alıcı hattı aşağı çekerek (açık kollektör) hattı yüksek tutuyor mu?


Joby'nin cevabını okuyun; görünüşe göre bildiğimi düşündüğüm her şey tersine çevrildi. :-)
blalor

Gerçek RS232, 0 = 12v, 1 = -12v civarında başka bir yoldur, bu yüzden kafa karıştırıcı
Toby Jaffey

2
Terminoloji noktası: "TTL seri" aşırı geniş bir terimdir, "(noktadan noktaya) eşzamansız seri (TTL seviyelerinde)" sizin istediğiniz gibi görünüyor. (Yine de muhtemelen eksik, ama en azından daha iyi olsa da)
Nick T

3
@Nick OP anlamına gelen bir MAX232 içine beslenen ne ise, ben buna "TTL seviyelerinde RS232" derdim
Toby Jaffey

2
@Joby - Sadece Tx ve Rx kullanıyorsa ve seviyelerini de kaldırırsanız, RS232 hakkında artık bir şey yok! Buna UART deyin.
stevenvh

Yanıtlar:


17

TTL seri ile iki tek yönlü veri hattı vardır. Her biri, hem yüksek hem de düşük gönderen tarafından yönlendirilir. 0 bit, 0V ile 1 bit VCC ile temsil edilir.

Alıcının pini bir girişe ayarlanmalıdır.

Yani, bir mikrodenetleyicinin bir bayt (8-N-1 akış kontrolü yok) göndermesi için böyle bir şey yapabilir:

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

(Bu kod, başlangıçta tersine çevrilmiş TTL serisi için tasarlandığından biraz geriye doğru okur)

Tabii ki, çoğu MCU'da tüm bunları sizin için yapan donanım UART'ları vardır.

Bir kapsamda görebilecekleriniz:

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

Ladyada'dan seriyi anlatan harika bir video: http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/


Teşekkürler Joby. Bu nedenle, hat yüksek rölantide olmasına rağmen, 0 bit hala 0v'dir. Alıcının genellikle RX hattında dahili bir yukarı çekmesi var mı, böylece yüzmüyor mu?
blalor

@blalor hattı yüzmeyecek, gönderen onu sürüyor (her iki ucun da bağlı olduğu varsayılarak)
Toby Jaffey

Arduino'nun NewSoftSerial, AVR'nin RX pininde dahili olarak çekilmesini sağlar. Bu varsayalım olan ekli gönderen yoksa gerekli. Bilgi ve eklenen Adafruit bağlantısı için teşekkürler.
blalor

1
Biraz bilgiç olmak, ama "TTL" sadece seviyeleri ima etmiyor mu? Noktadan noktaya seri bir bağlantıyı tanımlarsınız, ancak açık kollektör sürücüleri ve bir çekme (LIN gibi, ancak TTL seviyeleri ile) ile çok masterlı bir topoloji de olabilir mi? "TTL dizisi" inanılmaz derecede geniş bir terim gibi gözüküyor .
Nick T

1
Gerilim dönüştürücülerinin çıkarıldığı standart seri port arabirimidir.
starblue

8

Çok fazla kelime söylemezsiniz, ancak "boşta yüksek" bir UART anlamına geldiğinizi gösterir. UART'lar , her yerde bulunan ancak MAX232 tarihli gibi hat alıcı-vericilere bağlı bir noktadan noktaya (günümüzde çok daha iyi çözümler var). Mikrodenetleyici ve alıcı-verici arasındaki çizgi de kısa olacaktır; köprülenecek mesafe varsa telsizler arasında olacaktır.
Denetleyicinin çıkışı bir itme kuvvetidir.

resim açıklamasını buraya girin

P-MOSFET yüksek seviyeyi, N-MOSFET düşük seviyeyi sağlayacaktır. Bunlardan biri aktif olmalı veya hat seviyesi yüzmeli ve tanımsız olmalıdır (veya alıcı-vericideki bir yük tarafından tanımlanmalıdır). Her ikisi de bir miktar kaynak yapabilir / batabilir ve hattı raylara çeker, böylece sinyal şekli neredeyse ideal olacaktır.
Sorunuzda olduğu gibi gerçekten TTL olsaydı bu farklı olurdu (mikrodenetleyici HCMOS'dur). TTL çıkışları son derece asimetriktir: sadece 0,4 mA gibi az akım sağlayabilirler. Batan akım 8mA'de iyi. Hat yüksek kapasitansa ve yüksek hıza sahipse düşük kaynak akımı bir sorun olabilir. Düşük sürücü akımı, kapasitansın sadece nispeten yavaş şarj edileceği ve yükselen kenarların yavaş olacağı anlamına gelir, bu da yüksek hızda ciddi sinyal bozulmasına neden olabilir. TTL bunun için asla kullanılmaz.

Sorunuz ayrıca , birkaç cihazın konuşabileceği çok noktalı bir hatta da başvurabilir . Bu durumda itme-çekme çıkışını kullanamazsınız: bir cihaz hattı yüksek, diğeri ise düşük sürerse kısa devre yapardık. Multidrop hatları neredeyse her zaman hattı rölantide tutmak için çekme dirençleri kullanır. O zaman sadece düşük bir seviye hattın sürmesini gerektirir ve itme-çekme çıkışı yerine sadece N-MOSFET ile bir açık tahliyeye sahip oluruz. Hat şimdi asimetrik olarak da sürülüyor: yukarı çekme direnci sadece çok az akım iletirken, aşağı açılan FET hattı hızlı bir şekilde yere çekebilir. Bu nedenle, yüksek hızlı çok noktalı hatlar, çekme dirençlerine bir sınır koyar. Bir örnek I2C'dir.


"her yerde bulunan ancak MAX232 tarihli (günümüzde çok daha iyi çözümler var)" Bazı örnekler verebilir misiniz?
m.Alin

3
@ m.Alin - Maxim diyor ki : "Tek kartlı cihazların yıllar içinde kapsamlı iyileştirmeler yapmasına rağmen, günümüzde hala birçok kurulu tasarımcısı MAX232'yi kullanıyor." Alıcı-vericiler listesi
stevenvh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.