Универсальность

Итак, что делает Универсальный Асинхронный Приёмо-Передатчик (УАПП, UART) универсальным? UART имеет длинную историю, начало его было положено ещё в 1840-х годах, с некоторыми из первых систем телеграфа. В то время нажатие телеграфного ключа связывало протекание тока в приёмнике, нажатый стилус в котором оставлял «пятно» на полоске бумаги. Сигналы азбуки Морзе, посылаемые, а затем отображаемые визуально, упрощали чтение передаваемого сообщения. Конечно, через непродолжительное время операторы настолько привыкали к звукам «кликов», что обнаружили способность так же легко воспринимать сообщение, как и записать его на листке бумаги, и вместо механической системы стал использоваться звук. Конечно, звук включался тогда, когда протекал ток в приёмнике, и сигнал по-прежнему был разделён на «знаки», когда ток протекал, и промежутки, когда тока не было. Другими словами, «стандартом» стало из пера и бумаги восприятие на слух, но «протокол» азбуки Морзе не изменился.

Азбука Морзе стала феноменальным двигателем технологии, позволяла отправлять сообщения на очень большие расстояния, особенно когда было реализовано радиосообщение и стали не нужны больше провода, соединяющие источник и приёмник сигнала. В то время кто-то сообразил, что из этой технологии можно извлечь финансовую выгоду, и на рынке появился прототип печатной машинки. Эти машины незначительно изменили технологию. Используя специальные коды для каждого символа, серия импульсов направляла печатающее колесо из текущей позиции к следующей для печати символа. Специальный сигнал управлял печатью текущего символа на ленте. По мере развития технологии с вращающимся колесом, код Бодо был разработан в качестве нового протокола, устанавливающего соответствие символов определенным последовательностям импульсов.

Как и телеграфия, так и телетайп и в частности компьютер, росли вместе с новой технологией радиосвязи. Телетайп стал полезен не только как средство общения между людьми, но и в качестве интерфейса для первых компьютеров. Инструкции могли быть отправлены набором определённых ключей, посылая определённый шаблон импульсов компьютеру. В результате импульсы могли быть отправлены на принтер, который переводил их обратно в буквы и цифры, для понимания нами. Но даже при том, что технологии шли разными путями, начало их было положено Сэмюэлем Морзе. Так, некоторые характеристики и понятия остались прежними, например — «метка» и «пробел» для обозначения протекания тока (высокий уровень — логическая «1»), и отсутствия тока (низкий уровень — логический «0»).

В компьютерах изменилось то, что вместо измерения силы тока измерялся уровень напряжения. Некоторые положения сохраняются, так, в протоколе RS-232 логической «1» используется отрицательное напряжение. отрицательное напряжение раньше создавало ток в телетайпе для обозначения сигнала «метка». Положительное напряжение отключало сигнал, обозначая пробел. Как выяснилось, для разных условий (а иногда и просто в разных компаниях) требовались разные стандарты для последовательной отправки данных. Соединения и уровни сигналов «марк» и «пробел» не обязательно должны были остаться такими же, но используемый протокол (способ кодирования символов в виде импульсов) сохранился. В частности, используя транзисторы, можно было бы с лёгкостью создать универсальную систему, понятную для любого компьютера или устройства, систему, преобразующую сигналы транзисторной логики (ТТЛ) в любой требуемый стандарт. Протокол был так же изменён, использую таблицу ASCII для кодирования данных в цифре. Так родился Универсальный Асинхронный Приёмопередатчик. (Заметим, что сигналы ТТЛ используют положительное напряжение, будь то 5В, 3,3В или какой-то другой уровень, для единицы, и 0В — для нуля).

Асинхронный

Теперь, когда ясно, что делает UART универсальным протоколом, давайте посмотрим на то, что имеется ввиду под «асинхронный». По радио вы можете отправить любое сообщение (голосовое, цифровой код, азбуку Морзе или любое другое), но сообщение не может быть получено, если кто-то его не слушает. Для последовательного подключения требуется что-то большее, чем просто сигнал готовности данных, подлежащих передаче, к сожалению. Представьте систему, в которой я, собираясь отправить сообщение, поднимаю вам гигантский знак. Предварительно мы договорились, что в 13:32 я установлю знак, и в это время вы увидите моё сообщение, адресованное вам, и читаете его. Это — параллельный вид передачи — каждая буква видна вся сразу. Теперь, скажем, я просто не имею доступа к куску бумаги достаточной величины для написания целого сообщеиня сразу, но я могу отправить вам одну букву за один раз. Так, мы договорились, что каждые 10 секунд я отправляю новую букву. Вы приходите в назначенное время и видите поднятую мной первую букву, которую пишете на листке бумаги. Каждые 10 секунд вы смотрите снова, а я держу новую букву, которую вы записываете. Это — последовательная связь. Но что произойдёт, если у кого-нибудь из нас плохие часы, и когда они показывают, что прошло 10 секунд, на самом деле прошло 12. В конце концов несоответствие времени приведёт либо к записи одной и той же буквы подряд, либо — к полному пропуску буквы, в завуисимости от того, у кого часы быстрее. Для того, чтобы обеспечить доставку сообщения, наши часы должны быть синхронизированы.

Существуют так же синхронные методы последовательной связи, такие как SPI и I2C, к которым мы обратимся в будущем. Эти методы имеют синхронные часы, используют одинаковые форматы для отправителя и получателя. Недостатком здесь представляется то, что для сигнала часов используется отдельный провод. Как видно из истории разработки УАПП, почему-то тактовый сигнал не был включён в сообщение, вместо этого приёмник и передатчик договаривались о скорости отправки данных. Это позволяло отправителю и адресату иметь свои часы, которые не были синхронизированы со второй стороной, но требовало, чтобы часы каждого участника были точными. Асинхронная связь упрощает подключение, так как не требуется второй сигнал параллельно с данными за счёт поддержки точного интервала времени между данными.

Приёмопередатчик

Достаточно истории, посмотрим на то, как с помощью UART передавать информацию. Вне зависимости от используемого протокола, мы можем кодировать данные в виде серии единиц и нулей. Мы можем кодировать число в двоичном представлении или можем кодировать символ как особое двоичное число. При любом раскладе у нас есть определённое количество нулей и единиц для отправки. В UART мы так же добавим по крайней мере два дополнительных бита, один — для обозначения начала нового набора данных, и один — для обозначения конца. Эти стартовые и стоповые биты с битами данных между ними составляют, как мы это называем, один «кадр» данных. Используя кодировку ASCII, чаще всего отправляются 7 бит данных. Кроме того, каждый 10-й бит будет отправлен между данными и стопом, чтобы помочь определить, были ли корректны полученные данные. Если отправитель и приёмник договорились, что каждый кадр будет содержать чётное число единиц в нём, то это — «бит чётности», он будет единицей или нулём, в зависимости от числа единиц в остальной части сообщения. Приёмник может посмотреть 7 битов данных и бит чётности, сложить единицы, и если общее количество их чётное, — он принял правильное сообщение.  в 8- и 16- битных системах, таких как микроконтроллеры, может быть логичнее было бы передавать данные по 8 бит вместо сегментов. Часто в таких случаях бит чётности не включается, чтобы сохранить общую длину каждого кадра в 10 бит. Этот компромисс не содержит способа проверки на ошибки передачи, но в целом проверка необходима только при определённых обстоятельствах.

Допустим, мы хотим закодировать букву «D», используя 7-битное кодирование ASCII и добавляем чётность. ASCII-код буквы «D» — это 0x44, или 0b1000100 в 7-битном бинарном представлении. Теперь мы стоим перед выбором: какой мы можем отправить,  младший или старший бит в первую очередь? Типичный протокол, используемый в УАРТ, начинается с младшего бита, так называемый прямой порядок байтов. (Это имеет смысл, если думать в терминах сдвигового регистра; в УАРТ СР сдвигает биты от старших к младшим, так что мы отправляем младший бит первым.)

Представление ASCII символа»D» в UART ТТЛ.

В UART используется логическая единица по-умолчанию (или в простое). Так, чтобы начать отправку сообщения, мы переключаем логический уровень с высокого на низкий. Таким образом, наш стартовый бит будет «0». Кроме того, при остановке мы возвращаемся в предыдущее состояние, так что наш стоповый бит равен «1». Так, наше полное кодированное сообщение будет выглядеть как «00010001×1», где x представляет бит чётности. Мы хотим добавить чётность, и в нашем символе «D» две единицы, поэтому установим этот бит в единицу для обеспечения нечётности всего числа в сообщении. В итоге наше сообщение будет преобразовано в такой битовый поток: «0001000111». (Если мы сделаем это с 8-разрядными данными и без проверки чётности, мы бы получили «0001000101», на этот раз последним битом является старший бит, в 8-битном коде 0b01000100.)

Надеемся, это дало вам чёткое представление о том, как работает UART (УАПП). На самом деле нет ограничений на то, какой протокол вам использовать до тех пор, пока есть начало и стоповый бит. Пока отправитель и получатель договорились на то, что происходит в середине и с какой скоростью поступает информация, это будет работать. Стандартный протокол, такой как был показан здесь, очень удобен тем, что очень простой для использования компьютера для чтения данных, поступающих от микроконтроллера. Кроме того, существуют стандартные скорости передачи битов (бит в секунду, или бод), которые сохранились со времён телетайпа. В любом случае, многие системы ограничены использованием именно этих скоростей, так что это хорошая идея, чтобы их стандартизировать. Если у вас есть собственные внутренние системы, используйте ту скорость передачи, какую вам удобно, но помните, что множество компьютеров и устройств работают на обычных скоростях, таких как 300, 1200, 4800, 9600 или 115200 бод.

Мы определили одну из ключевых вещей, необходимых для качественного UART — это хорошие часы. В следующий раз мы будем рассматривать некоторые их параметры, ограничения и о том, как их реализовать.

Задание читателю: Используя 7-битное кодирование при положительной чётности, ответьте на вопрос: как будет выглядеть поток битов для отправки символа «J»? Как насчёт символа «K»? Используя 8-битное кодирование без контроля чётности, какой будет поток для отправки символа новой строки, «\n»? Как насчёт символа «&»?

 источник