Jak działa serial TTL?


15

Próbowałem znaleźć dobry opis seryjnego „standardu” TTL bez powodzenia. Rozumiem, że szeregowe linie nadawcze (TX) i odbiorcze (RX) są bezczynne wysoko (w VCC) i że opadają na ziemię, gdy bit jest transmitowany. Jako takie są odwrócone od normy, gdzie „1” jest wysokie, a „0” jest niskie.

Nie rozumiem, kto jest odpowiedzialny za utrzymywanie linii wysoko i jak transmitowane jest zero. Czy nadawca ustawia linię na wysoką i niską? Czy odbiorca utrzymuje linię wysoko, a nadawca ciągnie ją nisko (otwarty kolektor)?


Przeczytaj odpowiedź Joby'ego; najwyraźniej wszystko, co myślałem, że wiedziałem, było odwrócone. :-)
blalor

Real RS232 jest na odwrót 0 = 12v, 1 = -12v, dlatego jest mylące
Toby Jaffey,

2
Terminologia: „szereg szeregowy TTL” jest terminem poważnie przesadnie szerokim, wydaje się, że pytasz o „szereg asynchroniczny szeregowy (na poziomie TTL)”. (Chociaż nadal tego prawdopodobnie brakuje, ale przynajmniej lepiej)
Nick T

3
@Nick Rodzaj OP oznacza to, co zasila MAX232, nazwałbym to „RS232 na poziomach TTL”
Toby Jaffey,

2
@Joby - Jeśli używa tylko Tx i Rx, a ty również usuniesz jego poziomy, to nie ma już nic RS232! Nazwij to UART.
stevenvh

Odpowiedzi:


17

W przypadku szeregowego TTL istnieją dwie jednokierunkowe linie danych. Każdy jest sterowany przez nadawcę, zarówno wysoki, jak i niski. 0 bit jest reprezentowany przez 0 V, a 1 bit przez VCC.

Pin odbiornika powinien być ustawiony na wejście.

Tak więc, aby mikrokontroler wysłał bajt (8-N-1 bez kontroli przepływu), mógłby zrobić coś takiego:

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

(Ten kod odczytuje nieco wstecz, ponieważ pierwotnie był przeznaczony dla odwróconego szeregowego TTL)

Oczywiście większość MCU ma sprzętowe UART, które robią to wszystko za Ciebie.

Oto, co zobaczysz na lunecie:

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

Oto świetny film z ladyady wyjaśniającej serial: http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/


Dzięki, Joby. Więc nawet jeśli linia jest na biegu jałowym, bit 0 wciąż oznacza 0v. Czy odbiornik zazwyczaj ma wewnętrzne podciągnięcie na linii RX, aby się nie unosiło?
blalor

@blalor linia nie unosi się, nadawca ją prowadzi (zakładając, że oba końce są połączone)
Toby Jaffey,

NewSoftSerial Arduino umożliwia wewnętrzne podciągnięcie AVR na pin RX. Zakładam, że jest to wymagane, jeśli nie ma dołączonego nadawcy. Dzięki za informację i dodany link Adafruit.
blalor

1
Być trochę pedantyczny, ale czy „TTL” nie oznacza tylko poziomów? Opisujesz łącze szeregowe typu punkt-punkt, ale czy równie dobrze może to być topologia z wieloma wzorcami z otwartymi sterownikami kolektora i pullupem (jak LIN, ale z poziomami TTL)? „Serial TTL” wydaje się być niezwykle szerokim pojęciem, które jest prawie bezużyteczne bez kontekstu.
Nick T

1
To tylko standardowy interfejs portu szeregowego z usuniętymi przetwornicami napięcia.
starblue

8

Nie wypowiadasz tak wielu słów, ale „bezczynny haj” sugeruje, że masz na myśli UART. UART łączy punkt-punkt z nadajnikami-odbiornikami linii, jak wszechobecny, ale opatrzony datą MAX232 (obecnie są znacznie lepsze rozwiązania). Linia między mikrokontrolerem a urządzeniem nadawczo-odbiorczym również będzie krótka; jeśli będzie do pokonania odległość, będzie ona między odbiornikami.
Wyjście kontrolera jest push-pull.

wprowadź opis zdjęcia tutaj

P-MOSFET zapewni wysoki poziom, a N-MOSFET niski poziom. Jedna z nich musi być aktywna, inaczej poziom linii unosi się i będzie niezdefiniowany (lub zdefiniowany przez obciążenie transiwera). Oba są w stanie pobierać / pochłaniać trochę prądu i ciągną linię do szyn, więc kształt sygnału będzie prawie idealny.
Co byłoby inne, gdyby tak naprawdę było TTL, jak w twoim pytaniu (mikrokontrolerem jest HCMOS). Wyjścia TTL są wysoce asymetryczne: mogą dostarczać tylko niewielki prąd, zwykle 0,4 mA. Prąd tonący jest OK, przy 8 mA. Niski prąd źródłowy może stanowić problem, jeśli linia ma wysoką pojemność i dużą prędkość. Niski prąd napędowy oznacza, że ​​pojemność będzie ładować się stosunkowo wolno, a wznoszące się krawędzie będą wolne, co przy dużej prędkości może spowodować poważne zniekształcenie sygnału. TTL nigdy nie jest do tego wykorzystywany.

Twoje pytanie może również dotyczyć linii wielopunktowej , w której może rozmawiać kilka urządzeń. W takim przypadku nie można użyć wyjścia push-pull: jeśli jedno urządzenie doprowadziłoby linię wysoko, podczas gdy inne doprowadziło ją do niskiego poziomu, mielibyśmy zwarcie. Linie Multidrop prawie zawsze używają rezystorów podciągających, aby utrzymać linię na biegu jałowym na wysokim poziomie. Wtedy tylko niski poziom wymaga prowadzenia linii, a zamiast wyjścia push-pull będziemy mieli otwarty odpływ, tylko z N-MOSFET. Linia jest teraz również napędzana asymetrycznie: rezystor podwyższający może dostarczać tylko niewielki prąd, podczas gdy obniżający FET może szybko doprowadzić linię do uziemienia. Szybkie linie wielopunktowe ograniczają zatem rezystory podciągające. Przykładem jest I2C.


„wszechobecny, ale opatrzony datą MAX232 (obecnie istnieją znacznie lepsze rozwiązania)” Czy możesz podać jakieś przykłady?
m.Alin

3
@ m.Alin - mówi Maxim : „Wielu projektantów płyt nadal korzysta z MAX232 dzisiaj, pomimo faktu, że urządzenia z pojedynczym zasilaniem przeszły przez lata znaczną poprawę”. Lista nadajników
stevenvh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.