Как работает серийный TTL?

15

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

Я не понимаю, кто отвечает за удержание линии высоко и как передается ноль. Отправитель управляет линией на высоком и низком уровне? Или получатель удерживает линию на высоком уровне, а отправитель тянет ее на низком уровне (открытый коллектор)?

blalor
источник
Прочитайте ответ Джоби; по-видимому, все, что я думал, я знал, было перевернуто. :-)
blalor
Реальный RS232 - это наоборот: 0 = 12 В, 1 = -12 В, поэтому это сбивает с толку
Тоби Джаффи
2
Точка терминологии: «Последовательный TTL» - это чрезмерно широкий термин «асинхронный последовательный (точка-точка) (на уровне TTL)», похоже, то, о чем вы спрашиваете. (Хотя этого все еще, вероятно, не хватает, но, по крайней мере, лучше)
Ник Т
3
@Nick Тип OP означает то, что подается в MAX232, я бы назвал это «RS232 на уровнях TTL»
Тоби Джаффей,
2
@ Joby - Если он использует только Tx и Rx, и вы также удаляете его уровни, то в этом больше нет ничего RS232! Назовите это UART.
Стивенвх

Ответы:

17

С последовательным TTL есть две однонаправленные линии передачи данных. Каждый управляется отправителем, как высоким, так и низким. Бит 0 представлен 0 В, а 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 линия не будет плавать, отправитель ведет ее (предполагая, что оба конца связаны)
Тоби Джаффей
Arduino NewSoftSerial позволяет внутреннему подтягиванию AVR на вывод RX. Я предполагаю , что это будет необходимо , если есть не прилагаются отправитель. Спасибо за информацию и добавленную ссылку Adafruit.
blalor
1
Будучи немного педантичным, но разве «TTL» не подразумевает уровни? Вы описываете двухточечную последовательную связь, но может ли она быть топологией с несколькими мастерами с драйверами с открытым коллектором и подтягиванием (как LIN, но с уровнями TTL)? «TTL serial» кажется невероятно широким термином, который почти бесполезен без некоторого контекста.
Ник Т
1
Это просто стандартный интерфейс последовательного порта со снятыми преобразователями напряжения.
StarBlue
8

Вы не говорите так много слов, но «холостой ход» предполагает, что вы имеете в виду UART. UART - это точка-точка, соединенная с линейными трансиверами, как вездесущий, но устаревший MAX232 (в настоящее время существуют гораздо лучшие решения). Линия между микроконтроллером и трансивером также будет короткой; если есть расстояние, которое будет преодолено, оно будет между трансиверами.
Выход контроллера двухтактный.

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

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

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

stevenvh
источник
«Вездесущий, но устаревший MAX232 (в настоящее время есть гораздо лучшие решения)» Не могли бы вы привести несколько примеров?
м.Алин
3
@ m.Alin - говорит Максим : «Многие разработчики плат до сих пор используют MAX232, несмотря на тот факт, что устройства с одним источником питания претерпели значительные улучшения за эти годы». Список трансиверов
stevenvh