Универсальный асинхронный приёмопередатчик ( UART / ˈjuː ɑːr t / ) — это периферийное устройство для асинхронной последовательной связи , в котором формат данных и скорости передачи настраиваются. Он отправляет биты данных один за другим, от наименее значимого к наиболее значимому, обрамлённые стартовыми и стоповыми битами, так что точная синхронизация обрабатывается каналом связи. Уровни электрических сигналов обрабатываются схемой драйвера, внешней по отношению к UART. Распространенными уровнями сигналов являются RS-232 , RS-485 и необработанный TTL [1] для коротких отладочных связей. Ранние телетайпы использовали токовые петли .
Это было одно из самых ранних устройств компьютерной связи, использовавшееся для присоединения телетайпов к пульту оператора . Это была также ранняя аппаратная система для Интернета .
UART обычно представляет собой отдельную (или часть) интегральную схему (ИС), используемую для последовательной связи через последовательный порт компьютера или периферийного устройства . Одно или несколько периферийных устройств UART обычно интегрируются в микросхемы микроконтроллера . Специализированные UART используются для автомобилей , смарт-карт и SIM-карт .
Связанное с этим устройство — универсальный синхронный и асинхронный приёмопередатчик (USART) — также поддерживает синхронную работу.
В терминах уровня OSI UART находится на уровне 2, уровне канала передачи данных .
UART содержит следующие компоненты:
Универсальный асинхронный приемник-передатчик (UART) принимает байты данных и передает отдельные биты последовательно. [2] В пункте назначения второй UART собирает биты в полные байты. Каждый UART содержит сдвиговый регистр , который является фундаментальным методом преобразования между последовательной и параллельной формами. Последовательная передача цифровой информации (битов) по одному проводу или другой среде менее затратна, чем параллельная передача по нескольким проводам.
UART обычно не генерирует и не принимает напрямую внешние сигналы, используемые между различными элементами оборудования. Отдельные интерфейсные устройства используются для преобразования сигналов логического уровня UART в внешние уровни сигнализации и обратно, которые могут быть стандартизированными уровнями напряжения, уровнями тока или другими сигналами.
Коммуникация может осуществляться тремя способами:
Для работы UART следующие настройки должны быть одинаковыми как на передающей, так и на принимающей стороне:
Что касается уровня напряжения, 2 модуля UART работают хорошо, когда у них обоих одинаковый уровень напряжения, например, 3 В-3 В между 2 модулями UART. Чтобы использовать 2 модуля UART на разных уровнях напряжения, необходимо добавить внешнюю схему переключения уровня. [3]
Кадр UART состоит из 5 элементов:
В наиболее распространенных настройках 8 бит данных, без четности и 1 стоповый бит (т. е. 8N1 ), эффективность протокола составляет 80%. Для сравнения, эффективность протокола Ethernet при использовании кадров максимальной пропускной способности с полезной нагрузкой 1500 байт составляет до 95% и до 99% с 9000-байтовыми кадрами jumbo . Однако из-за накладных расходов протокола Ethernet и минимального размера полезной нагрузки 42 байта, если необходимо отправить небольшие сообщения из одного или нескольких байтов, эффективность протокола Ethernet падает намного ниже постоянной эффективности 8N1 UART, составляющей 80%.
Состояние ожидания, отсутствие данных — это высокое напряжение, или питание. Это историческое наследие телеграфии, в которой линия удерживается на высоком уровне, чтобы показать, что линия и передатчик не повреждены.
Каждый символ представлен в виде логического низкого стартового бита, битов данных, возможно, бита четности и одного или нескольких стоповых битов. В большинстве приложений наименее значимый бит данных (тот, что слева на этой диаграмме) передается первым, но есть исключения (например, печатный терминал IBM 2741 ).
Стартовый бит сигнализирует приемнику о поступлении нового символа.
Следующие пять-девять бит, в зависимости от используемого кодового набора, представляют символ.
Если используется бит четности, он будет помещен после всех битов данных.
Бит четности — это способ, с помощью которого принимающий UART может определить, изменились ли какие-либо данные во время передачи.
Следующие один или два бита всегда находятся в состоянии отметки (логический высокий уровень, т. е. '1') и называются стоповыми битами. Они сигнализируют приемнику о том, что символ завершен. Поскольку стартовый бит имеет логический низкий уровень (0), а стоповый бит имеет логический высокий уровень (1), всегда существует по крайней мере два гарантированных изменения сигнала между символами.
Если линия удерживается в состоянии низкого логического уровня дольше времени символа, это состояние разрыва, которое может быть обнаружено UART.
Все операции оборудования UART контролируются внутренним тактовым сигналом, который работает с кратностью скорости передачи данных, обычно в 8 или 16 раз больше скорости передачи битов. Приемник проверяет состояние входящего сигнала на каждом тактовом импульсе, ища начало стартового бита. Если кажущийся стартовый бит длится не менее половины времени бита, он действителен и сигнализирует о начале нового символа. Если нет, он считается ложным импульсом и игнорируется. После ожидания еще одного времени бита состояние линии снова выбирается, и результирующий уровень тактируется в сдвиговом регистре. После того, как требуемое количество битовых периодов для длины символа (обычно от 5 до 8 бит) истекло, содержимое сдвигового регистра становится доступным (параллельным образом) для принимающей системы. UART установит флаг, указывающий на доступность новых данных, и может также сгенерировать прерывание процессора , чтобы запросить, чтобы хост-процессор передал полученные данные.
У UART, взаимодействующих друг с другом, нет общей системы синхронизации, кроме сигнала связи. Обычно UART повторно синхронизируют свои внутренние часы при каждом изменении линии данных, которое не считается ложным импульсом. Получая таким образом информацию о синхронизации, они надежно получают, когда передатчик посылает данные с немного иной скоростью, чем следовало бы. Упрощенные UART этого не делают; вместо этого они повторно синхронизируются только на заднем фронте стартового бита, а затем считывают центр каждого ожидаемого бита данных, и эта система работает, если скорость передачи данных достаточно точна, чтобы обеспечить надежную выборку стоповых битов. [4] [5]
Стандартной функцией UART является сохранение последнего символа при получении следующего. Эта «двойная буферизация» дает принимающему компьютеру время передачи всего символа для извлечения полученного символа. Многие UART имеют небольшую буферную память типа «первым пришел, первым вышел» ( FIFO ) между регистром сдвига приемника и интерфейсом хост-системы. Это дает хост-процессору еще больше времени для обработки прерывания от UART и предотвращает потерю полученных данных на высоких скоростях.
Операция передачи проще, поскольку синхронизация не должна определяться из состояния линии и не привязана к каким-либо фиксированным интервалам синхронизации. Как только отправляющая система помещает символ в сдвиговый регистр (после завершения предыдущего символа), UART генерирует стартовый бит, сдвигает требуемое количество бит данных в линию, генерирует и отправляет бит четности (если используется) и отправляет стоповые биты. Поскольку полнодуплексная работа требует, чтобы символы отправлялись и принимались одновременно, UART используют два разных сдвиговых регистра для передаваемых и принимаемых символов. Высокопроизводительные UART могут содержать буфер передачи FIFO (первым пришел — первым вышел), чтобы позволить ЦП или контроллеру DMA помещать несколько символов в пакет в FIFO, а не помещать по одному символу за раз в сдвиговый регистр. Поскольку передача одного или нескольких символов может занять много времени относительно скорости ЦП, UART поддерживает флаг, показывающий статус занятости, чтобы хост-система знала, есть ли хотя бы один символ в буфере передачи или сдвиговом регистре; «готов к приему следующего символа(ов)» также может быть передано с помощью прерывания.
Передающий и принимающий UART должны быть настроены на одинаковую скорость передачи битов, длину символа, четность и стоповые биты для правильной работы. Принимающий UART может обнаружить некоторые несоответствующие настройки и установить флаговый бит «ошибка кадрирования» для хост-системы; в исключительных случаях принимающий UART будет создавать беспорядочный поток искаженных символов и передавать их хост-системе.
Типичные последовательные порты, используемые с персональными компьютерами, подключенными к модемам, используют восемь бит данных, без контроля четности и один стоповый бит; для этой конфигурации количество символов ASCII в секунду равно скорости передачи данных, деленной на 10.
Некоторые очень недорогие домашние компьютеры или встроенные системы , в которых отсутствует физический UART, могут вместо этого эмулировать протокол с помощью программного обеспечения, производя выборку состояния входного порта или напрямую манипулируя выходным портом для передачи данных. Несмотря на то, что он очень интенсивно использует ресурсы процессора (поскольку синхронизация процессора имеет решающее значение), чип UART можно исключить, что позволит сэкономить деньги и место. Этот метод известен как bit-banging .
Некоторые ранние телеграфные схемы использовали импульсы переменной длины (как в азбуке Морзе ) и вращающиеся часовые механизмы для передачи буквенных символов. Первыми последовательными коммуникационными устройствами (с импульсами фиксированной длины) были вращающиеся механические переключатели ( коммутаторы ). Различные коды символов, использующие 5, 6, 7 или 8 бит данных, стали обычным явлением в телетайпах и позднее в качестве периферийных устройств компьютеров. Телетайп стал отличным универсальным устройством ввода-вывода для небольшого компьютера.
Гордон Белл из DEC разработал первый UART, занимающий целую печатную плату, называемую линейным блоком , для серии компьютеров PDP, начиная с PDP-1 . [6] [7] По словам Белла, основным новшеством UART было использование выборки для преобразования сигнала в цифровую область, что обеспечивало более надежную синхронизацию, чем предыдущие схемы, которые использовали аналоговые устройства синхронизации с вручную регулируемыми потенциометрами . [8] Чтобы снизить стоимость проводки, объединительной платы и других компонентов, эти компьютеры также впервые использовали управление потоком с использованием символов XON и XOFF вместо аппаратных проводов.
DEC сжала конструкцию линейного блока до раннего однокристального UART для собственного использования. [6] Western Digital разработала его в первый широкодоступный однокристальный UART, WD1402A, около 1971 года. Это был ранний пример среднемасштабной интегральной схемы . Другой популярной микросхемой была SCN2651 из семейства Signetics 2650 .
Примером UART начала 1980-х годов был National Semiconductor 8250, использовавшийся в оригинальной плате адаптера асинхронной связи IBM PC . [9] В 1990-х годах были разработаны новые UART с буферами на кристалле. Это позволило увеличить скорость передачи данных без потери данных и не требовало столь частого внимания со стороны компьютера. Например, популярный National Semiconductor 16550 имеет 16-байтовый FIFO и породил множество вариантов, включая 16C550, 16C650, 16C750 и 16C850 .
В зависимости от производителя, для обозначения устройств, выполняющих функции UART, используются разные термины. Intel назвала свое устройство 8251 «Программируемым интерфейсом связи». MOS Technology 6551 была известна под названием «Адаптер интерфейса асинхронной связи» (ACIA). Термин «Интерфейс последовательной связи» (SCI) был впервые использован в Motorola около 1975 года для обозначения их старт-стопного асинхронного последовательного интерфейсного устройства, которое другие называли UART. Zilog выпустила ряд контроллеров последовательной связи или SCC.
Начиная с 2000-х годов большинство IBM PC-совместимых компьютеров удалили свои внешние RS-232 COM-порты и использовали USB -порты, которые могут отправлять данные быстрее. Для пользователей, которым по-прежнему нужны последовательные порты RS-232, теперь обычно используются внешние мосты USB-UART . Они объединяют аппаратные кабели и чип для преобразования USB и UART. Cypress Semiconductor и FTDI являются двумя из основных коммерческих поставщиков этих чипов. [10] Хотя порты RS-232 больше не доступны пользователям снаружи большинства компьютеров, многие внутренние процессоры имеют UART, встроенные в свои чипы, чтобы дать разработчикам оборудования возможность взаимодействовать с другими чипами или устройствами, которые используют RS-232 или RS-485 для связи.
Ошибка переполнения возникает, когда приемник не может обработать только что поступивший символ до поступления следующего. Различные устройства имеют разный объем буферного пространства для хранения полученных символов. ЦП или контроллер DMA должны обслуживать UART, чтобы удалить символы из входного буфера. Если ЦП или контроллер DMA не обслуживает UART достаточно быстро и буфер заполняется, возникает ошибка переполнения, и входящие символы будут потеряны.
Ошибка недогрузки возникает, когда передатчик UART завершил отправку символа, а буфер передачи пуст. В асинхронных режимах это рассматривается как указание на то, что не осталось данных для передачи, а не как ошибка, поскольку могут быть добавлены дополнительные стоповые биты. Эта индикация ошибки обычно встречается в USART, поскольку недогрузка более серьезна в синхронных системах.
UART обнаружит ошибку кадрирования , когда не увидит «стоповый» бит в ожидаемое время «стопового» бита. Поскольку «стартовый» бит используется для идентификации начала входящего символа, его синхронизация является эталоном для оставшихся битов. Если линия данных не находится в ожидаемом состоянии (высоком), когда ожидается «стоповый» бит (в соответствии с количеством битов данных и четности, для которых установлен UART), UART сообщит об ошибке кадрирования. Состояние «разрыва» на линии также сигнализируется как ошибка кадрирования.
Ошибка четности возникает, когда четность числа единичных битов не совпадает с четностью, заданной битом четности. Проверка четности часто используется для обнаружения ошибок передачи. Использование бита четности необязательно, поэтому эта ошибка возникнет только в том случае, если включена проверка четности.
Состояние прерывания возникает, когда вход приемника находится на уровне "пробел" (логический низкий, т.е. '0') дольше некоторого периода времени, как правило, дольше, чем время символа. Это не обязательно ошибка, но воспринимается приемником как символ из всех нулевых битов с ошибкой кадрирования.
Термин «перерыв» происходит от сигнализации токовой петли , которая была традиционной сигнализацией, используемой для телетайпов . Состояние «разрыва» линии токовой петли обозначается отсутствием тока, а очень длительный период отсутствия тока часто вызывается разрывом или другой неисправностью в линии. Некоторое оборудование намеренно передает уровень «пробел» дольше, чем символ, в качестве сигнала внимания. Когда скорости передачи сигналов не совпадают, никакие значимые символы не могут быть отправлены, но длинный сигнал «перерыв» может быть полезным способом привлечь внимание несовпадающего приемника, чтобы сделать что-то (например, сбросить себя). Компьютерные системы могут использовать длинный уровень «перерыва» в качестве запроса на изменение скорости передачи сигналов, чтобы поддерживать коммутируемый доступ на нескольких скоростях передачи сигналов. Протокол DMX512 использует состояние разрыва для сигнализации о начале нового пакета.
Двойной UART, или DUART , объединяет два UART в один чип. Аналогично, четверной UART или QUART , объединяет четыре UART в один пакет, например, NXP 28L194. Восьмеричный UART или OCTART объединяет восемь UART в один пакет, например, Exar XR16L788 или NXP SCC2698.
Модемы для персональных компьютеров, подключаемые к слоту материнской платы, также должны включать функцию UART на карте. Оригинальный чип 8250 UART, поставляемый с персональным компьютером IBM, имел буфер размером в один символ для приемника и передатчика, что означало, что программное обеспечение связи плохо работало на скоростях выше 9600 бит/с, особенно при работе в многозадачной системе или при обработке прерываний от контроллеров дисков. Высокоскоростные модемы использовали UART, которые были совместимы с оригинальным чипом, но включали дополнительные буферы FIFO, что давало программному обеспечению дополнительное время для ответа на входящие данные.
Взгляд на требования к производительности при высоких скоростях передачи данных показывает, почему 16-, 32-, 64- или 128-байтовый FIFO является необходимостью. Спецификация Microsoft для системы DOS требует, чтобы прерывания не отключались более чем на 1 миллисекунду за раз. [ необходима цитата ] [ сомнительно – обсудить ] Некоторые жесткие диски и видеоконтроллеры нарушают эту спецификацию. 9600 бит/с будут доставлять символ примерно каждую миллисекунду, поэтому 1-байтовый FIFO должен быть достаточным при этой скорости в системе DOS, которая соответствует максимальному времени отключения прерываний. Скорости выше этого могут принимать новый символ до того, как будет извлечен старый, и, таким образом, старый символ будет потерян. Это называется ошибкой переполнения и приводит к потере одного или нескольких символов.
16-байтовый FIFO позволяет получить до 16 символов, прежде чем компьютер должен будет обработать прерывание. Это увеличивает максимальную скорость передачи данных, которую компьютер может надежно обработать, с 9600 до 153 000 бит/с, если у него есть время простоя прерывания в 1 миллисекунду. 32-байтовый FIFO увеличивает максимальную скорость до более чем 300 000 бит/с. Второе преимущество наличия FIFO заключается в том, что компьютер должен обслуживать только около 8–12% от количества прерываний, что дает больше процессорного времени для обновления экрана или выполнения других задач. Таким образом, ответы компьютера также улучшатся.
Поскольку протокол связи UART прост, его можно эмулировать путем побитового переключения контактов GPIO в программном обеспечении современных микроконтроллеров (например, Arduino [18] или Teensy [19] ) или программируемых конечных автоматов ввода-вывода (например, PIO Raspberry Pi Pico [20] [21] или FlexIO NXP [ 22] ).