Як працює серійний TTL?


15

Я без особливих шансів намагався знайти хороший опис серійного "стандарту" TTL. Я розумію, що лінії послідовної передачі (TX) і прийому (RX) простоюють високо (у VCC) і що вони падають на землю, коли передається біт. Таким чином, вони перевернуті від норми, де "1" є високим, а "0" - низьким.

Я не розумію, хто відповідальний за високу лінію та як передається нуль. Чи відправник відводить лінію до високих і низьких? Або одержувач тримає лінію високо, відправник тягне лінію низько (відкритий колектор)?


Прочитайте відповідь Джобі; мабуть, все, що я думав, що знав, було перевернуто. :-)
blalor

Справжній RS232 навпаки 0 = 12 В, 1 = -12 В, тому це заплутано
Тобі Джаффі

2
Точка термінології: "TTL serial" є сильно завищеним терміном, "(точка-до-точка) асинхронний серійний (на рівнях TTL)", здається, те, про що ви питаєте. (Хоча цього ще, мабуть, бракує, але принаймні краще)
Нік Т

3
@ Nick Такий, який означає OP, - це все, що подається в MAX232, я б назвав це "RS232 на рівнях TTL"
Toby Jaffey

2
@Joby - Якщо він використовує лише Tx і Rx, а ви також видаляєте його рівні, то RS232 вже нічого про це! Назвіть це UART.
stevenvh

Відповіді:


17

З TTL-серіалом існують дві однонаправлені лінії передачі даних. Кожен керує відправником, як високий, так і низький. 0 біт представлений 0 V a 1 біт VCC.

Штифт приймача повинен бути встановлений на вхід.

Отже, щоб мікроконтролер надсилав байт (8-N-1 без контролю потоку), він може зробити щось подібне:

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

(Цей код читається трохи назад, оскільки він спочатку був призначений для перевернутого TTL-серіалу)

Звичайно, більшість MCU мають апаратні UART, які роблять все це за вас.

Ось що ви побачите в області застосування:

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

Ось чудове відео із ladyada, що пояснює серійні дані: http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/


Спасибі, Джобі. Тож хоч лінія простоює високою, 0 біт все одно 0v. Чи одержувач зазвичай має внутрішню підтягування на лінії RX, щоб він не плавав?
blalor

@blalor лінія не буде плавати, відправник веде її (якщо припустити, що обидва кінці з'єднані)
Toby Jaffey

NewSoftSerial Arduino забезпечує внутрішнє підтягування AVR на штифті RX. Я припускаю , що це буде необхідно , якщо їсти не додаються відправник. Дякуємо за інформацію та додане посилання Adafruit.
blalor

1
Будучи дещо педантичним, але чи "TTL" не означає лише рівні? Ви описуєте послідовне посилання "точка-точка", але чи могло б це бути топологією з декількома майстрами з драйверами відкритого колектора та підключенням (як LIN, але з рівнями TTL)? "TTL-серіал" видається неймовірно широким терміном, який майже не потрібний без певного контексту.
Нік Т

1
Це просто стандартний інтерфейс послідовного порту із знятими перетворювачами напруги.
starblue

8

Ви не говорите так багато слів, але "високий час простою" говорить про те, що ви маєте на увазі UART. UART - це точка-точка, підключена до передавачів ліній, як повсюдний, але датований MAX232 (сьогодні є набагато кращі рішення). Лінія між мікроконтролером і приймачем також буде короткою; якщо є відстань, яку потрібно подолати, це буде між приймачами.
Вихід контролера - це push-pull.

введіть тут опис зображення

P-MOSFET забезпечить високий рівень, N-MOSFET низький рівень. Один з них повинен бути активним, або рівень лінії плавав би і був невизначений (або визначався навантаженням у приймачі). Обидва здатні джерело / потопити деякий струм і підтягнуть лінію до рейок, тому форма сигналу буде майже ідеальною.
Що було б інакше, якби це був насправді TTL, як у вашому питанні (мікроконтролером є HCMOS). Виходи TTL дуже асиметричні: вони можуть подавати лише невеликий струм, як правило, 0,4 мА. Струм занурення нормальний, 8 мА. Струм з низьким джерелом може бути проблемою, якщо лінія має високу ємність та високу швидкість. Низький струм приводу означає, що ємність буде заряджатися лише відносно повільно, а піднімаються кромки будуть повільними, що на високій швидкості може спричинити серйозні спотворення сигналу. TTL ніколи для цього не використовується.

Ваше запитання також може стосуватися багатопроменевої лінії , де можуть говорити кілька пристроїв. У такому випадку ви не можете використовувати вихідний поштовий висновок: якщо один пристрій буде запускати лінію високо, а інший занижує її, ми мали б коротке замикання. Багатолітні лінії майже завжди використовують підтягуючі резистори, щоб утримувати високий рівень холостого ходу. Тоді потрібен лише низький рівень руху лінії, і замість виштовхувального виходу у нас буде відкритий стік, лише N-MOSFET. Лінія тепер також ведеться несиметрично: підтягуючий резистор може подавати лише невеликий струм, тоді як висувний FET може швидко рухати лінію на землю. Тому високошвидкісні багатопроменеві лінії ставлять обмеження на піднімаючі резистори. Приклад - I2C.


"всюдисущий, але датований MAX232 (сьогодні набагато кращі рішення)" Чи можете ви навести кілька прикладів?
м.Алін

3
@ m.Alin - каже Максим : "Багато дизайнерів плати все ще використовують MAX232 сьогодні, незважаючи на те, що пристрої для одноразового харчування протягом багатьох років зазнали значних вдосконалень". Список трансиверів
stevenvh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.