Введение
Компьютерное аппаратное устройство
Универсальный асинхронный приёмник-передатчик (UART /juːɑːrt/) – это периферийное устройство для асинхронной последовательной связи, в котором формат данных и скорость передачи конфигурируемы. Он отправляет биты данных последовательно, от младшего к старшему, обрамлённые стартовыми и стоповыми битами, чтобы точная синхронизация обеспечивалась каналом связи. Электрические уровни сигналов обрабатываются драйвером, расположенным вне UART. Распространённые уровни сигналов – RS 232, RS 485 и прямой TTL для коротких отладочных соединений. Ранние телетайпы использовали токовые петли. Это было одно из первых устройств компьютерной связи, использовавшееся для подключения телетайпов в качестве консоли оператора. Оно также являлось ранней аппаратной системой для Интернета. UART обычно представляет собой отдельную (или часть) интегральную схему (ИС), используемую для последовательной связи через последовательный порт компьютера или периферийного устройства. Один или несколько периферийных устройств UART обычно интегрированы в микроконтроллеры. Специализированные UART используются в автомобилях, смарт-картах и SIM-картах. Связанное устройство, универсальный синхронный и асинхронный приёмник-передатчик (USART), также поддерживает синхронный режим работы. В терминах модели OSI, UART функционирует на втором уровне – канальном уровне.
Начало
Стартовый бит сообщает приемнику о начале передачи нового символа.
Биты данных
Следующие пять-девять бит, в зависимости от используемого набора кодов, кодируют символ.
Биты паритета
Если используется бит четности, он располагается после всех битов данных. Бит четности позволяет принимающему UART определить, были ли какие-либо изменения в данных во время передачи.
Остановись.
Следующие один или два бита всегда находятся в состоянии логического высокого уровня (т.е. "1") и называются стоповыми битами. Они сигнализируют приемнику о завершении передачи символа. Поскольку стартовый бит имеет логический низкий уровень (0), а стоповый бит – логический высокий уровень (1), между символами всегда происходит как минимум два гарантированных изменения сигнала. Если линия удерживается в логическом низком состоянии дольше времени, необходимого для передачи символа, это является состоянием обрыва, которое может быть обнаружено UART.
Приемник
Все операции аппаратной части UART контролируются внутренним тактовым сигналом, работающим с частотой, кратной скорости передачи данных, обычно в 8 или 16 раз превышающей скорость передачи битов. Приемник проверяет состояние входящего сигнала с каждым тактовым импульсом, выявляя начало стартового бита. Если кажущийся стартовый бит длится не менее половины времени бита, он считается действительным и сигнализирует о начале нового символа. В противном случае он рассматривается как ложный импульс и игнорируется. После ожидания еще одного периода бита состояние линии снова опрашивается, и полученный уровень записывается в сдвиговый регистр. По истечении необходимого количества периодов битов, соответствующих длине символа (обычно от 5 до 8 бит), содержимое сдвигового регистра становится доступным (в параллельном виде) для принимающей системы. UART устанавливает флаг, указывающий на наличие новых данных, и может также генерировать прерывание процессора с запросом на передачу полученных данных хост-процессором. Связывающиеся UART не имеют общей системы синхронизации, кроме сигнала связи. Обычно UART пересинхронизируют свои внутренние часы при каждом изменении линии данных, которое не распознается как ложный импульс. Получая таким образом информацию о времени, они надежно принимают данные, даже если передатчик отправляет их с немного отличающейся скоростью. Более простые UART не делают этого; вместо этого они пересинхронизируются только по спадающему фронту стартового бита, а затем считывают середину каждого ожидаемого бита данных, и эта система работает, если скорость передачи данных достаточно точна для надежного считывания стоповых битов. Стандартной функцией UART является хранение последнего принятого символа во время приема следующего. Этот "двойной буфер" предоставляет принимающему компьютеру время, равное полному времени передачи символа, для получения принятого символа. Многие UART имеют небольшую буферную память FIFO (First In, First Out – первый пришел, первый ушел) между сдвиговым регистром приемника и интерфейсом хост-системы. Это дает хост-процессору еще больше времени для обработки прерывания от UART и предотвращает потерю принятых данных при высоких скоростях.
Передатчик
Операция передачи проще, поскольку время не нужно определять по состоянию линии и она не привязана к фиксированным временным интервалам. Как только передающая система помещает символ в сдвиговый регистр (после завершения передачи предыдущего символа), UART генерирует стартовый бит, сдвигает необходимое количество битов данных на линию, генерирует и отправляет бит четности (если используется) и отправляет стоповые биты. Поскольку работа в режиме полной дуплексной связи требует одновременной передачи и приема символов, UART используют два отдельных сдвиговых регистра для передаваемых и принимаемых символов. Высокопроизводительные UART могут содержать FIFO-буфер (first in first out) для передачи, позволяющий процессору или DMA-контроллеру записывать сразу несколько символов в FIFO, а не по одному в сдвиговый регистр. Поскольку передача одного или нескольких символов может занимать значительное время относительно скорости процессора, UART поддерживает флаг занятости, чтобы хост-система знала, есть ли хотя бы один символ в буфере передачи или сдвиговом регистре; сигнал "готов к приему следующих символов" также может подаваться посредством прерывания.
Применение
Для правильной работы передающие и принимающие UART должны быть настроены на одинаковую скорость передачи, длину символа, схему проверки чётности и количество стоповых битов. Принимающий UART может обнаружить некоторые несоответствия в настройках и установить флаг "ошибка кадрирования" для хост-системы; в исключительных случаях принимающий UART будет выдавать непредсказуемую последовательность искажённых символов и передавать их в хост-систему. Типичные последовательные порты, используемые с персональными компьютерами, подключенными к модемам, используют восемь бит данных, без проверки чётности и один стоповый бит; для этой конфигурации количество символов ASCII в секунду равно скорости передачи, делённой на 10. Некоторые очень дешёвые домашние компьютеры или встраиваемые системы обходятся без UART и используют процессор для считывания состояния входного порта или непосредственного управления выходным портом для передачи данных. Хотя это требует значительных вычислительных ресурсов процессора (поскольку критически важна точность синхронизации процессора), чип UART можно таким образом исключить, что позволяет сэкономить средства и место. Эта техника известна как программная эмуляция UART.
История
Некоторые ранние схемы телеграфа использовали импульсы переменной длины (как в коде Морзе) и вращающиеся часовые механизмы для передачи алфавитных символов. Первыми устройствами последовательной связи (с импульсами фиксированной длины) были вращающиеся механические переключатели (коммутаторы). Различные кодировки символов, использующие 5, 6, 7 или 8 бит данных, стали распространены в телепринтерах, а позже и в компьютерных периферийных устройствах. Телетайп был отличным универсальным устройством ввода-вывода для небольшого компьютера. Гордон Белл из DEC разработал первый UART, занимавший всю печатную плату, называемую линейным блоком, для серии компьютеров PDP, начиная с PDP 1. По словам Белла, основным новшеством UART было использование дискретизации для преобразования сигнала в цифровую область, что обеспечивало более надежную синхронизацию, чем в предыдущих схемах, использовавших аналоговые устройства синхронизации с ручной регулировкой потенциометров. Чтобы снизить стоимость проводки, системной платы и других компонентов, эти компьютеры также стали пионерами в использовании управления потоком данных с помощью символов XON и XOFF вместо аппаратных линий. DEC скомпоновал конструкцию линейного блока в ранний однокристальный UART для собственного использования. В 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, отказались от внешних COM-портов RS 232 и стали использовать порты USB, способные передавать данные быстрее. Для пользователей, которым все еще требуются последовательные порты RS 232, теперь обычно используются внешние USB-мосты в UART. Они объединяют аппаратные кабели и чип для преобразования USB в UART. Cypress Semiconductor и FTDI – два из основных коммерческих поставщиков этих чипов. Хотя порты RS 232 больше не доступны для пользователей на внешних интерфейсах большинства компьютеров, многие внутренние процессоры и микропроцессоры имеют встроенные UART для обеспечения возможности аппаратным разработчикам взаимодействовать с другими чипами или устройствами, использующими RS 232 или RS 485 для связи.
Ошибка перехода
Ошибка переполнения возникает, когда приемник не успевает обработать принятый символ до поступления следующего. Различные устройства имеют разный объем буферной памяти для хранения принятых символов. Процессор или контроллер DMA должны обслуживать UART для извлечения символов из входного буфера. Если процессор или контроллер DMA не обслуживают UART достаточно быстро и буфер заполняется, возникает ошибка переполнения, и входящие символы теряются.
Ошибка недопостижения
Ошибка недополнения возникает, когда передатчик UART завершил передачу символа и буфер передачи опустел. В асинхронных режимах это интерпретируется как признак отсутствия данных для передачи, а не как ошибка, поскольку могут быть добавлены дополнительные стоповые биты. Данный индикатор ошибки часто встречается в USART, так как недополнение более критично в синхронных системах.
Ошибка вставки
UART обнаружит ошибку в кадре, когда не обнаружит "стоп"-бит в ожидаемое время его появления. Поскольку "старт"-бит используется для определения начала входящего символа, его временные характеристики служат ориентиром для остальных бит. Если линия данных не находится в ожидаемом состоянии (высоком уровне) в момент, когда ожидается "стоп"-бит (в соответствии с количеством бит данных и бита четности, для которых настроен UART), UART сообщит об ошибке в кадре. Состояние "разрыва" (break) на линии также будет зарегистрировано как ошибка в кадре.
Ошибка паритета
Ошибка паритета возникает, когда чётность количества единичных битов не совпадает с чётностью, заданной битом паритета. Проверка паритета часто используется для обнаружения ошибок при передаче данных. Использование бита паритета является необязательным, поэтому эта ошибка возникнет только в том случае, если проверка паритета включена.
Условия разрыва
Условие прерывания возникает, когда вход приемника находится на уровне "пробел" (логический низкий, то есть '0') в течение времени, превышающего определенную продолжительность, обычно больше, чем время одного символа. Это не обязательно является ошибкой, но воспринимается приемником как символ, состоящий из нулевых битов, с ошибкой кадрирования. Термин "прерывание" происходит от сигнализации по токовому контуру, которая традиционно использовалась в телетайпах. Состояние "пробел" в линии токового контура обозначается отсутствием тока, а очень длительное отсутствие тока часто вызвано разрывом или другой неисправностью линии. Некоторые устройства намеренно передают уровень "пробел" дольше, чем один символ, в качестве сигнала внимания. При несовпадении скоростей передачи сигналов отправка осмысленных символов невозможна, но длительный сигнал "прерывания" может быть полезным способом привлечь внимание несогласованного приемника для выполнения какого-либо действия (например, самоперезагрузки). Компьютерные системы могут использовать длительный уровень "прерывания" в качестве запроса на изменение скорости передачи сигналов для поддержки доступа по коммутируемой линии с различными скоростями. Протокол DMX512 использует условие прерывания для сигнализации начала нового пакета.
Модели UART
Двойной UART, или DUART, объединяет два UART в один чип. Аналогичным образом, четырехкратный UART или QUART объединяет четыре UART в один пакет, например NXP 28L194. Октальный UART или OCTART объединяет восемь UART в один пакет, например Exar XR16L788 или NXP SCC2698. Модель Описание WD1402A Первый однокристальный UART, поступивший в свободную продажу. Представлен примерно в 1971 году. Совместимыми чипами были Fairchild TR1402A и General Instruments AY 5 1013. Exar XR21V1410 Intersil 6402 CDP 1854 (RCA, ныне Intersil) Zilog Z8440 Универсальный синхронный и асинхронный приемопередатчик (USART). 2000 кбит/с. Асинхронный, Bisync, SDLC, HDLC, X.25. CRC. 4-байтовый буфер RX. 2-байтовый буфер TX. Предоставляет сигналы, необходимые стороннему контроллеру DMA для выполнения передач DMA. Z8530/Z85C30 Этот USART имеет 3-байтовый буфер приема и 1-байтовый буфер передачи. Он имеет аппаратную поддержку для ускорения обработки HDLC и SDLC. CMOS-версия (Z85C30) предоставляет сигналы, позволяющие стороннему контроллеру DMA выполнять передачи DMA. Он поддерживает асинхронную, синхронную на байтовом уровне и синхронную на битовом уровне связь. 8250 Устарел, имеет 1-байтовые буферы. Максимальная стандартная скорость последовательного порта для этих UART составляет 9600 бит/с, если задержка прерывания в операционной системе составляет 1 мс. UART 8250 использовались в IBM PC 5150 и IBM PC/XT, а UART 16450 – в компьютерах серии IBM PC/AT. 8251 имеет функциональность USART. 8251 Motorola 6850 6551 Rockwell 65C52 16450 82510 Этот UART поддерживает асинхронную работу со скоростью до 288 кбит/с, с двумя независимыми четырехбайтовыми FIFO. Производился Intel как минимум с 1993 по 1996 год, а Innovastic Semiconductor имеет спецификацию IA82510 от 2011 года. 16550 FIFO этого UART неисправен, поэтому он не может безопасно работать быстрее, чем UART 16450. Версии 16550A и более поздние исправляют эту ошибку. 16550A Этот UART имеет 16-байтовые буферы FIFO. Уровни триггера прерывания приема можно установить на 1, 4, 8 или 14 символов. Максимальная стандартная скорость последовательного порта, если задержка прерывания в операционной системе составляет 1 мс, составляет 128 кбит/с. Системы с меньшей задержкой прерывания или с контроллерами DMA могут обрабатывать более высокие скорости передачи данных. Этот чип может предоставлять сигналы, необходимые для выполнения передач DMA в UART и из UART контроллером DMA, если включен режим DMA, который вводит этот UART. Он был представлен компанией National Semiconductor, которая была продана Texas Instruments. National Semiconductor утверждала, что этот UART может работать со скоростью до 1,5 Мбит/с. 16C552 16650 Этот UART был представлен компанией Startech Semiconductor, которая в настоящее время принадлежит Exar Corporation и не связана с Startech.com. Ранние версии имеют неисправный буфер FIFO и поэтому не могут безопасно работать быстрее, чем UART 16450. Рабочие версии этого UART имеют 32-символьные буферы FIFO и могут функционировать на стандартных скоростях последовательного порта до 230,4 кбит/с, если задержка прерывания в операционной системе составляет 1 мс. Текущие версии этого UART от Exar утверждают, что могут обрабатывать до 1,5 Мбит/с. Этот UART вводит функции Auto RTS и Auto CTS, в которых сигнал RTS# управляется UART для сигнализации внешнему устройству о прекращении передачи, когда буфер UART заполнен до или за установленную пользователем точку срабатывания, и прекращении передачи на устройство, когда устройство устанавливает сигнал CTS# в высокий уровень (логический 0). 16750 64-байтовые буферы. Этот UART может обрабатывать максимальную стандартную скорость последовательного порта 460,8 кбит/с, если максимальная задержка прерывания составляет 1 мс. Этот UART был представлен компанией Texas Instruments. TI утверждает, что ранние модели могут работать до 1 Мбит/с, а более поздние модели этой серии – до 3 Мбит/с. 16850 128-байтовые буферы. Этот UART может обрабатывать максимальную стандартную скорость последовательного порта 921,6 кбит/с, если максимальная задержка прерывания составляет 1 мс. Этот UART был представлен компанией Exar Corporation. Exar утверждает, что ранние версии могут работать до 2 Мбит/с, а более поздние версии – до 2,25 Мбит/с в зависимости от даты производства. 16C850 16950 128-байтовые буферы. Этот UART может обрабатывать максимальную стандартную скорость последовательного порта 921,6 кбит/с, если максимальная задержка прерывания составляет 1 мс. Этот UART поддерживает 9-битные символы в дополнение к 5–8-битным символам, поддерживаемым другими UART. Он был представлен компанией Oxford Semiconductor, которая теперь принадлежит PLX Technology. Oxford/PLX утверждает, что этот UART может работать до 15 Мбит/с. Варианты PCI Express от Oxford/PLX интегрированы с контроллером PCIe DMA, выполняющим прямое управление шиной. Этот контроллер DMA использует сигналы режима DMA UART, определенные для 16550. Контроллеру DMA требуется, чтобы ЦП настроил каждую транзакцию и опрашивал регистр состояния после начала транзакции, чтобы определить, завершена ли транзакция. Каждая транзакция DMA может передавать от 1 до 128 байт между буфером памяти и UART. Варианты PCI Express также могут позволить ЦП передавать данные между собой и UART с помощью передач 8, 16 или 32 бит при использовании программируемого ввода/вывода. 16C950 16954 Четырехпортовая версия 16950/16C950. 128-байтовые буферы. Этот UART может обрабатывать максимальную стандартную скорость последовательного порта 921,6 кбит/с, если максимальная задержка прерывания составляет 1 мс. Этот UART поддерживает 9-битные символы в дополнение к 5–8-битным символам, поддерживаемым другими UART. Он был представлен компанией Oxford Semiconductor, которая теперь принадлежит PLX Technology. Oxford/PLX утверждает, что этот UART может работать до 15 Мбит/с. Варианты PCI Express от Oxford/PLX интегрированы с контроллером PCIe DMA, выполняющим прямое управление шиной. Этот контроллер DMA управляется сигналами режима DMA UART, определенными для 16550. Контроллеру DMA требуется, чтобы ЦП настроил каждую транзакцию и опрашивал регистр состояния после начала транзакции, чтобы определить, завершена ли транзакция. Каждая транзакция DMA может передавать от 1 до 128 байт между буфером памяти и UART. Варианты PCI Express также могут позволить ЦП передавать данные между собой и UART с помощью передач 8, 16 или 32 бит при использовании программируемого ввода/вывода. 16C1550/16C1551 UART с 16-байтовыми буферами FIFO. До 1,5 Мбит/с. ST16C155X не совместим со стандартным отраслевым 16550 и не будет работать со стандартным драйвером последовательного порта в Microsoft Windows. 16C2450 Двойной UART с 1-байтовыми буферами FIFO. 16C2550 Двойной UART с 16-байтовыми буферами FIFO. Аппаратно и функционально совместим с 16C2450. Программно совместим с INS8250 и NS16C550. SCC2691 В настоящее время производится компанией NXP, 2691 – 2 порта. Предоставляет сигналы, необходимые стороннему контроллеру DMA для выполнения передач DMA. 4-байтовый буфер для отправки, 8-байтовый буфер для приема на канал. Режимы SDLC/HDLC. 5 Мбит/с в синхронном режиме. Hayes ESP 1 КБ буферов, 921,6 кбит/с, 8 портов. Exar XR17V352, XR17V354 и XR17V358 Двойные, четырехкратные и восьмикратные UART PCI Express с набором регистров, совместимым с 16550, 256-байтовыми FIFO TX и RX, программируемыми уровнями триггера TX и RX, счетчиками уровней FIFO TX/RX, генератором дробной скорости передачи данных, автоматическим аппаратным управлением потоком RTS/CTS или DTR/DSR с программируемым гистерезисом, автоматическим программным управлением потоком Xon/Xoff, выходом управления полудуплексным режимом RS 485 с программируемой задержкой переключения, мульти-дропом с автоматическим обнаружением адреса, инфракрасным (IrDA 1.1) кодировщиком/декодером данных. Указаны до 25 Мбит/с. Спецификации датированы 2012 годом. Exar XR17D152, XR17D154 и XR17D158 Двойные, четырехкратные и восьмикратные UART шины PCI с 5G-совместимым набором регистров 16C550, 64-байтовыми буферами передачи и приема, счетчиками уровней FIFO передачи и приема, программируемым уровнем триггера FIFO TX и RX, автоматическим управлением потоком RTS/CTS или DTR/DSR, автоматическим программным управлением потоком Xon/Xoff, выходом управления RS485 HDX с выбираемой задержкой переключения, инфракрасным (IrDA 1.0) кодировщиком/декодером данных, программируемой скоростью передачи данных с делителем частоты, скоростью передачи последовательных данных до 6,25 Мбит/с. Спецификации датированы 2004 и 2005 годами. Exar XR17C152, XR17C154 и XR17C158 Двойные, четырехкратные и восьмикратные 5-вольтовые UART шины PCI с совместимыми регистрами 16C550, 64-байтовыми буферами передачи...
UART в модемах
Модемы для персональных компьютеров, подключаемые к слоту на материнской плате, также должны включать функцию UART на плате. Оригинальный чип 8250 UART, поставлявшийся с персональным компьютером IBM, имел буфер всего в один символ для приемника и передатчика, что приводило к плохой работе коммуникационного программного обеспечения на скоростях выше 9600 бит/с, особенно при работе в многозадачной системе или при обработке прерываний от дисковых контроллеров. Высокоскоростные модемы использовали UART, совместимые с оригинальным чипом, но включавшие дополнительные FIFO-буферы, что давало программному обеспечению больше времени для обработки входящих данных. Анализ требований к производительности при высоких битовых скоростях показывает, почему FIFO объемом 16, 32, 64 или 128 байт является необходимостью. Спецификация Microsoft для системы DOS требует, чтобы прерывания не отключались более чем на 1 миллисекунду. Некоторые жесткие диски и видеоконтроллеры нарушают это требование. Скорость 9600 бит/с обеспечивает получение символа примерно каждую миллисекунду, поэтому FIFO объемом 1 байт должен быть достаточным при этой скорости в системе DOS, соответствующей максимальному времени отключения прерываний. При более высоких скоростях может быть получен новый символ до того, как старый будет обработан, что приведет к потере старого символа. Это называется ошибкой переполнения и приводит к потере одного или нескольких символов. FIFO объемом 16 байт позволяет принять до 16 символов, прежде чем компьютер должен обработать прерывание. Это увеличивает максимальную скорость, которую компьютер может надежно обрабатывать, с 9600 до 153 000 бит/с при времени простоя прерывания в 1 миллисекунду. FIFO объемом 32 байта увеличивает максимальную скорость до более чем 300 000 бит/с. Второе преимущество FIFO заключается в том, что компьютеру требуется обрабатывать лишь около 8–12% от количества прерываний, что освобождает больше времени процессора для обновления экрана или выполнения других задач. Таким образом, скорость реакции компьютера также улучшается.
Эмуляция
Поскольку протокол связи UART прост, его можно эмулировать, управляя GPIO-пинами побитово в программном обеспечении на современных микроконтроллерах (например, Arduino или Teensy), или на программируемых автоматах ввода-вывода (например, PIO Raspberry Pi Pico или FlexIO от NXP).