♦ 8250 имеет ошибки (появление ложных прерываний), учтенные в XT BIOS;
♦ 8250А — ошибки исправлены, но в результате потеряна совместимость с BIOS; эта микросхема работает в некоторых моделях AT, но непригодна для скорости 9600 бит/с;
♦ 8250В — исправлены ошибки 8250 и 8250A, восстановлена ошибка в прерываниях — возвращена совместимость с XT BIOS; работает в AT под DOS (кроме скорости 9600 бит/с).
Микросхемы 8250x имеют невысокое быстродействие по обращениям со стороны системной шины. Они не допускают обращения к своим регистрам в смежных шинных циклах процессора — для корректной работы с ними требуется введение программных задержек между обращениями CPU. В компьютерах класса AT применяют микросхемы UART перечисленных ниже модификаций.
♦ 16450 — быстродействующая версия 8250 для AT. Ошибок 8250 и полной совместимости с XT BIOS не имеет.
♦ 16550 — развитие 16450. Может использовать канал DMA для обмена данными. Имеет FIFO-буфер, но некорректность его работы не позволяет им воспользоваться.
♦ 16550А — имеет работающие 16-байтные FIFO-буферы приема и передачи и возможность использования DMA. Именно этот тип UART должен применяться в AT при интенсивных обменах на скоростях 9600 бит/с и выше. Совместимость с этой микросхемой обеспечивает большинство микросхем контроллеров портов ввода-вывода, входящих в современные чипсеты.
Микросхемы 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.