Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение IBM PC

© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.

[Назад] [Содеожание] [Дальше]

6.3. Порты асинхронного адаптера

На этапе инициализации системы модуль POST BIOS тестирует имеющиеся асинхронные адаптеры и инициализирует первые два. Их базовые адреса располагаются в области данных BIOS начиная с адреса 0000:0400h.

Первый адаптер COM1 имеет базовый адрес 3F8h и занимает диапазон адресов от 3F8h до 3FFh. Второй адаптер COM2 имеет базовый адрес 2F8h и занимает адреса 2F8h...2FFh.

Асинхронные адаптеры могут вырабатывать прерывания:

  • COM1 - IRQ4 (соответствует INT 0Ch)
  • COM2 - IRQ3 (соответствует INT 0Bh)

Рассмотрим назначение отдельных битов этих портов.

Порт 3F8h.

Этот порт соответствует регистру передаваемых данных. Для передачи в порт 3F8h необходимо записать передаваемый байт данных. После приема данных от внешнего устройства они могут быть прочитаны из этого порта.

В зависимости от состояния старшего бита управляющего слова, выводимого в управляющий регистр с адресом 3FBh, назначение порта 3F8h может изменяться. Если этот бит равен 0, порт используется для записи передаваемых данных. Если же бит равен 1, порт используется для вывода значения младшего байта делителя частоты тактового генератора. Изменяя содержимое делителя, можно изменять скорость передачи данных. Старший байт делителя записывается в порт 3F9h.

Зависимость скорости передачи данных от значения делителя частоты представлено в следующей таблице:

Делитель        Скорость передачи в бодах

1040    110
768     150
384     300
192     600
96      1200
48      2400
24      4800
12      9600
6       19200
3       38400
2       57600
1       115200


Порт 3F9h.

Порт используется либо как регистр управления прерываниями от асинхронного адаптера либо (после вывода в порт 3F9h байта с установленным в 1 старшим битом) для вывода значения старшего байта делителя частоты тактового генератора.

В режиме регистра управления прерываниями порт имеет следующий формат:

 7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦       ¦ ¦ ¦ ¦ ¦
LT+-+-+T+T+T+T+T-
L==T==- ¦ ¦ ¦ L= 1 - разрешение прерывания при готовности
    ¦    ¦ ¦ ¦        принимаемых данных;
    ¦    ¦ ¦ ¦
    ¦    ¦ ¦ L=== 1 - разрешение прерывания после передачи
    ¦    ¦ ¦          байта (когда выходной буфер передачи
    ¦    ¦ ¦          пуст);
    ¦    ¦ ¦
    ¦    ¦ L===== 1 - разрешение прерывания по обнаружению
    ¦    ¦            состояния "BREAK" или по ошибке;
    ¦    ¦
    ¦    L======= 1 - разрешение прерывания по изменению
    ¦                 состояния входных линий на разъеме
    ¦                 RS-232-C (CTS, DSR, RI, DCD);
    ¦
L============ Не используются, должны быть равны 0.


Порт 3FAh.

Регистр идентификации прерывания. Считывая его содержимое, программа может определить причину прерывания.

Формат регистра:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦         ¦   ¦ ¦
LT+-+-+-+T+T+T+T-
L===T===- L=¦ L= 1  - Нет прерываний, ожидающих
     ¦       ¦         обслуживания.
     ¦       ¦
     ¦       L=== 00 - Прерывание по линии состояния
     ¦                 приемника, возникает при
     ¦                 переполнении приемника, ошибках
     ¦                 четности или формата данных
     ¦                 или при состоянии "BREAK".
     ¦                 Сбрасывается после чтения состояния
     ¦                 линии из порта 3FDh.
     ¦
     ¦            01 - Данные приняты и доступны для чтения.
     ¦                 Сбрасывается после чтения данных
     ¦                 из порта 3F8h.
     ¦
     ¦            10 - Буфер передатчика пуст. Сбрасывается
     ¦                 при записи новых данных в регистр
     ¦                 данных передатчика, порт 3F8h.
     ¦
     ¦            11 - Состояние модема. Устанавливается при
     ¦                 изменении состояния входных линий
     ¦                 CTS, RI, DCD, DSR. Сбрасывается 
     ¦                 после чтения состояния модема из
     ¦                 порта 3FEh.
     ¦
L========== Должно быть равно 0.


Порт 3FBh.

Управляющий регистр, доступен по записи и чтению.

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦   ¦ ¦   ¦
LT+T+T+T+T+T+T+T-
¦ ¦ ¦ L=¦ ¦ L=¦= Длина слова в битах:
 ¦ ¦ ¦   ¦ ¦        00 - 5 бит;
 ¦ ¦ ¦   ¦ ¦        01 - 6 бит;
 ¦ ¦ ¦   ¦ ¦        10 - 7 бит;
 ¦ ¦ ¦   ¦ ¦        11 - 8 бит.
 ¦ ¦ ¦   ¦ ¦
 ¦ ¦ ¦   ¦ L===== Количество стоповых бит:
 ¦ ¦ ¦   ¦          0 - 1 бит;
 ¦ ¦ ¦   ¦          1 - 2 бита.
 ¦ ¦ ¦   ¦
 ¦ ¦ ¦   L======= Четность:
 ¦ ¦ ¦              X0 - контроль на четность не
 ¦ ¦ ¦                   используется;
 ¦ ¦ ¦              01 - контроль на нечетность;
 ¦ ¦ ¦              11 - контроль на четность.
 ¦ ¦ ¦
 ¦ ¦ L=========== Фиксация  четности. При установке этого
 ¦ ¦              бита бит четности всегда принимает
 ¦ ¦              значение 0 (если биты 3-4 равны 11) или 1
 ¦ ¦              (если биты 3-4 равны 01).
 ¦ ¦
¦ L============= Установка перерыва. Вызывает вывод
 ¦                строки нулей в качестве сигнала
 ¦                "BREAK" для подключенного устройства.
 ¦
L=============== 1 - порты 3F8h и 3F9h используются
для для загрузки делителя частоты
тактового генератора;
0 - порты используются как обычно.


Порт 3FCh.

Регистр управления модемом. Управляет состоянием выходных линий DTR, RTS , линий, специфических для модемов OUT1 и OUT2, для запуска диагностики соединенных вместе замкнутых входе и выходе асинхронного адаптера.

Формат порта:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦     ¦ ¦ ¦ ¦ ¦ ¦
LT+-+T+T+T+T+T+T-
L=T=- ¦ ¦ ¦ ¦ L= линия DTR;
   ¦   ¦ ¦ ¦ ¦
   ¦   ¦ ¦ ¦ L=== линия RTS;
   ¦   ¦ ¦ ¦
   ¦   ¦ ¦ L===== линия OUT1 (запасная);
   ¦   ¦ ¦
   ¦   ¦ L======= линия OUT2 (запасная);
   ¦   ¦
   ¦   L========= запуск диагностики при входе
   ¦              асинхронного адаптера, замкнутом
   ¦              на его выход;
   ¦
L============= должно быть равно 0.


Порт 3FDh.

Регистр состояния линии.

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
 ¦ ¦ ¦ ¦ ¦ ¦ ¦ L= Данные получены и готовы для чтения,
 ¦ ¦ ¦ ¦ ¦ ¦ ¦    сбрасывается при чтении данных.
 ¦ ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ ¦ L=== Ошибка переполнения. Был принят новый
 ¦ ¦ ¦ ¦ ¦ ¦      байт данных, а предыдущий еще не был 
 ¦ ¦ ¦ ¦ ¦ ¦      считан программой. Предыдущий байт
 ¦ ¦ ¦ ¦ ¦ ¦      потерян.
 ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ L===== Ошибка четности, сбрасывается после
 ¦ ¦ ¦ ¦ ¦        чтения состояния линии.
 ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ L======= Ошибка синхронизации.
 ¦ ¦ ¦ ¦
 ¦ ¦ ¦ L========= Обнаружен запрос на прерывание
 ¦ ¦ ¦            передачи "BREAK" - длинная строка нулей.
 ¦ ¦ ¦
 ¦ ¦ L=========== Регистр хранения передатчика пуст, в него
 ¦ ¦              можно записывать новый байт для передачи.
 ¦ ¦
 ¦ L============= Регистр сдвига передатчика пуст. Этот
 ¦                регистр получает данные из регистра
 ¦                хранения и преобразует их в
 ¦                последовательный вид для передачи.
 ¦
 L=============== Таймаут (устройство не связано с
                  компьютером).


Порт 3FEh.

Регистр состояния модема.

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
 ¦ ¦ ¦ ¦ ¦ ¦ ¦ L= линия CTS изменила состояние
 ¦ ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ ¦ L=== линия DSR изменила состояние
 ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ L===== линия RI изменила состояние
 ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ L======= линия DCD изменила состояние
 ¦ ¦ ¦ ¦
 ¦ ¦ ¦ L========= состояние линии CTS
 ¦ ¦ ¦
 ¦ ¦ L=========== состояние линии DSR
 ¦ ¦
 ¦ L============= состояние линии RI
 ¦
 L=============== состояние линии DCD


[Назад] [Содеожание] [Дальше]