Порты передачи данных
Порты ввода-вывода преимущественно используются для управления про-тыми
внешними устройствами: если бит установлен, мотор крутится (заслонка открыта,
нагреватель включен и т. д.), и наоборот. Если же уст-оойство более сложное,
и работа с ним предполагает обмен последовательностями команд и ответов,
или просто большими объемами данных, простой порт оказывается не очень
удобен.
Основная проблема при использовании простого порта в качестве средства
обмена данными состоит в том, что принимающему устройству необходимо знать,
выставило ли передающее устройство на своих выходах новую порцию данных,
или еще нет. Три основных подхода к решению этой проблемы называются синхронной,
асинхронной и изохронной передачами данных.
При синхронной передаче мы либо предоставляем
дополнительный сигнал, строб (рис. 9.6), либо
тем или иным способом передаем синхросигналы по тем же проводам, что и
данные. Например, можно установить, что каждая следующая порция данных
должна хотя бы одним битом отличаться от предыдущей. При этом необходимо
предусмотреть протокол, посредством которого передатчик будет кодировать,
а приемник декодировать повторяющиеся последовательности символов. Например,
второй символ из пары одинаковых последовательных символов можно заменять
на специальный символ повторения, впрочем, в этом случае нам необходимо
предусмотреть и способ кодирования символа, совпадающего по значению с
символом повторения. Реальные способы совмещения кодирующих и синхронизующих
сигналов в одном проводе относительно сложны и их детальное обсуждение
было бы более уместно в книге, посвященной сетевым технологиям. Некоторые
простые способы кодирования с таким совмещением мы рассмотрим в разд.
Запоминающие устройства прямого доступа.
Рис. 9.6. Временная диаграмма стробируемого порта
Передача стробирующего сигнала требует прокладки дополнительных проводов,
но с реализационной точки зрения гораздо проще совмещения синхросигнала
и данных и поэтому широко применяется в самых разнообразных ситуациях.
Большинство стробируемых портов асимметричны: одно из устройств, ведущий
(master — хозяин), генерирует стробовый сигнал, а второе ведомый
(slave — раб), пользуется этим сигналом для приема или передачи.
Нередко вместо одиночного строба используется несколько различных сиг
налов — например, один сигнал выставляется передатчиком и сообщает чт
следующая порция данных готова, а второй сигнал — приемником и сооб шает,
что приемник принял эти данные и готов принять следующие Дополнительные
сигналы могут также решать вопрос о том, какое из устройств в данном цикле
будет приемником, а какое — передатчиком.
При асинхронном обмене данными передающее
устройство посылает специальный стартовый символ, сигнализирующий о том,
что сейчас пойдут данные, и с фиксированным интервалом выставляет на своих
выходах символы данных. Передаваемый за один прием блок данных обычно
невелик по объему — ведь необходимо считаться с опасностью того, что часы
приемника и передатчика, посредством которых они отмеряют интервал между
последовательными порциями данных, недостаточно точны и могут разойтись.
Обычно блок данных состоит из фиксированного количества символов и называется
кадром или фреймом (frame).
Кадр обычно завершается одним или несколькими стоповыми символами. Не
обнаружив этих символов (или обнаружив на месте этих символов неверные
значения), приемник может понять, что его часы все-таки разошлись с часами
передатчика.
Асинхронная передача позволяет сэкономить на проводах (не требуется стробирующих
сигналов) и при этом избежать сложных способов кодирования, характерных
для совмещенной синхронной передачи, однако стартовые и стоповые символы
составляют значительную часть потока передаваемых данных и создают ощутимые
накладные расходы.
Кроме того, при передаче большого объема данных в виде плотно следующих
друг за другом кадров велика опасность, что приемник потеряет заголовок
очередного кадра и не сможет восстановить структуру потока, поэтому многие
асинхронные протоколы требуют паузы между последовательными кадрами.
Асинхронная передача данных удобна в ситуациях, когда объем передаваемых
данных невелик, а потребность в их передаче возникает в труднопредсказуемые
моменты. Обычно асинхронные порты работают на небольших скоростях, не
более нескольких килобит в секунду.
Изохронная передача данных по идее напоминает
асинхронную, с тем лишь отличием, что при обмене данными приемник и передатчик
пользуются вы-сокостабильными, но независимыми — при использовании одного
тактового генератора получится синхронная передача — тактовыми генераторами,
и благодаря этому могут обмениваться кадрами большого размера. В идеале,
изохронная передача сочетает преимущества синхронной и асинхронной. но
на практике сложности обеспечения стабильности и калибровки тактовых операторов
достаточно велики и в чистом виде изохронная передача используется очень
редко.
Как синхронные, так и асинхронные порты бывают следующих типов (рис. 9.7):
- симплексные (simplex —
передавать данные может только одно устройство);
- полудуплексные (half-duplex
— оба устройства могут принимать и передавать данные, но не способны
делать это одновременно, например, потому, что прием и передача идут
по одному проводу);
- полнодуплексные (full-duplex)
или просто дуплексные (оба устройства способны одновременно передавать
и принимать данные, чаще всего -по различным проводам).
Рис. 9.7. Симплексные, полудуплексные и полнодуплексные
порты
Еще одна практически важная классификация портов передачи данных -это
деление их на последовательные и параллельные порты (рис. 9.8).
Последовательный порт состоит из одного провода, по которому, как следует
из названия, последовательно передаются биты данных, а также, возможно,
синхронизационные или стартовые и стоповые биты. Параллельный порт имеет
несколько линий передачи данных, обычно 8 (чтобы можно было передать за
один прием один байт), а иногда и больше.
правило, последовательные порты — асинхронные или синхронные с совмещенной
передачей синхросигнала, но исключения из этого правила — стробируемые
последовательные порты — также нередки. Напротив, если уж мы проложили
восемь проводов для данных, то экономить на девятом — синхронизующем проводе
— было бы совсем уж глупо, поэтому подавляющee большинство практически
используемых параллельных портов — синхронные стробируемые.
Рис. 9.8. Последовательные и параллельные порты
Порт RS232
Протокол последовательного асинхронного обмена RS5232/ССIТТ V24 широко
применяется для подключения к компьютеру алфавитно-цифровых терминалов,
низкоскоростных печатающих устройств, позиционных устройств ввода (мышей,
планшетов), низкоскоростного телекоммуникационного оборудования и т.д.,
а иногда и для соединения компьютеров между собой, например, если более
скоростное сетевое оборудование отсутствует или не может быть использовано.
Такие порты используются для передачи данных за пределы корпуса компьютера,
поэтому кроме линии передачи данных предусмотрен также провод, передающий
опорное нулевое напряжение, Вместо TTL-совместимых напряжений, RS232 использует
в качестве 1 напряжения в диапазоне от -25 до -3 В, а в качестве 0 — соответственно,
в диапазоне от +3 до +25 В (рис. 9.9).
RS232 предполагает двусторонний обмен данными. Для этой цели предусмотрено
две линии данных — для приема и для передачи, обозначаемые ТХ и RX-В соответствии
со стандартом, устройства делятся на два типа: "компьютеры и "терминалы".
Различие между ними состоит в том, что "компьютер" передает
данные по линии ТХ, а получает по линии RX, а "терминал" — наоборот.
Для соединения двух "компьютеров" необходим специальный, так
называемый нуль-модемный кабель, в котором провода ТХ и RX перекрещены.
Любопытно, что стандартные порты IBM PC являются "терминалами",
а не "компьютерами".
Рис. 9.9. Диаграмма напряжений RS232
Обмен данными осуществляется кадрами, состоящими из стартового
бита, семи или восьми битов данных (младший бит передается первым), возможно
— контрольного бита четности (см. разд. Контрольные
суммы), и одного или двух стоповых битов. Игнорируя ошибки четности
или вообще не проверяя четность, можно использовать этот бит для передачи
данных, и получить, таким образом, девять битов данных в одном кадре.
Минимальная скорость передачи составляет 300 бит/с, последующие допустимые
скорости получаются удвоением предыдущей— 600 бит/с, 1200, 2400 и т.д.
Современные реализации RS232 поддерживают скорости 115 200 бит/с и более.
Скорость и вариации формата кадра определяются настройками приемника и
передатчика. Необходимо, чтобы у соединенных портом устройств эти настройки
совпадали, однако протокол сам по себе не предоставляет средств для их
согласования.
Кроме линий приема, передачи, нуля и питания спецификация RS232 предусматривает
ряд дополнительных сигналов, в просторечии называемых модемными линиями—
признак несущей, разрешение передачи данных (очисткой этого сигнала приемник
может сигнализировать передатчику, что он не успевает обрабатывать поступающие
данные) и др. Эти сигналы не должны обязательно поддерживаться всеми устройствами
и используются, главным образом, акустическими модемами, откуда и происходит
название. Полная спецификация при использовании 25-контактного разъема
предусматривает также возможность синхронной передачи данных с отдельными
стробирующими сигналами, но основная масса реализаций RS232 этого не поддерживает.
Протокол RS232 весьма прост и легко может быть реализован программными
средствами с использованием двух бит порта ввода-вывода (пример 9.1) —
впрочем, в этом случае потребуется еще внешняя микросхема приемопередатчика,
преобразующая TTL-совместимые напряжения в диапазон напряжений RS232.
Однако использующие этот протокол, применяются очень широко, и многие
модели микроконтроллеров и практически все комплекты вспомогательных микросхем
для микропроцессоров предлагают аппаратные реализации этого стандарта.
Пример 9.1. Программная имитация Р5232-совместимого
последовательного порта, цит. по [www.atmel.com AVR305]
;**** APPLICATIONNOTEAVR305 ************************ .
*
;* Название : Полудуплексный программный UART
;* Версия : 1.20
;* Последнее обновление : 97.08.27
;* Целевое устройство : Все микроконтроллеры AVR . *
;* Адрес поддержки : avr@atmel.com . *
;* Размер кода : 32 слова
;* Мин. Регистров : О
;* Макс. Регистров : 4 .
;* Прерывания : Не используются
;* Описание
;* Этот пример содержит эффективный с точки зрения объема кода программный
UART.
;* Программа-пример получает один символ и передает его назад.
.include "1200def.inc" .***** определения контактов
.equ RxD =0 /Контакт приема PDO .equ TxD =1 ;Контакт передачи PD1
.*****
Глобальные регистровые переменные
.def bitcnt =R16 ;счетчик битов
.def temp =R17 промежуточный регистр
.def Txbyte =R18 ;Передаваемые данные
def Rxbyte =.<19 /Полученные данные .cseg
.org
0
* "putchar" *
* Эта подпрограмма передает байт из регистра "Txbyte"
* Количество стоповых битов определяется константой sb *
* Количество слов :14 включая возврат
* Количество циклов :Зависит от частоты передачи
* Мин. Регистров :Нет
* Макс. Регистров :2 (bitcnt,Txbyte)
* Указатели :Не используются
.equ sb =1 ;Кол-во стоповых битов (1, 2, ...)
putchar: Idi bitcnt,9+sb ;1+8+sb com Txbyte ;Инвертировать все sec ;Стартовый
бит
putcharO: brcc putchar1 ;Если перенос установлен cbi PORTD,TxD ; передать
'О' rjmp putchar2 ;иначе
putcharl: sbi PORTD,TxD ; передать '!' пор
Putchar2: rcall UART_delay /Задержка в один бит real! UART_delay
Isr Txbyte /Получить следующий бит dec bitcnt /Если не все биты переданы
brne putcharO ; послать следующий ;иначе
.Leu ; возврат
* "getchar"
?
* Эта подпрограмма получает один байт и возвращает его в "Rxbyte"
*
* Кол-во слов :14 включая возврат
* Кол-во циклов :Зависит от скорости приема
* Мин. Регистров :Нет
* Макс. Регистров :2 (bitcnt,Rxbyte)
* Указатели :Не используются
getchar: Idi bitcnt,9 ;8 бит данных + 1 столовый
*
getcharl: sbic PIND,RxD ;Ждать стартового бита rjmp getcharl
rcall UART_delay ;задержка в 0.5 бита
getchar2: rcall UART_delay /задержка в один бит rcall UART__delay
clc /очистить перенос
sbic PIND,RxD ;если вход RX = 1
sec
dec bitcnt ;Если бит столовый breq getcharS ; возврат
/иначе
ror Rxbyte ; сдвинуть бит в Rxbyte rjmp getchar2 ; получить следующий
getcharS: ret
I "UART_delay"
*
I Эта подпрограмма задержки генерирует требуемую задержку между битами
* при передаче и приеме байтов. Полное время исполнения определяется I
константой "Ь":
*3*Ь + 7 cycles (включая rcall и ret)
*
f Кол-во слов :4 включая возврат
* Мин. Регистров :Нет
* Макс. Регистров :1 (temp)
* Указатели :Не используются
Допустимые значения Ь:
1 MHz crystal: 9600 bps - b=14 19200 bps - b=5 28800 bps - b=2
2 MHz crystal: 19200 bps - b=14 28800 bps - b=8 57600 bps - b=2
4 MHz crystal: 19200 bps - b=31 28800 bps - b=19 57600 bps - b=8 115200
bps - b=2
•equ ь =31 ;19200 bps @ 4 MHz crystal
UART_delay: Idi temp,b uART_delayl: dec temp Brne UART delayl
ret
;***** Исполнение программы начинается здесь ;***** Тестовая программа
reset: sbi PORTD,TxD ;Установить контакты порта sbi DDRD,TxD
Idi Txbyte,12 /Очистить терминал rcall putchar
forever: rcall getchar mov Txbyte,Rxbyte
rcall putchar ;Воспроизвести полученный символ
rjmp forever
USART микроконтроллера PIC
В качестве примера аппаратной реализации последовательного порта, которую,
помимо других вариантов использования, мЪжно применить и для реализации
RS232, давайте рассмотрим устройство USART (Universal Synchronous Asynchronous
Receiver Transmitter), включенное в состав ряда моделей микроконтроллеров
PIC фирмы Microchip [www.microchip.com PICMicro].
USART может использоваться либо как полнодуплексный асинхронный порт с
форматом кадра, совместимым с RS232, либо как полудуплексный синхронный
стробируемый порт. Устройство состоит из приемника (receiver), передатчика
(transmitter) и генератора тактовой частоты (baud rate generator) (рис.
9.10).
Рис. 9.10. Структура USART микроконтроллера PIC
Генератор тактовой частоты представляет собой двоичный
счетчик, уменьшаемый на единицу на каждом такте центрального процессора.
Когда счетчик доходит до нуля, генерируется один такт и счетчик инициализируется
исходным значением. Фактически, генератор представляет собой делитель
тактовой частоты процессора в заданном отношении. Документ [www.microchip.com
PICMicro] содержит таблицу, по которой можно рассчитать коэффициент
деления, чтобы из типичных тактовых частот процессора получить (иногда
с определенной ошибкой) стандартные частоты RS232.
Счетчик генератора тактовой частоты программно недоступен, а начальное
значение этого счетчика (оно же коэффициент деления) задается 8-разрядным
регистром SPBRG. USART использует одну и ту
же тактовую частоту и для приемника, и для передатчика. При синхронной
работе в режиме ведомого встроенный генератор тактовой частоты не используется
вообще.
Приемник и передатчик во многом аналогичны по структуре и имеют по два
программно-доступных 8-разрядных регистра. Первый регистр называется регистром
управления и статуса (status and control register), а второй — регистром
данных. Значения битов управляющих регистров приемника и передатчика приведены
в табл. 9.1 и 9.2. И приемник, и передатчик имеют также программно-недоступный
сдвиговый регистр, называемый TSR (Transmit Shift Register) у передатчика
и RSR (Receive Shift Register) у приемника.
При передаче значение регистра данных передатчика помещается в сдвиговый
регистр и возможно расширяется девятым битом, который берется из бита
TX9D управляющего регистра. Значение младшего бита выставляется на выходе
ТХ микроконтроллера. Затем на каждом такте генератора регистр сдвигается
на один бит — в результате получается последовательная передача бит кадра
с заданной скоростью (рис. 9.11). Когда биты кончаются, передатчик устанавливает
бит TRMT управляющего регистра и, если это требуется, генерирует прерывание
по завершении передачи.
Приемник имеет несколько более сложное устройство. Значение входа RX анализируется
не один раз за каждый такт генератора, а 16 раз и усредняется — благодаря
этому значительно увеличивается помехоустойчивость (рис. 9.12). Кроме
того, приемник USART имеет скрытый буферный регистр, в который помещается
значение принятого байта, если регистр данных приемника еще не был прочитан
с момента последнего приема (рис. 9.13).
Таблица 9.1. Описание битов управляющего регистра передатчика
USART
Бит |
Описание |
7 |
CSRC: Clock SouRCe — выбор источника тактовой частоты при асинхронном
режиме игнорируется, при синхронном режиме:
1 = режим ведущего (USART генерирует стробовый сигнал)
0 = режим ведомого (стробовый сигнал генерирует другое устройство) |
6 |
ТХ9: передавать 9 бит
1 = передавать 9 бит
0 = передавать 8 бит |
5 |
TXEN: Transmission ENabled — разрешить передачу
1 = передача разрешена
0 = передача запрещена |
4 |
SYNC: бит выбора режима USART
1 = синхронный режим
0 = асинхронный режим |
3 |
Не используется. Читается как О |
2 |
BRGH: Baud Rate Generator High — переключение режимов работы
тактового генератора |
1 |
TRMT: бит состояния сдвигового регистра передатчика
1 = TSR пуст
0 = TSR содержит данные (идет передача) |
0 |
TX9D: девятый бит передаваемых данных (может использоваться как
бит четности) |
Рис. 9.11. Принципиальная схема передатчика USART
Рис. 9.12. Временная диаграмма работы приемника USART
Таблица 9.2. Описание битов управляющего регистра приемника
USART
Бит |
Описание |
7 |
SPEN: Serial Port Enable — включить последовательный порт
1 = последовательный порт включен
0 = последовательный порт выключен |
6 |
RX9: разрешение приема 9 бит
1 = выбран прием 9 бит
0 = выбран прием 8 бит |
5 |
SREN: Single Receive ENable — бит одиночного приема Асинхронный
режим — не используется. Синхронный режим (ведущий):
1 = одиночный прием разрешен;
0 = одиночный прием запрещен.
Этот бит очищается после завершения приема. Синхронный режим (ведомый)
— не используется |
4 |
CREN: Continuous Receive ENable — бит непрерывного приема. Асинхронный
режим:
1 = прием разрешен;
0 = прием запрещен. Синхронный режим:
1 = непрерывный прием разрешен;
0 = непрерывный прием запрещен |
3 |
Не используется. Читается как 0 |
2 |
FERR: Framing ERRor — ошибка кадра
1 = ошибка кадра
0 = нет ошибки кадра |
1 |
OERR: Overrun ERRor — ошибка переполнения буфера
1 = переполнение буфера приема
0 = нет ошибки переполнения |
0 |
RX9D: девятый бит принятых данных.
Может использоваться как бит четности |
Рис. 9.13. Принципиальная схема приемника USART
Приемники большинства современных аппаратных реализаций
RS232 имеют буферные регистры. Так, последовательные порты подавляющего
большинства современных IBM PC-совместимых компьютеров основаны на микросхеме
National Semiconductor PC16552 [NS PC16552D] и имеют буферы объемом 16
байт (у оригинальной IBM PC были небуферизованные порты).
Помимо освобождения центрального процессора от исполнения работы сдвиговых
регистров, аппаратная реализация RS232 позволяет заменить ожидание данных
в режиме опроса на работу по прерываниям, что во многих случаях тоже весьма
полезно. Многопортовые адаптеры, используемые, например, для организации
модемных пулов интернет-провайдеров, часто могут передавать данные в режиме
ПДП. |