Главная » Статьи о COM-портах » Последовательные порты компьютера

Последовательные порты компьютера

Современная персональная платформа может найти и обслужить до 255 последовательных портов, только небольшая часть из которых принадлежит бортовым устройствам UART, Распиновка COM-порта а все остальные располагаются на дополнительных адаптерах. Разнообразие шинных технологий формирует и разнообразие подходов к использованию RS232-протокола в операционных системах. В операционной системе MS-DOS по умолчанию доступны только те последовательные порты, список которых формирует BIOS (Basic Input/Output System). Они нумеруются со старшего базового адреса (как правило, это 3F8h) и обо­зна­ча­ют­ся мнемоническими именами COMx , где x — номер порта, и, как правило, располагаются на ISA-шине. Практически это можно вы­пол­нить с помощью автономного модуля Serial Plug-In.

BIOS обслуживает последовательные порты с помощью запроса на прерывание INT14h, посредством которого можно про­и­ни­ци­а­ли­зи­ро­вать RS232-порт, принять или передать байт данных, проверить статус порта и обеспечить доступ к регистровым полям для чтения/записи. Работа через BIOS страдает одним существенным недостатком: дисциплина FIFO для аппаратной буферизации не поддерживается. Поэтому программное обеспечение, обслуживающее про­хо­дя­щие через последовательный порт данные, должно обрабатывать поток со скоростью не мень­шей, чем скорость их поступления. В противном случае неизбежна потеря данных.

Работа с использованием INT14h допускает прием и передачу данных с портовой скоростью от 110 до 9600 бод. При больших скоростях приходится организовывать программную буферизацию принимаемых, а в отдельных случаях и передаваемых данных. Это можно сделать при ис­поль­зо­ва­нии прерываний, генерируемых последовательными портами.

Структура регистров UART

В составе порта доступны для работы восемь регистров, выполняющих одну или несколько функ­ций RS232-протокола. Эти регистры располагаются один за другим, начиная с адреса, ко­то­рый называется базовым. Базовые адреса последовательных портов хранятся в формате слова в слу­жеб­ной области, закрепленной за базовой системой ввода-вывода, начиная с адреса 40:0. Эта область называется BIOS Data Area. Как правило, в BDA-области зарезервировано четыре поля для COM1…COM4-портов, в которых хранятся их базовые адреса. Если порт отсутствует, то со­от­вет­ству­ю­щее поле BIOS Data Area содержит ноль.

Обычно базовый адрес COM1 расположен в 3F8h, COM2 – 2F8h, COM3 – 3E8h, COM4 – 2E8h. Такое распределение происходит в процессе сканирования в пространстве портов от старших адресов к младшим. Автономный модуль Serial Plug-In Поэтому, если, например, в системе есть только последовательные порты с базовыми адресами 3E8h и 2E8h, то им BIOS присвоит мнемонические имена COM1 и COM2 со­от­вет­ствен­но. В дальнейшем мы примем в качестве COM1 порт с базовым адресом Base=3F8h, и будем использовать адресацию его регистров от 3F8h до 3FFh.

После определения базового адреса необходимо установить параметры обмена: портовую скорость, способ контроля чет­нос­ти, число информационных и стоповых битов. Па­ра­мет­ры линии, кроме скорости, устанавливаются в регистре, который называется Line Control Register или LCR, регистр управления линией, расположенном по адресу Base+3. В нашем случае это регистр 3FBh.

Скорость передачи устанавливается отдельно от остальных параметров. Для этого в регистре LCR нужно установить бит 7 в "1". Этот бит называется Divisor Latch Access Bit (DLAB) — бит загрузки делителя, который отвечает за переназначение регистров Base+0 и Base+1. В общем случае регистр 3F8h используется как буфер обработки данных, а регистр 3F9h — как регистр управления прерываниями (Interrupt Enable Register). В случае установки бита DLAB эти регистры становятся регистрами, где хранятся соответственно младший байт (Divisor Latch Low Byte) и старший байт (Divisor Latch High Byte) делителя скорости обмена — Baud Rate Divisor. Такой подход объясняется тем, что для получения частоты битовой синхронизации из входной тактовой частоты, используется два последовательно включенных делителя, один из которых имеет фик­си­ро­ва­нный коэффициент, равный 16, а второй — обеспечивает программируемый ко­эф­фи­ци­ент де­ле­ния, равный значению, записанному в 16-битовый регистр Baud Rate Divisor. Результирующий коэффициент деления частоты равен произведению коэффициентов двух рассмотренных де­ли­те­лей, поэтому результирующая скорость передачи данных определяется формулой:

S = F/(16*D), где
S = Скорость приема/передачи в бодах.
F = Частота тактирования микросхемы UART в герцах.
D = Значение 16-битового регистра Baud Rate Divisor.

При использовании UART со стандартной частотой тактирования в 1.8432MHz, для получения скорости в 115200 бод используется Divisor=1. Коммуникационные устройства, поддерживающие скорости выше 115200 бод, используют частоты тактирования UART, превышающие 1.8432MHz в 2, 4 или 8 раз.

Установка параметров UART

После того как задана скорость передачи данных, в регистре 3FBh, расположенному по от­но­си­тельному адресу Base+3, устанавливаются все прочие параметры UART. Бит 6 этого ре­гист­ра служит для формирования сигнала, указывающего на завершение сеанса связи. При установлении этого бита в 1 порт начинает посылать в линию двоичные нули до тех пор, пока этот бит не будет установлен в 0. После установки параметров бит 7 нужно установить в 0, что переводит порт в рабочий режим. При этом регистр 3F8h становится буфером, который содержит байт для передачи или в котором хранится принятый байт.

После установки параметров необходимо принять решение о том, каким образом будут обслуживаться запросы на прерывания. Если установки CMOS Setup не задают другое, порты COM1 и COM3 обслуживаются прерыванием IRQ 4, а COM2 и COM4 - IRQ 3. Существует способ определить программным путем номер прерывания вызываемого конкретным портом, суть ко­то­ро­го сводится к использованию ILR.Асинхронный модем

После выборки байта из порта и помещения его в программный буфер в Programm Interrupt Controller (PIC) посылается сигнал об окончании обработки прерывания. Затем установкой со­от­вет­ству­ю­щих битов в регистре управления модемом MCR (Modem Control Register) по адресу 3FCh выставляются запрос на передачу — RTS (Request To Send), готовность периферийного устройства — DTR (Data Terminal Ready) и сигнал OUT2. Бит 3 этого регистра нужно выставить для того, чтобы разрешить прерывания от UART. Сигналы RTS и DTR используются для син­хро­ни­за­ции связи.

После этого нужно установить тип прерывания, генерируемого портом. Обычная практика состоит в том, чтобы прерывания возникали по приходу каждого байта. Если в регистре 3FBh очистить бит 7, тогда он становится регистром разрешения прерываний Interrupt Enable Register (IER). А если бит 0 этого регистра установлен, то порт будет инициировать прерывания по приходу каждого байта. Если установлен бит 1, то порт будет генерировать прерывания при го­тов­нос­ти порта к передаче данных. Бит 2 отвечает за прерывания при ошибках приема данных или в случае активного сигнала окончания. Бит 3 управляет генерацией прерываний при изменении входного статуса порта. Остальные биты этого регистра всегда должны равны нулю.

Готовность порта определяется по состоянию регистра Line Status Register (LSR), рас­по­ло­жен­но­го по адресу 3FDh, который называется регистром статуса линии. Если бит 5 этого регистра выставлен в "1", это означает, что регистр 3F8h готов к записи байта, который будет передаваться в линию. Регистр 3FAh отвечает за идентификацию прерываний — IIR (Interrupt Identification Register). Если в регистре 3F9h разрешены несколько типов прерываний, по битовым полям регистра 3FAh можно определить конкретный тип прерывания. Регистр 3FEh показывает наличие или изменение некоторых сигналов линии связи и называется регистром статуса модема — MSR (Modem Status Register).

Реклама на V-Comp:


21.09.2017