//

Мысли (Автор: dez)

Допустим, мы делаем первый образец очередной своей поделки на микроконтроллере или гоняем новую отладочную плату. Какую периферию МК мы будем заводить в первую очередь? Скорее всего это будет UART, потому что сложно придумать более простой способ подключить свой девайс к компу. Вывести в терминал показания датчиков или послать команду через COM-порт - обычное явление в нашем деле. Но этот интерфейс полезен не только для отладки - через него можно общаться с некоторыми дисплеями и модемами, или перепрошивать МК (при наличии соответствующего загрузчика). Если какой-то девайс поддерживает MIDI или Modbus, почти наверняка здесь тоже замешан UART.

Из этой заметки я собираюсь сделать памятку по всяким вещам, связанным с UART и COM-портом. Хочется верить, что она много для кого окажется полезной, включая меня самого :) Ведь раз уж мне приходится периодически лезть в интернет за инфой вроде распиновки DE-9, есть смысл попробовать складывать подсказки в одно место. Отсюда следует, что содержимое поста может через какое-то время дополниться.

 

Основы

Начнём с формальностей и разберёмся в смысле этих четырёх букв. Акроним UART означает Universal Asynchronous Receiver-Transmitter, что на русский переводят как Универсальный Асинхронный Приёмопередатчик. Слово "асинхронный" здесь означает тот факт, что приёмник не синхронизируется с передатчиком каким-то общим тактовым сигналом, то есть посылка данных не сопровождается посылкой тактовых импульсов (в отличие от SPI, например). В даташитах микроконтроллеров эта периферия иногда называется USART. В таком случае дополнительная буква S означает Синхронный и при определённых настройках эта периферия всё-таки будет использовать дополнительную линию для тактирования. На некоторых контроллерах USART может даже работать как полноценный SPI. Но чаще всего синхронный режим нам не нужен.

В состоянии простоя (idle) на линии передачи поддерживается уровень логической единицы. Признаком начала передачи служит старт-бит, равный нулю. Дальше идут данные: первым всегда передаётся младший бит (LSB)! После данных может идти (а может и не идти) бит паритета. В конце всегда идёт стоп-бит, имеющий уровень единицы - тот же уровень, что и в состоянии простоя.

uart time diagram формат посылки

Благодаря наличию старт-бита приёмник может обнаружить входящие данные даже если они сплошняком состоят из единиц (0xFF), т.е. сливаются со стоп-битом и состоянием простоя. А ещё можно постоянно посылать 0x55 и получить на осциллографе ровный меандр: старт и стоп в этот меандр хорошо вписываются (если 1 стоп и нет паритета) - бывает полезно при диагностике неполадок.

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

В формате посылки можно настраивать практически всё, кроме старт-бита. Количество бит данных может быть от 5 до 9 бит. Бит паритета, он же бит чётности, либо отсутствует (None), либо может вычисляться так, чтобы количество единиц во всей посылке (т.е. данные + бит чётности) стало чётным (Even) или нечётным (Odd). Например, если паритет Even, то для посылки 10010100 бит паритета будет равен 1. Даже стоп-бит настраивается - его длительность может быть равна длительности передачи 1, 2 или даже 1.5 бита.

Скорость передачи UART иногда называют baudrate и измеряется она в бодах - количестве изменений сигнала в секунду (если выражаться по-простому). Из определения бода вытекает важный нюанс - скорость передачи полезной информации для UART будет меньше, чем указаный бодрейт. Потому что кроме информации надо передавать всякие сопутствующие штуки, которые нужны для правильной работы интерфейса, т.е. старт-бит, стоп-бит и бит чётности. Список стандартных скоростей включает в себя следующие (но не ограничивается ими): 300, 1200, 4800, 9600, 19200, 38400, 115200 бод. Наиболее часто на практике будут встречаться 9600 и 115200.
Формат передачи в UART иногда записывают кратко, например 9600-8N1. Здесь 9600 - это скорость, 8 бит в посылке, нет контроля чётности (N), 1 стоп-бит.

Для справки добавляю сюда таблицу временных характеристик сигнала для разных скоростей (при формате 8N1) - чтоб проще было по осциллографу скорость вычислить или ещё чего.

baudrate

Длительность бита (мкс)

Скорость (байт/c)

Реальная скорость Длительность байта (мкс)
300 3333.33 37.5 30 33333.33
1200 833.33 150 120 8333.33
2400 416.67 300 240 4166.67
4800 208.33 600 480 2083.33
9600 104.17 1200 960 1041.67
14400 69.44 1800 1440 694.44
19200 52.08 2400 1920 520.83
38400 26.04 4800 3840 260.42
56000 17.86 7000 5600 178.57
115200 8.68 14400 11520 86.81

 

Физическое соединение

По сути периферия UART в микроконтроллере выполняет работу канального уровня (второго) модели OSI. Не, ну в принципе можно и просто соединяться к ножкам RX/TX контроллера как есть, и тогда два устройства будут общаться на напряжениях логических уровней. Обычно это называют UART TTL, и если вы соединяетесь с вашей поделкой через переходник USB-UART на базе какого-нибудь CH340, то это скорее всего оно. Впрочем, есть и другие стандарты, описывающие физический уровень. Самые распространённые из них - RS-232 и RS-485.

Стандарт RS-485 применяется в промышленных сетях, поскольку в нём используется дифференциальный сигнал, который гоняют по витой паре. Это даёт помехоустойчивость и позволяет иметь связь на довольно большом расстоянии (длина сегмента до 1200 метров). Фактически это основной физический уровень для систем, работающих по протоколу Modbus over Serial Line. Стандарт RS-485 определяет электрические характеристики, но при этом не касается темы разъёмов и кабелей.

Стандарт RS-232 (или EIA232) будет, так сказать, поближе к повседневности. COM-порт обычного ПК - это одна из вещей, которую этот стандарт затрагивает. Раньше RS-232 широко применялся для подключения dial-up модемов. Сейчас же в быту обычного человека COM-порт практически не используется, но всякое специализированное оборудование (в том числе новое) всё ещё может использовать RS232, так что некоторые вещи про него знать полезно.

Прежде всего об уровнях. Сигнал в RS232 инвертированый и двухполярный. Напряжение от -3 до +3 В попадает в переходную зону (Transition Region) и не воспринимается приёмником. Логическая единица обычно передаётся напряжением от -3 до -12 В вольт (минус!), логический ноль - от +3 до +12 В. Стандарт допускает размах побольше, там говорится про ± 25 В.

UART RS232 time diagram

С такими уровнями сигналов нельзя просто взять и подключить RX/TX микроконтроллера к ПК, нужен преобразователь уровней. Скорее всего это будет микросхема типа MAX232, ADM202 или что-то из множества их клонов. Среди китайских вариантов есть TPT3232. Все эти микросхемы имеют с своём составе умножитель и инвертор напряжения, работающие по принципу зарядового насоса (charge pump). То есть достаточно подать на них питание цифровой части (3.3 или 5 В), подцепить конденсаторы к нужным ножкам - и всё, микросхема готова раскачать ваш TX до ±10 В.

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

ADM232 typical схема подключения

В качестве разъёмов по стандарту RS232 полагается использовать разъемы D-Sub на 25 или 9 контактов: DB25 или DE9. Разъём DE9 часто называют DB9 (по аналогии с DB25) - и я так делаю, и даже некоторые магазины продают его под таким названием, хотя это неправильно. Вторая буква в названии разъема обозначает размер экрана (внешняя часть разъёма, похожая на букву D).

Оборудование в стандарте делится на DTE (Data Terminal Equipment) и DCE (Data Circuit-terminating Equipment). К первому типу относятся компьютер или другие "главные" устройства - на них ставят разъём "папа" (male). К устройствам второго типа относят модемы и всякую периферию - там следует ставить разъёмы "мама" (female). На картинке изображён первый случай (DTE, male connector).

RS232 DE9 pinout цоколёвка

Цоколёвка разъёма DE9 для компьютера (или другого DTE) показана на картинке выше. Обычно меня интересуют выводы данных (TXD и RXD, пины 2 и 3) и сигнальная земля (пин 5) - таков состав минимального кабеля, соединяющего мои девайсы с реальным COM-портом ПК. Остальные линии опциональны - они задуманы для сигнализации состояния устройств и контроля потока данных, но вообще они управляются софтом и могут быть адаптированы под свои цели. Для обычного общения со своим устройством через монитор порта (терминал) дополнительные линии вам вряд ли понадобятся. А вот при прошивке МК через загрузчик (bootloader) они могут использоваться для сброса МК или переключения интерфейса прошивки. Например, в Arduino нога RESET микроконтроллера соединяется с DTR через конденсатор, а для ARM можно придумать что-то с ногами BOOT0/1 (естественно, уровни RS232 дожны быть при этом преобразованы в понятные МК).

Для DB25 полную цоколёвку приводить пока не буду, но поскольку этот разъём мне всё равно пару раз попадался, пусть здесь будет хотя бы таблица соответствия пинов DB25 и DE9.

№ контакта Обозначение Расшифровка Тип вывода

DE9

DB25

3 2 TXD Transmit Data OUT
2 3 RXD Receive Data IN
7 4 RTS Request to Send OUT
8 5 CTS Clear to Send IN
6 6 DSR Data Set Ready IN
4 20 DTR Data Terminal Ready OUT
1 8 DCD Carrier Detect IN
9 22 RI Ring Indicator IN
5 7 SG (GND) Signal Ground -

 

Стандартные кабели в RS232 (то есть прям D-Sub с обеих сторон, а не просто отладочный переходничок под штыри) собираются по разным схемам. Тут всё зависит разъёмов и от выбранных коннекторов и от назначения. По назначению можно выделить 2 основные группы - прямые кабели (для модемов и прочей периферии) и нуль-модемные (для связи между двумя ПК). Соединения в них будут отличаться, потому что в периферийных устройствах (DCE) сама цоколёвка разъёма уже "перетасована", чтобы соответствующие входы и выходы нашли друг друга - в итоге в кабеле просто соединяются пины с одинаковыми номерами. Для двух ПК или других DTE устройств придётся паять пары выводов крест-накрест, чтобы TXD пришёл в RXD, RTS нашёл свой CTS и так далее. С нуль-модемным кабелем можно будет поиграть в DOOM на винтажном железе :) Или симулировать общение устройств при отладке какой-нибудь программы.

На этом пока всё, может потом ещё чего добавлю по мере столкновения со всякими ситуациями. Следите за развитием событий :D

Статья опубликована 2024-12-03 16:45:31, её прочитали 290 раз(а).

Внимание! Комментарии публикуются после проверки (что занимает некоторое время).
Сообщение может быть отклонено, если содержит спам, противозаконный контент, а так же оскорбления и грубость по отношению к другим участникам обсуждения.

Добавить комментарий