Изучение последовательного порта UART.

Помните, когда у принтеров, мышей и модемов были толстые кабели с этими огромными неуклюжими разъемами? Те, которые буквально должны были ввинчиваться в компьютер? Мало кто знает, что эти UART-компоненты использовались для связи с вашим компьютером. Почти полностью заменила эти старые кабели и разъемы технология USB. UART-интерфейсы, описание которых найдете в этой статье, не ушли в прошлое. Их используют во многих проектах электроники DIY для подключения GPS, Bluetooth и модулей считывания карт RFID к Pi, Arduino или другим микроконтроллерам.

UART-интерфейс: описание

UART означает универсальный асинхронный приемник/передатчик. Это не коммуникационный протокол, такой как SPI и I2C, а физическая схема в микроконтроллере. Основной целью является передача и получение информации. Одно из лучших достижений технологии заключается в том, что он использует только два провода.

UART-интерфейс — это два устройства, которые обмениваются данными друг с другом. Передающий источник преобразует информацию с управляющего устройства, такого как центральный процессор, в последовательную форму, передает его в последовательном порядке на принимающий UART, который преобразует значения для принимающего устройства. Для передачи информации между двумя устройствами требуется только два провода.

Введение в коммуникацию UART

UART RS485 передае т данные асинхронно, что означает отсутствие сигнала для синхронизации выхода битов от передающего устройства к принимающему. Вместо тактового сигнала передающий UART добавляет биты начала и окончания передаваемого пакета. Эти параметры определяют начало и конец документа.

Когда принимающий UART обнаруживает стартовый бит, он начинает считывать входящие биты с определенной частотой, известной как скорость передачи. Скорость передачи данных является мерой скорости, выраженной в единице измерения, — бит/с. Оба устройства должны работать примерно с одинаковой скоростью передачи. Скорость передачи между передающим и принимающим устройствами может отличаться на 10%.

Оба прибора также должны быть сконфигурированы для передачи и получения той же структуры пакета.

UART — что это и как это работает?

UART, который собирается передавать информацию, получает ее из шины данных. Она используется для отправки информации другим устройством, таким как процессор, память или микроконтроллер. После того как передающий UART получает параллельные данные из шины данных, он добавляет бит начала, четности и стоп-бит, создавая пакет данных. Затем пакет выводится последовательно, по частям. Принимающий UART считывает бит данных на свой вывод. Получающий UART преобразует информацию обратно в параллельную форму, удаляет бит начала и стоповые биты. Наконец, принимающий UART передает пакет данных параллельно шине данных на принимающей стороне.

Линия передачи обычно удерживается на высоком уровне напряжения, когда она не передает информацию. Для запуска UART тянет линию передачи от высокого к низкому за один такт. Когда принимающий UART обнаруживает переход от высокого к низкому напряжению, он начинает считывать биты в кадре данных с частотой передачи в бодах.

Технические особенности

Базовая система UART обеспечивает надежную, умеренную скорость, полнодуплексную связь с тремя сигналами: Tx (переданные последовательные данные), Rx (полученные последовательные данные) и земля. В отличие от других протоколов, таких как SPI и I2C, никакого тактового сигнала не требуется, поскольку пользователь предоставляет аппаратному обеспечению UART необходимую информацию о времени.

Типичный сигнал данных в описании UART-интерфейса — это просто напряжение, которое переходит между логическим низким и логическим высоким значением. Приемник может корректно преобразовывать эти логические состояния в цифровые данные только в том случае, если он знает, когда пробовать сигнал. Это можно легко выполнить с использованием отдельного тактового сигнала. Например, передатчик обновляет сигнал данных на каждом фронте фронта, а затем приемник производит выборку данных на каждом заднем фронте.

Ключевые термины

Начальный бит - первый бит однобайтовой передачи. Это указывает на то, что линия данных выходит из состояния бездействия. Состояние бездействия обычно имеет логическую высоту, поэтому стартовый бит является логически низким.

Начальный бит - бит служебной информации. Это означает, что он облегчает связь между приемником и передатчиком, но не передает значимые данные.

Стоповый бит - последний бит однобайтовой передачи. Его логический уровень такой же, как состояние простоя сигнала, то есть логический максимум.

Пошаговая процедура

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

Описание интерфейса UART:

    Передающий UART принимает данные параллельно от шины данных и добавляет начальный бит, бит четности и стоп-бит(-ы) в кадр данных.

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

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

    Преобразует полученные байты с компьютера по параллельным схемам в один последовательный бит-поток для исходящей передачи.

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

    Добавляет бит четности (если он был выбран) исходящих передач, проверяет четность входящих байтов (если выбрано), отбрасывает бит четности.

    Добавляет разделители начала и окончания исходящих, удаляет их из входящих передач.

Преимущества и недостатки

Не является совершенным, но UART довольно хороши в том, что они делают. Вот некоторые плюсы и минусы, которые помогут решить, соответствуют ли они потребностям вашего проекта:

Преимущества:

    Используется только два провода.

    Нет сигнала синхронизации.

    Имеет бит четности для проверки ошибок.

    Структура пакета данных может быть изменена, если для нее настроены обе стороны.

    Хорошо документированный и широко используемый метод.

Недостатки:

    Размер кадра данных ограничен максимумом в 9 бит.

    Не поддерживает нескольких подчиненных или нескольких мастер-систем.

Кроме того, скорость передачи данных каждого UART-интерфейса Arduino должна находиться в пределах 10% друг от друга.

UART микроконтроллеров AVR.

Одним из самых распространенных протоколов взаимодействия микроконтроллера с внешними устройствами является UART (Universal Asynchronous Receiver-Transmitter ) - Универсальный асинхронный приёмопередатчик . Данный протокол аппаратно реализован в большинстве микроконтроллеров AVR , что позволяет разработчику не вдаваться в особенности реализации данного интерфейса. Для его использования достаточно настроить всего несколько регистров!

Рассмотрим кратко принцип работы UART .

Данный протокол является последовательным, то есть данные идут строго друг за другом, что в некоторой мере ограничивает скорость работы. Так как протокол является асинхронным, приемник и передатчик должны работать строго на одной частоте, которую необходимо настроить ещё до начала работы.

При передаче байта передатчик изначально выставляет логический 0 на выводе TX (Transmitter ). Это так называемый старт-бит, означающий начало передачи. После этого передатчик выставляет биты передаваемого байта через определенные промежутки времени, заданные частотой. Далее может быть передан бит четности, который служит для проверки качества передачи. Когда переданы все биты, выставляется стоп-бит, то есть логическая 1 на линии передачи. Число стоп-битов может быть различным:1 ; 1 , 5 ; 2.

Огромным плюсом данного интерфейса является возможность его использования для настройки связи с ПК. Для этого необходимо изготовить UART —RS 232 или UART —USB переходники, основанные на микросхемах MAX 232 и FT 232RL соответственно.

Подробнее о переходниках здесь.

За работу с UART (на самом деле USART , о днако, для нас это сейчас не важно) отвечают следующие регистры:

UDR - Регистр данных UART . При передаче в него записываются данные, которые необходимо отправить, а при чтении — принятые данные. Всё просто.

UCSRA - Регистр контроля и статуса UART . Рассмотрим биты данного регистра подробнее:

  • RXC (Receive Complete ) - флаг окончания приема данных. Устанавливается в 1 при наличии несчитанных данных и сбрасывается в 0 по окончании приема данных.
  • TXC (Transmit Complete ) - флаг окончания передачи данных. Сбрасывается в 0 по окончании передачи данных и устанавливается в 1 при наличии непереданных данных.
  • UDRE (Data Register Empty ) - флаг, означающий готовность регистра UDR получать новые данные. Когда UDRE равен 1, регистр UDR пуст и готов к приему новых данных.
  • FE (Frame Error) - флаг ошибки фрейма.
  • DOR (Data OverRun ) - флаг переполнения регистра данных.
  • PE (Parity Error) - флаг ошибки четности
  • U 2 X - бит, позволяющий увеличить скорость передачи вдвое. При записи 1 в данный бит предделитель тактовой частоты модуля UART уменьшается вдвое, что позволяет вдвое увеличить скорость передачи данных.
  • MPCM - мультипроцессорный режим коммуникации.

UCSRB - Регистр контроля и статуса UART .

  • RXCIE (RX Complete Interrupt Enable ) - Бит, разрешающий или запрещающий генерацию прерывания по окончании приема. При записи 1 в данный бит прерывание по окончании приема разрешено, при записи 0 — запрещено.
  • TXCIE (TX Complete Interrupt Enable ) - При записи 1 в данный бит прерывание по окончании передачи данных разрешено, при записи 0 — запрещено.
  • UDRIE (Data register empty Interrupt Enable ) - Бит, разрешающий или запрещающий возникновение прерывания по флагу UDRE .
  • RXEN (Reciever Enable ) - Запись 1 в данный бит включает приемник UART модуля, запись 0 — выключает.
  • TXEN (Transmitter Enable ) - Запись 1 в данный бит включает передатчик UART модуля, запись 0 — выключает.
  • UCSZ 2 (Character Size ) - В паре с битами UCSZ 1 и UCSZ 0 задает число передаваемых бит.То есть мы можем передавать не только побайтно, но и по 5,6,7,8,9 бит.
  • RXB 8 (Receive Data Bit 8) - 9 бит принимаемых данных при передаче по 9 бит. Должен быть считан перед операциями с регистром UDR .
  • TXB 8 (Transmit Data Bit 8) - 9 бит отсылаемых данных при передаче по 9 бит. Должен быть записан перед записью других бит в UDR .

UCSR С - Регистр контроля и статуса UART .


  • UCPOL - Данный бит позволяет настроить, по какому фронту будет происходить обмен данными при синхронном режиме передачи. При работе в асинхронном режиме передачи необходимо установить данный бит в 0.

Регистры UBRRL и UBRRH отвечают за настройку скорости работы приемопередатчика. Следует помнить, что при работе с регистром UBRRH бит URSEL должен быть равен 0.

Для получения необходимой скорости работы UART значение UBRR (Пары регистров UBRRH и UBRRL ) рассчитывается по следующей формуле:

UBRR = (F osc /(B*16))-1

Где,

F osc - частота работы микроконтроллера (Гц).

B - необходимая скорость работы UART (Бит/сек).

Например, необходимо настроить скорость передачи 9600 бит/ сек при работе микроконтроллера на частоте 8 МГЦ(8000000 Гц).

UBRR = (8000000/(9600*16))-1 = 51.083333

Округляем до целого числа, то есть до 51.И уже данное число записываем в регистры UBRRL:UBRRH.

Урок получился достаточно объемным, поэтому практическую реализацию протокола UART на микроконтроллерах AVR рассмотрим в следующем уроке.

Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG .RU . Незаконное копирование, цитирование, воспроизведение преследуется по закону!

Раз уж я буду использовать UART для связки устройств блога с Вашими проектами немного расскажу как он устроен и как им пользоваться.

Универсальный асинхронный приемопередатчик (UART) довольно старый и распространенный интерфейс. До недавнего времени разъем COM порта (тот-же UART только уровни напряжения другие) был обязательным атрибутом каждого компьютера. Теперь COM порт постепенно «отмирает» и если на «башнях» он еще не редкость, то на ноутбуках его уже нет и в помине. Но в виду простоты и популярности интерфейса подавляющее большинство микроконтроллеров имеет UART в составе своей периферии. И если персональный компьютер UART перестает удовлетворять из-за низкой скорости и невозможности расширения, то для микроконтроллеров интерфейс удобен и использование его будет продолжаться.
Раз UART есть во многих микроконтроллерах, значит мы его будем использовать как один из интерфейсов связи устройств блога с Вашими электронными устройствами.
Для начала немного теории работы интерфейса (без лишних подробностей). Для связи по интерфейсу UART используется две ножки контроллера RXD – для приема сообщений (Receiver) и TXD – для передачи сообщений (Transmitter). UART — полнодуплексный интерфейс. Это значит, что приемник и передатчик работают независимо друг от друга. Более того, передатчик или приемник можно отдельно отключить, освободив ножку контроллера для других нужд. Передача (соответственно и прием) сообщений осуществляется фиксированными пакетами битов (такой пакет называют кадром). Кадр состоит из старт-бита (с него начинается каждый кадр), битов данных (может быть от 5 до 9 бит), бита проверки четности (проверка правильности передачи данных) и одного или двух стоп-битов (сигнал об окончании кадра).

где:
IDLE — ожидание обмена — должна быть 1 ;
St — Старт-бит — всегда 0 ;
(n) — Биты данных — может быть от 5 до 9 бит;
P — Бит четности;
Sp — Стоп бит — всегда 1.

Если посылка содержит более одного байта, каждый следующий байт передается отдельным кадром. Передача (и прием) данных ведется на определенных фиксированных частотах (измеряется в Бод=бит/сек) от 600 до 128 000 Бод. Условием правильной работы порта есть задание одинаковых параметров, как для приемника, так и для передатчика (скорость, количество бит данных, бит четности, количество стоп битов).

Договоримся о формате кадра (настройках UART) для устройств блога:
Скорость передачи – 9600 (это в пределах килобайта в секунду);
Количество бит данных – 8 (наиболее удобно работать);
Бит четности – Even (производится проверка на четность);
Количество стоп-бит – 1;
В сокращенном варианте это выглядит так:
Baud Rate: 9600, 8 Data, 1 Stop, Even Parity

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

Если нужны дополнительные возможности, то полное описание UART есть в datasheet на микроконтроллер – обращайтесь к нему.

Для того чтобы устройство с блога начало работать с Вашим проектом через интерфейс UART нужно:
1 Подключить устройство блога к соответствующим ножкам микроконтроллера.
2 Настроить приемо-передатчик UART Вашего контроллера. Для этого в соответствующие порта ввода/вывода записать определенные значения.
3 Иметь (написать) процедуры приема/передачи сообщений по UART в Вашей программе.

Теперь рассмотрим подробно каждый пункт:


1 СОЕДИНЕНИЕ УСТРОЙСТВ ПОСРЕДСТВОМ UART.

Тут все просто:
— если планируется и прием и передача — устройства соединяются по двум линиям — TX_устройства с RX_проекта и TX _проекта с RX_устройства (здесь и далее под «устройством» я буду понимать устройство с блога, а под «проектом» — Ваш электронный проект);
— если нужен только прием (например принимаются данные с клавиатуры) — TX_устройства с RX_проекта;
— если нужна только передача (например передаются данные на устройство отображения) — TX _проекта с RX_устройства.


2 НАСТРОЙКА ПРИЕМО-ПЕРЕДАТЧИКА UART.

Как мы договорились выше, формат кадра для наших устройств:
Baud Rate: 9600, 8 Data, 1 Stop, Even Parity
Для работы в с этим форматом кадра нужно в разделе инициализации устройств в Вашей программе, записать соответствующие значения в нужные порта ввода/вывода контроллера. Для этого нужно открыть раздел USART datasheet’а на Ваш микроконтроллер и выбрать/вычислить необходимые значения. Но можно сделать все гораздо проще – использовать автоматические настройщики периферии – CodeWisard’ы.
Возьмем для примера микроконтроллер Attiny2313 (по аналогии можно настроить любой микроконтроллер) и настроим UART в разных языках программирования.

Для начала — Algorithm Builder .
Тут все предельно просто – создаем проект (Файл/Новый ). Выбираем микроконтроллер и частоту задающего генератора в Опции/Опции проекта… (ATtiny2313, внутренний задающий генератор на 8МГц). В панели инструментов жмем кнопочку «S» — настройщик управляющих регистров» выбираем USART и в открывшемся окошке заполняем все как на картинке. Там все подписано и понятно.


Жмем «ОК» . Готово – UART проинициализирован и готов к работе.
Если нужен только приемник или только передатчик ставим только нужную галочку – незадействованную ножку можно использовать как порт ввода-вывода.

Так как в программе будут разрешены прерывания, нужно перед инициализацией USART установить указатель стека на конец памяти («S» /Stack Pointer SP ) и озаглавить вершину блока ключевым словом «Reset ».


В ассемблере. Честно говоря, я не знаю, есть ли в асемблерах для AVR настройщики периферии, но даже если нет, простое решение использовать все тот же Algorithm Builder. В окошке настройки USART, в правой части, прописаны мнемокоманды (Operations), обеспечивающие выбранные характеристики. Перевести их в ассемблерный код не составит труда.

Переводим в ассемблерные команды.

;USART initialization ;Communication Parameters: 8 Data, 1 Stop, Even Parity ;USART Receiver: On ;USART Transmitter: On ;USART Mode: Asynchronous ;USART Baud Rate: 9600 uart_init: LDI R16, $ 00 OUT UBRRH, R16 LDI R16, $ 33 OUT UBRRL, R16 LDI R16, $ 26 OUT UCSRC, R16 LDI R16, $ 00 OUT UCSRA, R16 LDI R16, $ 98 OUT UCSRB, R16

;USART initialization ;Communication Parameters: 8 Data, 1 Stop, Even Parity ;USART Receiver: On ;USART Transmitter: On ;USART Mode: Asynchronous ;USART Baud Rate: 9600 uart_init: LDI R16, $00 OUT UBRRH,R16 LDI R16, $33 OUT UBRRL,R16 LDI R16,$26 OUT UCSRC, R16 LDI R16,$00 OUT UCSRA, R16 LDI R16,$98 OUT UCSRB, R16

CodeVision содержит свой настройщик периферии (CodeWisard), еще похлеще чем у Algorithm Builder’а. Для генерации настроек UART, нажимаем на значок шестеренку (CodeWisardAVR ) на панели инструментов. В открывшемся окошке сначала выбираем вкладку Chip в ней выбираем микроконтроллер и устанавливаем частоту, с которой будет работать задающий генератор. Далее выбираем и заполняем вкладку USART в соответствии с нужными характеристиками (если нужен только приемник или только передатчик ставим соответствующую галочку).

// USART initialization // Communication Parameters: // 8 Data, 1 Stop, Even Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA= 0x00 ; UCSRB= 0x98 ; UCSRC= 0x26 ; UBRRH= 0x00 ; UBRRL= 0x33 ;

// USART initialization // Communication Parameters: // 8 Data, 1 Stop, Even Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x26; UBRRH=0x00; UBRRL=0x33;

Сохраняем сгенерированный проект (File\Generate, Save and Exit ) — готово. Создан проект со всеми нужными установками для UART. В проекте инициализируется и другая периферия (зачастую не нужная). После создания проекта его можно подкорректировать – удалить все не нужное.


3 СОЗДАНИЕ ПРОЦЕДУР ОБРАБОТКИ СООБЩЕНИЙ UART.

Небольшое отступление.
Работу с UART можно организовать различными способами. Например:
— просто ожидать в теле программы когда придет сообщение, постоянно проверяя бит приема сообщения;
— разрешить прерывание и в теле прерывания обрабатывать сообщение;
— создать буфер куда по прерываниям будут загоняться сообщения, а уже в теле программы, «по свободе», считывать из буфера значения;
— еще куча вариантов – выбор за Вами.
Но , исходя из того, что сообщения от устройств, в большинстве своем, единичные (один байт) и не слишком часты (взять, к примеру, клавиатуру – пару нажатий в секунду, не больше), наилучшим вариантом, в плане экономии памяти и скорости обработки, будет обработка сообщения UART в теле прерывания. Под обработкой я понимаю чтение регистров, проверка на правильность приема и сохранение принятого байта в глобальной переменной (своего рода буфер в один байт). Если предполагаются несложные манипуляции с принятым байтом можно их тоже организовать в теле прерывания.

В дальнейшем я буду ориентироваться на такой алгоритм работы, если другой не будет более оправданным.

Algorithm Builder.
Прием данных осуществляется в процедуре обработки прерывания по окончании приема байта (кадра). Принятый байт записывается в глобальную переменную FromGCnDevice. В теле программы проверяется значение FromGCnDevice ели оно нулевое ничего не принято.

Если работа с принятым значением несложна можно это сделать прямо в теле обработки прерывания.
Передача данных производиться без использования прерываний и буфера (аппаратно у UART передатчика существует буфер на 2 байта). Это значит, что комфортно будут передаваться только единичные байты (что мы и планируем делать). Если зарядить сразу строку данных, то микроконтроллер будет заниматься только этой строкой.

Ассемблер.
Прием байта осуществляется в прерывании, результат остается в регистре r17 (если нужно сохраните в SRAM).

;Обработка прерывания по окончании приема байта PUSH R16 IN R16, SREG PUSH R16 IN R16, UCSRA ;Читаем статус из UCSRA IN R17, UDR ;Читаем данные из UDR ANDI R16, $ 1C BREQ _END ;Проверяем на ошибки CLR R17 _END: ;в R17 находится принятый байт POP R16 OUT SREG, R16 POP R16 RETI

;Обработка прерывания по окончании приема байта PUSH R16 IN R16,SREG PUSH R16 IN R16,UCSRA ;Читаем статус из UCSRA IN R17,UDR ;Читаем данные из UDR ANDI R16,$1C BREQ _END ;Проверяем на ошибки CLR R17 _END: ;в R17 находится принятый байт POP R16 OUT SREG,R16 POP R16 RETI

Передача байта

LDI R16,значение SBIS UCSRA,UDRE RJMP PC-1 ; ждем готовности принять байт OUT UDR, R16 ; шлем байт


С — в программе CodeVisionAVR .
Тут все просто CodeWizard вместе с инициализацией UART создает и процедуры для приема-передачи. Единственно что можно тут поковырять так это выкинуть буфер для приема (если разрешить прерывания по приему или передаче автоматически создается буфер). Если этот буфер не нужен процедура обработки прерывания приема байта и процедура передачи могут выглядеть так:

// Глобальная переменная - полученные даные от устройства // Эсли FromGCnDevice==0 - ничего не получено char FromGCnDevice; // Обработка прерывания окончания приема байта interrupt [ USART_RXC] void usart_rx_isr(void ) { char status; // Получаем байт статуса и данных status= UCSRA; FromGCnDevice= UDR; // Если произошла ошибка при приеме байта то FromGCnDevice=0 if ((status & amp; (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN) ) != 0 ) FromGCnDevice= 0 ; } // Процедура передачи байта void ToGCnDevice (char c) { // Ждем окончания передачи предідущего байта while ((UCSRA & amp; DATA_REGISTER_EMPTY) == 0 ) ; // Передаем байт UDR= c; }

// Глобальная переменная - полученные даные от устройства // Эсли FromGCnDevice==0 - ничего не получено char FromGCnDevice; // Обработка прерывания окончания приема байта interrupt void usart_rx_isr(void) { char status; // Получаем байт статуса и данных status=UCSRA; FromGCnDevice=UDR; // Если произошла ошибка при приеме байта то FromGCnDevice=0 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))!=0)FromGCnDevice=0; } // Процедура передачи байта void ToGCnDevice (char c) { // Ждем окончания передачи предідущего байта while ((UCSRA & DATA_REGISTER_EMPTY)==0); // Передаем байт UDR=c; }


Во и все про UART. Этого должно хватить для того чтобы подключить устройство к Вашему проекту. По анологии приведенных примеров легко все можно проделать и для других микроконтроллеров АВР.
Ниже оставляю архивы программ с примерами работы UART для ATtiny2313.
- Пример проекта созданного автоматически CodeWisionsAVR
- Пример программы для работы с UART в Algorithm Builder


P.S. Я слабо знаю С и Asm, поэтому пинать и кидать тапками — разрешается! Мы все учимся.


Инициализируется

(Visited 10 796 times, 2 visits today)

» я описывал, что значит последовательный универсальный порт и какова его логика работы. Я заметил, что многие путают понятия UART , RS-232 , COM и т.п. В данном посте я хочу немного прояснить ясность.



UART описывает логику работу , здесь логическая 1-а подразумевается как высокий уровень сигнала , а логический 0-ль, как низкий уровень сигнала . Физически…, что такое низкий и высокий уровень сигнала зависит от технологии на которой построена микросхема TTL , CMOS и т.д.

Т.к. большинство микросхем являются TTL , то, под логической единицей и нулем в UART понимается и +5В , как было сказано ранее. Но для передачи данных на расстояние , т.е. вне платы, использовать такие уровни уже нельзя, из-за плохой помехозащищенности . Поэтому, были разработаны следующие физические уровни UART:

  • RS-232 (он же COM порт);
  • RS-422
  • RS-423 (используется для автоматизации в промышленности);
  • RS-485 (используется для автоматизации в промышленности);
  • IrDA (UART с использованием инфракрасного диапазона световых волн, по другому ИК порт)

RS-232 ранее применялся в домашних компьютерах под именем COM порт и служил для подключения мышек, модемов, принтеров . Можно сказать — это самый распространенный из физических уровней UART . Название строится из словосочетания «Recommended Standard 232 «, стандарт был разработан «Ассоциацией электронной промышленности (EIA) » в далеком 1962 году.

Стандарт со временем развивался:

  • RS-232C (1968 г.);
  • EIA-232D (1987 г.) — с 1986 года EIA вместо RS стала использовать аббревиатуру EIA;
  • TIA/EIA 232-E (1991);
  • ANSI/TIA/EIA-232-F (1997 г.).

На самом деле, когда говорят о RS-232 имеют как правило, какой нибудь из этих стандартов .

RS-232 был настолько успешен , что на его основе были созданы идентичные как отечественные так и зарубежные стандарты:

  • (2000 г.);
  • (1993 г.);
  • ГОСТ 18145-81
  • ГОСТ Р 50668-94

и т.д. Вся фишка в том, что бесплатно скачать стандарты серии 232 не возможно…, вы можете найти только вышеуказанные стандарты и использовать их как первоисточник для изучения RS-232 и UART .

(если вам все-таки понадобятся оригинальные стандарты, купить их можно можно на сайте TIA (ассоциация телекоммуникационной промышленности США))

В качестве разъема для RS-232 используется 25-и пиновые и 9-и пиновые разъёмы типа D-sub , которые имеют сокращенную запись DB25 и DB9 (иногда называемая CANNON 25 и CANNON 9 ).

Больше прижились разъемы DB9 .

Зачем столько контактов, если для последовательного универсального порта (UART) достаточно два провода данных TX и RX и провод GND?

Дело в том, что, в стандарте RS-232 помимо вышеуказанных применяются еще и сервисные сигналы, наподобие «готовность терминала «, «запрос на отправку «, «готовность приема » и т.п. Сейчас сервисные сигналы далеко не всегда применяются в оборудование, не исключено что они ограничиваются только TX , RX и GND как в «чистом» UART .

Важно заметить что в RS-232 в качестве уровня логической единицы используется диапазон от -3В до -12В , а логический ноль от +3В до +12 .

(изображение заимствованно из «Гук М. Аппаратные интерфейсы ПК»)

От-3В до +3В , считается зоной неопределенности .

Стандарт RS-232 манипулирует двумя типами оборудования

  • DTE — «оборудования ввода данных», это как привило компьютер
  • DCE — «оконечное оборудование линии связи», это как правило модем/мышь/принтер и т.п.

Для DTE используются разъема типа «папа «, для «DCE » разъемы типа «мама «. Если у вас на компьютере есть COM порт, посмотрите… вы увидите разъем с штырями , т.е. «папа».

Зачем я об этом? Дело в том, что для для соединения устройств с COM портом есть прямой и обратный кабель . Что-бы соединить DTE и DCE (например компьютер и модем) необходимо напрямую соединить все ножки и разъемы, это означает что, ножка отвечающая за передачу данных (RxD ) входит в одноименный разъем (RxD ). Такой соединение называют прямое , а кабель прямой или «модемный «.

Бывают случае когда надо соединить два DTE (например два компьютера), тогда используют обратное соединение , называемое «нуль-модемный » кабель. В этом случае с RxD 1-ого компьютера соединяется с TxD 2-ого и TxD 1-ого с RxD 2-ого .

Если вы хотите поподробнее ознакомиться с RS-232, рекомендую прочесть обзор стандарта на сайте .

Вам будет интересно:

UART - Universal Asynchronous Receiver-Transmitter, или по русски Универсальный Асинхронный Приёмопередатчик - УАПП. Используется для организации связи компьютера с различными цифровыми устройствами в электронике. Интерфейс преобразует передаваемые данные в последовательный код так, чтобы была возможна их передача по одной цифровой линии другому электронному устройству. Прямого описания протокола UART все таки есть, но его косвенное описание можно увидеть в стандартах на широко известные физический протоколы RS-232, RS-422, RS-423, RS-485

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

Главным достоинством параллельной передачи можно считать то, что за один момент посылается сразу группа битов. К тому же внутри микроконтроллера также используется параллельная передача данных, благодаря этому не требуется их дополнительное преобразовании. Но есть и существенные минусы. Главный из них состоит в том, что биты по проводам могут приходить не параллельно и необходимы дополнительные схемотехнические решения для получения точных посылок. Это ограничивает скорость передачи.

При последовательном передаче передаваемые биты данных сначала требуется преобразовать в параллельный код, на это расходуется дополнительное временя. Но зато отпадает необходимость в синхронизации следования битов по каждому отдельному проводу, что в данном случае, увеличивает возможности скоростной передачи данных.

Универсальный Асинхронный Приёмопередатчик - УАПП применяется с начала 60-х годов прошлого века и с тех пор претерпевал серьезные модернизации. Даже в 21 столетии последовательные протоколы UART всё ещё представляют один из основных методов обмена битами между различными цифровыми устройствами на небольшие расстояния.

UART является базой так широко используемого в прошлом . В самом простом виде UART интерфейс представляет собой три провода: передача, приём и земля.


Существенный минус универсального асинхронного приёмопередатчика кроется в том, что нет возможности определить какое из цифровых устройств является ведущим, а какое ведомым (мастер / раб). Обычно, это определяет то кто проектирует схему может назвать этот провод как TX и задать работу устройства, в соответствии с рисунком ниже:


В данном случае микроконтроллер принимает, и передаёт данные. А можно сделать следующим образом:


В соответствие с этой схемой микроконтроллер всегда передаёт (TX) получателю (RX) и наоборот. Какая из двух схем все таки правильная? Оказывается обе, все зависит только от производителя микросхемы и готового цифрового устройства.

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

Если приемник и передатчик находятся на одной печатной плате, тогда уровень сигнала при приеме-передаче практически равен уровню напряжения питания микроконтроллера. Допустим, уровень логической единицы - "1" будет передаваться с потенциалом 3.3В, а ноль, с потенциалом, не более 0,5 Вольта. С передачей сигнала на большие расстояния начинают появляться проблемы в виде искажения сигнала и растет , появляются ошибки передачи, вплоть до полной остановки.

Для того, чтобы исключить такие проблемы в линию передачи и приема добавляют дополнительные буферы, которые усиливают сигнал. После этого их можно передавать на десятки метров без потери информации. Но в д.с для передачи уровня логической единицы применяется напряжение -3В..-15В, а для "0" - +3В до +15В.


Вместо инхронизации в UART применяется, так называемый "стартовый бит" подготавливающий цифровую схему к передачи сообщения. После стартового бита иду данные, а затем в линию посылается "стоп-бит", говорящий о завершении передачи информации. Вместе выходит 10 бит: первый - старт-бит, 8 бит данных, и последний стоп-бит, смотри осциллограмму передачи данных по протоколу UART интерфейса на рисунке ниже.


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

Значение скорости передачи не передаётся вместе с сообщением, то в приёмнике и передатчике должны быть заранее заданы равные скорости. Интерфейс UART допускает до 5% рассинхронизации таймеров. В этом интервале он может получать и принимать верные информационные данные.

Можно сказать со 100% уверенностью, что каждый современный микроконтроллер имеет в своем составе универсальный последовательный интерфейс - UART. Умея работать с этим портом вы можете согласовать работу старых и современных электронных устройств, передать или принять данные в различные электронные устройства.

В современных микроконтроллерах, вместо UART интерфейса используют полностью с ним совместимый стандарт USART (универсальный асинхронный/синхронный приёмопередатчик).

USART это более гибкий в плане настройки UART с дополнительными функциями. В USART можно регулировать длину слова с более большим интервалом (от 5 до 9) чем в UART (от 8 до 9). В USART возможна как синхронная так асинхронная и передача данных (в UART осуществляется только асинхронная). При синхронной передачи помимо двух линий - данных и питания, применяется дополнительная шина (XCK) с синхросигналом. С такой настройкой USART уже пересекается с интерфейсом SPI и его можно применять как «ведущий» в интерфейсе SPI.

Рассмотрим классический случай, когда интерфейс асинхронный (т.е. с отсутствующей линией синхронизации).

Передача данных в UART интерфейсе происходит по одному биту в одинаковые временные промежутки. Этот промежуток задается скоростью UART и для конкретного типа соединения обозначается в бодах, что соответствует количество бит в секунду. В электронике имеется общепринятый ряд типовых скоростей: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400;460800; 921600 бод;

Скорость (S, бод) и длительность бита (T, секунд) связаны между собой общеизвестной формулой

Байт данных отправляются в пакетах (первый бит идет перед байтом данных и второй бит следует после, количество бит опциональны)


Для приема и передачи данных в интерфейсе UART применяются всего две линии данных и земля:

передающая шина данных (TXD или TX);
принимающая линия данных (RXD или RX);
земля (GND).

Уровню логической единицы и нуля аналогичны типовым уровням TTL:

лог. "1" - +5 Вольт;
лог. "0" 0 Вольт.

Разновидность UART - интерфейс RS-485

Сети, построенные на основе интерфейсов RS-485 и RS-422, представляет собой приемопередатчики, подключенные с помощью витой пары. В основе RS-485 лежит принцип дифференциальной (балансной) передачи данных. Основа ее базируется на передаче одного сигнала по двум проводам. Причем по первому проводу (A) интерфейса следует оригинальный сигнал, а по второму - его инверсная копия. Простыми словами, если на А "1", то на В "0" и наоборот, т.е, между двумя проводами витой пары всегда существует разность потенциалов: при "1" уровне она положительная, при "нулевом" - отрицательная.