Микросхемы UART 16550А с программной точки зрения представляют собой набор регистров, доступ к которым определяется адресом (смещением адреса регистра относительно базового адреса порта) и значением бита
DLAB
(бита 7 регистра
LCR
). В адресном пространстве микросхема занимает 8 смежных адресов. Список регистров UART 16550A и способы доступа к ним приведены в табл. 2.4. Микросхемы 8250 отличаются отсутствием регистра FCR и всех возможностей FIFO и DMA.
Таблица 2.4. Регистры UART 16550A
Доступ
Регистр
Чтение/запись R/W
Смещение
DLAB
Имя
Название
0h
0
THR
Transmit Holding Register
WO
0h
0
RBR
Receiver Buffer Register
RO
0h
1
DLL
Divisor Latch LSB
R/W
1h
1
DIM
Divisor Latch MSB
R/W
1h
0
IER
Interrupt Enable Register
R/W
2h
x
IIR
Interrupt Identification Register
RO
2h
x
FOR
FIFO Control Register
WO
3h
x
LCR
Line Control Register
R/W
4h
x
MCR
Modem Control Register
R/W
5h
x
LSR
Line Status Register
R/W¹
6h
x
MSR
Modem Status Register
R/W¹
7h
x
SCR
Scratch Pad Register
R/W
¹ Некоторые
биты допускают только чтение. Запись в регистр может привести к сбою протокола.
ТHR
— промежуточный регистр данных передатчика (только для записи). Данные, записанные в регистр, будут пересланы в выходной сдвигающий регистр (когда он будет свободен), из которого поступят на выход при наличии разрешающего сигнала
CTS
. Бит 0 передается (и принимается) первым. При длине посылки менее 8 бит старшие биты игнорируются.
RBR
— буферный регистр принимаемых данных (только для чтения). Данные, принятые входным сдвигающим регистром, помещаются в регистр
RBR
, откуда они могут быть считаны процессором. Если к моменту окончания приема очередного символа предыдущий не был считан из регистра, фиксируется ошибка переполнения. При длине посылки менее 8 бит старшие биты в регистре имеют нулевое значение.
DLL
— регистр младшего байта делителя частоты.
DLM
— регистр старшего байта делителя частоты. Делитель определяется по формуле D=115200/V, где V — скорость передачи, бит/с. Входная частота синхронизации 1,8432 МГц делится на заданный коэффициент, после чего получается 16-кратная частота передачи данных.
IER
— регистр разрешения прерываний. Единичное значение бита разрешает прерывание от соответствующего
источника.
Назначение бит регистра
IER
:
♦ биты [7:4]=0 — не используются;
♦ бит 3 —
Mod_IE
— по изменению состояния модема (любой из линий
CTS
,
DSR
,
RI
,
DCD
);
♦ бит 2 —
RxL_IЕ
— по обрыву/ошибке линии;
♦ бит 1 —
TxD_IE
— по завершении передачи;
♦ бит 0 —
RxD_IЕ
— по приему символа (в режиме FIFO — прерывание по тайм-ауту).
IIR
— регистр идентификации прерываний и признака режима FIFO (только для чтения). Для упрощения программного анализа UART выстраивает внутренние запросы прерывания по четырехуровневой системе приоритетов. Порядок приоритетов (по убыванию): состояние линии, прием символа, освобождение регистра передатчика, состояние модема. При возникновении условий прерывания UART указывает на источник с высшим приоритетом до тех пор, пока он не будет сброшен соответствующей операцией. Только после этого будет выставлен запрос с указанием следующего источника. Ниже описано назначение бит регистра IIR.
♦ Биты [7:6] — признак режима FIFO:
• 11 — режим FIFO 16550A;
• 10 — режим FIFO 16550;
• 00 — обычный.
♦ Биты [5:4] — не используются.
♦ Бит 3 — прерывание по тайм-ауту приема в режиме FIFO (в буфере есть символы для считывания).
♦ Биты [2:1] — причина прерывания с наивысшим приоритетом (в обычном, не FIFO-режиме):
• 11 — ошибка/обрыв линии, сброс выполняется чтением регистра состояния линии;
• 10 — принят символ, сброс выполняется чтением данных;
• 01 — передан символ (регистр
THR
пуст), сброс выполняется записью данных;
• 00 — изменение состояния модема; сброс выполняется чтением регистра состояния модема.
♦ Бит 0 — признак необслуженного запроса прерывания (1 — нет запроса, 0 — есть запрос).
В режиме FIFO причину прерывания идентифицируют биты [3:1].
♦ 010 — принят символ. Сброс выполняется чтением регистра данных приемника.
♦ 110 — индикатор тайм-аута (за 4-кратный интервал времени символа не передано и не принято ни одного символа, хотя в буфере имеется, по крайней мере, один). Сброс выполняется чтением регистра данных приемника.
♦ 001 — регистр
THR
пуст. Сброс выполняется записью данных.
♦ 000 — изменение состояния модема (
CIS
,
DSR
,
RI
или
DCD
). Сброс выполняется чтением регистра
MSR
.
FCR
— регистр управления FIFO (только для записи). Ниже описано назначение бит регистра
FCR
:
♦ Биты [7:6] —
ITL
(Interrupt Trigger Level) — уровень заполнения FIFO-буфера, при котором вырабатывается прерывание:
(Transmit And Receive FIFO Enable) — разрешение (единицей) режима FIFO для передатчика и приемника. При смене режима FIFO-буферы автоматически очищаются.
LCR
— регистр управления линией (настройки параметров канала). Ниже описано назначение бит регистра