UART и соединение с ПК

June 27, 2010 by admin Комментировать »

Сначала разберемся в терминах, которые имеют отношение к предмету раз­говора. В компьютерах есть СОМ-порт\ часто кратко называемый портом RS-232. Правильнее сказать так: СОМ-порт передает данные, основываясь на стандарте последовательного интерфейса RS-232. Последний, кроме собственно протокола передачи, стандартизирует также и электрические параметры, и даже всем знакомые разъемы DB-9 и DB-25. UART (Universal Asynchronous Receiver-Transmitter, «универсальный асинхронный приемо­передатчик») есть основная часть любого устройства, поддерживающего RS-232.

Кроме UART, в порт RS-232 (в том числе, в СОМ-порт ПК) входит схема преобразования логических уровней в уровни RS-232, где биты передаются разнополярными уровнями напряжения, притом инвертированными относи­тельно UART. В UART действует положительная логика с обычными логи­ческими уровнями, где логическая единица есть высокий уровень (+3 или +5 В), а логический ноль — низкий уровень (О В). В интерфейсе RS-232 ло­гическая единица передается отрицательным уровнем от -3 до -12 В, а логи­ческий ноль— положительным уровнем от н-З до -1-12 В. Преобразователь уровня в МК, естественно, не входит, так что для стыковки с компьютером придется его изобретать.

Перед тем как обсуждать UART, рассмотрим подробнее, как, собственно, происходит обмен. Идея передачи по этому интерфейсу заключается в пере­даче целого байта по одному проводу в виде последовательных импульсов, каждый из которых может означать О или 1. Если в определенные моменты времени считывать состояние линии, то можно восстановить, что именно бы­ло послано. При этом для приемника и передатчика, связанных между собой тремя проводами («земля» и два сигнальных провода «туда» и «обратно»), приходится задавать скорость передачи и приема, которая должна быть оди­накова для устройств на обоих концах линии. Эти скорости стандартизирова­ны и выбираются из ряда 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 56000, 57600, 115200 (более медленные скорости я опустил)^. Число это обо­значает количество передаваемых/принимаемых бит в секунду.

Проблема состоит в том, что приемник и передатчик — это физически со­вершенно разные системы, и скорости эти для них не могут быть строго оди­наковыми в принципе (из-за разброса параметров тактовых генераторов), и даже если их каким-то образом синхронизировать в начале, то они в любом случае быстро «разъедутся».

Потому в RS-232 передача каждого байта всегда сопровождается начальным (стартовым) битом, который служит для синхронизации. После него идут во­семь (или девять — если используется проверка на четность) информацион­ных битов, а затем стоповые биты, которых может быть один, два и более, но это уже не имеет принципиального значения.

clip_image002

Рис. 21.1. Диаграмма передачи данных по последовательному интерфейсу

RS-232 в формате 8N2

Общая диаграмма передачи таких последовательностей показана на рис. 21.1. Хитрость заключается в том, что состояния линии передачи, называемые стартовый и стоповый бит, имеют разные уровни: стартовый бит передается положительным уровнем напряжения (логическим нулем), а стоповый — от­рицательным (логической единицей), потому фронт стартового бита всегда однозначно распознается.

Подробности

Подавляющую часть времени линия находится в состоянии ожидания, то есть с уровнем логической единицы (отрицательным). Потому выбор уровней стар­тового и стопового бита не был полностью произвольным — такая комбинация уровней имеет важный смьюл со схемотехнической точки зрения. Во-первых, в качестве преобразователя уровня удобно использовать транзистор, который инвертирует сигнал, и тогда специально об этом думать не приходится. Во­вторых, со стороны UART, где логика обратная, стоповый бит должен иметь высокий уровень, что соответствует состоянию запертого транзистора «с от­крытым коллектором» (или «с открытым истоком»). Так как ббльшую часть времени этот выходной транзистор оказывается выключен, то вывод не. по­требляет тока. Фактом, что ббльшую часть времени линия пребывает в со­стоянии с отрицательным напряжением, мы воспользуемся для создания про­стейшего преобразователя уровней.

В момент передачи стартового бита и происходит синхронизация. Приемник отсчитывает время от фронта стартового бита, равное примерно 0,5 периода заданной частоты обмена (чтобы попасть в середину стартового бита), и три раза подряд проверяет состояние линии (оно должно быть логическим ну­лем). Если все три состояния совпали, то принимается решение, что действи­тельно пришел стартовый бит. Тогда восемь (или девять, если это задано за­ранее) раз подряд с заданным периодом регистрируется состояние линии (т. н. процедура восстановления данных). После этого линия переходит в со­стояние стопового бита и может в нем пребывать сколь угодно долго, пока не придет следующий стартовый бит.

Обычный формат данных, по которому работает львиная доля всех уст­ройств, обозначается 8N1, что читается так: 8 информационных бит, по parity, 1 стоповый бит. «No parity» означает, что проверка на четность не производится. На диаграмме рис. 20.1 показана передача некоего произволь­ного кода, а также передача байт, состоящих из всех единиц и из всех нулей в формате (для наглядности) 8N2. Во избежание излишних сложностей коли­чество стоповых битов следует устанавливать всегда одним и тем же и у пе­редатчика, и у приемника.

Из описанного алгоритма работы понятно, что погрешность несовпадения скоростей обмена может быть такой, чтобы фронты не «разъезжались» за время передачи/приема всех десяти-двенадцати бит более чем на полпериода, то есть в принципе фактическая разница частот тактовых импульсов может достигать 4—5%. На практике их стараются все же сделать как можно ближе к стандартным величинам, но это не всегда возможно.

Для работы в обе стороны нужно две линии, которые у каждого приемопере­датчика обозначаются RxD (приемная) и TxD (передающая). В ;саждый мо­мент времени может работать только одна из линий, то есть приемопередат­чик либо передает, либо принимает данные, но не одновременно — это т. н. полудуплексный режим. Так сделано потому, что у UART-микросхем тради­ционно один регистр и на прием и на передачу. Для AVR на самом деле это не так— UART может одновременно принимать и передавать данные. Но адрес регистра данных для приема и передачи один и тот же, потому со сто­роны выглядит, как будто регистры приема и передачи есть один регистр (в самых первых микросхемах UART это действительно так и было). Отметим, что специально устанавливать состояния выводов порта (на вход или на вы­ход), которые используются, как TxD и RxD, не требуется: как только вы «заведете» UART, они будут автоматически сконфигурированы как надо. Ра­зумеется, их не рекомендуется задействовать еще для каких-то функций.

В AVR семейства Tiny (кроме модели 2313, которая все же, если позволи­тельно так выразиться, «не совсем» Tiny) UART отсутствует, а в большинст­ве остальных моделей этот порт наличествует в виде более функционального USART («синхронно-асинхронного»), в некоторых моделях их даже несколь­ко. USART полностью совместим с UART (кроме наименований некоторых регистров), и его отличия от UART рейчас для нас несущественны.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты