UART или последовательные интерфейсы

За последние 50 лет было придумано множество разновидностей последовательных интерфейсов: SPI, I2C, I2S, RS-232, USB, Firewire, -- мы поговорим о том, что такое UART в целом. 

Но для начала надо разобраться в чем разница между последовательными и параллельными интерфейсами. Слово "последовательный" означает, что данные передаются по одному проводу последовательно, бит за битом. А "параллельный" означает, что между устройствами есть шина из нескольких проводов, по которым части сообщения передаются одновременно. 

Схема передачи по UART

SyamilAshri at English Wikibooks [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], from Wikimedia Commons

Преимущества параллельной передачи данных в том, что за один шаг передаётся сразу группа битов. К тому внутри процессора используются параллельная передача, поэтому данные сразу, можно сказать, передаются и принимаются в удобной форме. Но есть и недостатки. Главный заключается в том, что биты по проводам могут приходить не одновременно и требуются дополнительные ухищрения для получения неискаженных сообщений. Это сильно ограничивает максимальную скорость передачи. (прим. Тут ничего удивительного. В силу физических причин биты по разных проводам не могут приходить со 100% одновременностью.)

При последовательном способе передачи передаваемые биты должны быть преобразованы в параллельную форму и наоборот (в силу того, что внутри процессора быит передаются параллельно). Это преобразование требует времени. Но зато мы получаем огромное преимущество в виде отсутствия необходимости синхронизировать поступление битов по каждому проводу, что также расширяется скоростные возможности линии передачи.

UART 

Universal Asynchronous Receiver/Transmitter или просто UART используется с ранних 1960-х и с тех пор претерпевал постоянные изменения. Несмотря на то, что постоянно производятся попытки уничтожить UART, последовательные протоколы этого типа всё ещё представляют важный способ общения между устройствами встраиваемых систем.

UART представляет собой периферийное устройство в процессоре, с помощью которого осуществляется общение между устройствами по последовательному протоколу на небольшие расстояния. Кстати, UART является основой стандарта RS-232 (тот самый D-образный разъем с 9-ю пинами). В языке "С" вывод printf часто может передаваться напрямую через UART. Вообще порты работающие по UART чаще всего называются просто последовательными портами. В самой простой форме UART представляет собой три провода: земля, передача, приём. 

Схема передачи по UART

Первая проблема UART в том, что нет возможности определить какое устройство ведущее, а какое ведомое (master/slave), так что непонятно к чему цеплять transmit? Обычно, это определяют за нас. Например, кто-то, кто проектирует печатную плату может назвать этот провод как TX и определить, что устройство должно соединяться так, тогда система будет выглядеть следующим образом:

Схема передачи по UART

В итоге получается вариант, когда процессор и принимает, и передаёт данные. Другой способ конфигурации выглядит вот так:

Схема передачи по UART

Тогда получается вариант, где процессор всегда передаёт (TX) получателю (RX) и наоборот. Какой вариант правильный? Оказывается это решение принимает за нас производитель чипа и готовой платы/устройства. Я видел множество примеров использования обоих вариантов настолько часто, что без прочтения даташита невозможно было определить как именно следует производить конфигурацию устройств. Если бы я имел контроль над наименованием, то закрепил второй вариант, когда TX соединено с RX. На практике чаще всего TX, подсоединённый к TX, приводит к сгоранию чипов (тоже верно и для RX-RX), так что это хороший пример того, что надо читать документацию перед тем как соединять чипы по UART, так как существует несколько способов соединения.

Когда отправитель и получатель располагаются на одной плате, тогда уровень напряжения сигнала при передаче соответствует уровню напряжения питания процессора. К примеру, "1" будет передаваться с напряжением 3.3В, а "0", грубо говоря, с 0В. Это неочень полезно тогда, когда требуется передать сигнал более, чем на несколько дюймов (1 дюйм = 2.54 см), так как начинают появляться искажения сигнала и увеличивается падение напряжения. В итоге, чем дальше расстояние, тем количество ошибок передачи растет и в итоге становится невозможно передать сообщение, так как оно поступает до невозможности искаженным.

Схема передачи по UART

Для того, чтобы избежать подобной ситуации добавляют дополнительные чипы-буферы, усиливающие сигналы. После этого сигналы могут передаваться уже на метры без существенной потери информации. Однако, напряжения при передаче битов довольно странные: для передачи 1 используются -3В..-15В, а для передачи 0 -- от +3В до +15В. Это те самые напряжения, которые используются в RS-232. Кстати, буферы в RS-232 также являются ограничителями тока, так что контакты разъёма можно замыкать между собой и он не выгорит. 

Начало и конец передачи данных

Осциллограмма передачи данных по UART 

By Rs232_oscilloscope_trace.jpg: Ktnbn derivative work: Samuel Tardieu (Rs232_oscilloscope_trace.jpg) [CC SA 1.0 (http://creativecommons.org/licenses/sa/1.0/)], via Wikimedia Common

UART -- это последовательный интерфейс (он посылает и принимает биты последовательно: бит за битом), но при этом он не передаёт информацию для синхронизации. Отправитель и получатель не синхронизированы. Таким образом взаимодействие отправителя и получателя является асинхронным. Вместо информации о синхронизации в UART используется "стартовый бит" для сигнализации о том, что мы собираемся передать сообщение. После передачи стартового бита передаётся сообщение, а затем передаётся "стоп-бит", указывающий о завершении процесса передачи сообщения. Суммарно получается 10 бит: 1 старт-бит, 8 бит данных, 1 стоп-бит.

Биты передаются с заранее установленной скоростью передачи, которая измеряется в битах в секунду или, иначе, в бодах. Так что 9600 бод эквивалентно 9600 бит/сек. А так как у нас передаётся 10 бит за одно сообщение (старт-бит, данные, стоп-бит), это это значит, что мы можем передать 960 сообщений в секунду.

Так как значение скорости передачи не передаётся вместе с сообщением, то и приёмник и получатель должны заранее установить одинаковое значение скорости передачи/приёма. Конечно, скорости на обеих системах не будут совпадать со 100% точностью (опять же в силу чисто технических причин, так как таймеры на разных системах имеют погрешности), но UART допускает до 5% рассинхронизации таймеров. В этих пределах мы будем получать и принимать верные сообщения. 

USARTS

 Схема подключения USARTS

USART -- это модификация UART. Расшифровывается как Universal Synchronous/Asynchronous Receiver/Transmitter. При этом добавляется дополнительных три провода: CLOCK, CLEAR TO SEND (CTS), READY TO SEND (RTS).

С помощью такой добавки устраняется необходимость иметь на обоих устройствах точные часы (с рассинхроном не более 5%), а также необходимость и приемнику, и передатчику устанавливать одну и ту же скорость передачи данных. В USART сигнал от CLOCK используется для синхронизации двух устройств. Передающая сторона выдаёт прямоугольные импульсы с частотой, соответствующей скорости передачи данных. А принимающая использует эти импульсы, чтобы правильно принять данные.

Clock-сигнал был довольно обычен несколько десятков лет назад, когда связь осуществлялась с помощью модемов. Этого сигнала, кстати, не было в 9-пиновом разъёме RS-232, которые появились на IBM PC в 1984г.

USART также поддерживает ещё два контрольных сигнала: CTS, RTS. Они используются для контроля передачи данных. Например, у получателя может заполниться буфер, в который поступали данные, тогда он выставляет RTS, сообщая, что надо приостановить передачу и подождать пока появится место в буфере. 

RTS и CTS соединяются крест-накрест: RTS-CTS, CTS-RTS (показано на схеме выше). Таким образом, производится как бы "обмен рукопожатиями": когда включен RTS получателя, выключается CTS отправителя и наоборот. 

Следует использовать USART вместо UART, так как это позволяет проводить обмен рукопожатиями и синхронизировать передачу. В коде это будет означать постоянную проверку CTS значений, либо генерацию прерывания CTS-пином.

Кстати, для обратной совместимости USART может быть использован как простой UART с использованием только трёх проводников: RX, TX, Земля. 

Где используются UART и USART?

Оба протокола используются в GPS модулях, flash-загрузчик в процессорах ATMEL, старой компьютерной периферии, а также в разнообразном промышленном оборудовании. В общем он все еще очень широко использхуется для обмена информацией между устройствами.

GPS модули поддерживают стандарт NMEA 0183, в котором определена поддержка модулями UART. Конечно, на подходе новый стандарт NMEA 2000, в котором будет использоваться протокол CAN, но пока ещё превалирует использование UART.

Несмотря на то, что ещё можно найти компьютеры с портами RS-232, эти порты уже не найти на ноутбуках и других малогабаритных устройствах. Для обмена информацией с промышленным оборудованием и, к примеру, процессорами ATMEL и устройствами на их основе, как например популярная ARDUINO, часто используются чипы для преобразования последовательного протокола в USB. Благодаря этому UART еще будет жив какое-то время. 

Это перевод. Автор оригинальной статьи -- . Кстати, у них очень интересный блог. Рекомендую.

Большой радиолюбитель и конструктор программ

Благодаря достижениям электроники у нас есть компьютеры, планшеты, смартфоны и другая популярная техника. Я создал этот сайт для популяризации радиолюбительства. Подписывайтесь на блог, рассылку и группу в ВК: vk.com/mp16a!

Меню