» Статьи о COM-портах » Последовательные порты компьютера
Последовательные порты компьютера
Современная персональная платформа может найти и обслужить до 255 последовательных портов, только небольшая часть из которых принадлежит бортовым устройствам UART,
а все остальные располагаются на дополнительных адаптерах. Разнообразие шинных технологий формирует и разнообразие подходов к использованию 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. Такое распределение происходит в процессе сканирования в пространстве портов от старших адресов к младшим.
Поэтому, если, например, в системе есть только последовательные порты с базовыми адресами 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).
29.12.2024

