12/04/94 01:05pm
com_prgm.lek
А.В.Фролов, Г.В.Фролов
"Программирование модемов"
серия БСП том 4 М. "ДИАЛОГ-МИФИ"
1994 издание второе, стереотипное.
А.В.Фролов, Г.В.Фролов "Локальные
сети персоналиных компьютеров.
Использование протоколов IPX, SPX,
NETBIOS" серия БСП том 8 М.
"ДИАЛОГ-МИФИ" 1993.
Роберт Журден "Справочник
программиста на компьютере фирмы
IBM"
Программирование асинхронного адаптера.
На этапе
инициализации системы BIOS тестирует
имеющиеся асинхронные порты и
помещает их базовые адреса в
область данных BIOS, начиная с адреса
0040:0000h. Для хранения одного базового
адреса отводится два байта.
Базовый адрес представляет собой
младший адрес порта, из группы
портов, обслуживающих данный
COM-порт. Группа состоит из 8-ми
адресов используются не все, но
один и тот же адрес может
использоваться для обращение к
разным внутренним регистрам
асинхронного адаптера.
Старые версии BIOS могли обслуживать два асинхронных адаптера, новые четыре.
Инициализация асинхронного адаптера.
Обменом с внешними устройствами занимается специальная микросхема. Преред началом работы она должна быть настроена на требуемый формат передавемого/принимаемого слова. Настройку можно осуществить несколькими способами:
Воспользовавшись специальной службой ROM BIOS;
При помощи стандартной функции используемого языка программирования;
Средствами ОС;
Обратившись к микросхеме напрямую.
Первые три способа достаточно просты и мало чем отличаются друг от друга, причем часто совпадают даже форматы управляющих слов.
Последний способ более сложен, т.к. требует знаний:
Адресов портов (берутся из области данных BIOS);
Особенностей порядка загрузки регистров микросхемы;
Что самое неприятное для системного программиста: используемые в конкретном компьютере микросхемы отличаются друг от друга набором регистров, порядком настройки и форматом управляющих слов.
Однако работа непосредственно с микросхемами имеет существенное преимущество: она позволяет осуществлять обмен с максимальновозможной скоростью (первые три способа ввиду наличия достаточно сложных универсальных программ обслуживания портов не успевают за аппаратурой при скоростях выше 1200..2400 бод). Правда современные микросхемы имеют достаточно большой буфер типа "FIFO" (очередь), но и он спасает не всегда.
Основные регистры и порты:
порт |
I/O |
внутренний регистр адаптера |
название |
base+0 |
o |
Регистр передаваемых данных, |
|
i |
регистр принимаемых данных, |
||
i o |
регистр младшего байта делителя скорости; |
LSB |
|
base+1 |
i o |
Регистр старшего байта делителя, |
MSB |
i o |
регистр разрешения прерывания; |
IER |
|
base+2 |
i |
Регистр идентификации прерывания, |
IIR |
o |
регистр управления FIFO; |
FCR |
|
base+3 |
i o |
Регистр управления линией; |
LCR |
base+4 |
i o |
Регистр управления модемом; |
MCR |
base+6 |
i |
Регистр статуса линии; |
LSR |
base+7 |
i |
Регистр статуса модема. |
MSR |
РЕГИСТР ПЕРЕДАВАЕМЫХ ДАННЫХ - в этот регистр помещается очередной байт для выдачи его в канал связи. Перед записью необходимо убедиться, что предыдущее значение было отправлено или помещено во внутренний буфер.
РЕГИСТР ПРИНИМАЕМЫХ ДАННЫХ - из этого регистра читается очередной принятый байт. Перед чтением необходимо убедиться в завершении процедуры приема.
РЕГИСТР УПРАВЛЕНИЯ ЛИНИЕЙ - регистр управляет форматом передаваемого/принимаемого слова и загрузкой скорости обмена:
7 бит доступа к регистру скорости (значение 1 соответствует загрузке делителя скорости);
6 бит формирования сигнала BREAK для принимающего устройства (=1);
5 фиксация четности (=1 при передаче генерируется бит паритета, при приеме фиксируется его присутствие);
4,3 проверка четности при приеме:
x0 - не проверять,
01 - проверка на нечетность,
11 - проверка на четность;
2 количество генерируемых и проверяемых стоп-битов:
0 - 1 бит,
1 - 2 бита;
1,0 длина информационной части:
00 - 5 бит,
01 - 6 бит,
10 - 7 бит,
11 - 8 бит.
РЕГИСТЫ МЛАДШЕГО И СТАРШЕГО БАЙТА ДЕЛИТЕЛЯ СКОРОСТИ - служат для указания скорости обмена (в эти регистры загружается делитель базовой частоты). Значение делителя берется из соответствующей таблицы или вычисляется по формуле: делитель = 1843200 / ( скорость * 16 )
РЕГИСТР РАЗРЕШЕНИЯ ПРЕРЫВАНИЯ - оговаривает ситуации при которых должен генерироваться запрос прерывания:
7..4 биты зарезервированы, должны бать равны нулю;
3 прерывание при изменении состояния модема (изменении сигналов на линиях DCD, DSR, CTS, RI);
2 прерывание по состоянию линии (при обнаружении сигнала BREAK или при обнаружении ошибки в принимаемом слове);
1 прерывание по окончанию передачи (после выдачи последнего слова в линию);
0 прерывание при поступлении слова.
РЕГИСТР ИДЕНТИФИКАЦИИ ПРЕРЫВАНИЯ - указывает на причину возникновения прерывания (программа может читать регистр в целях диагностики):
7,6 разрешение очереди; биты используются только микросхемами 16550 и 16550A для более ранних биты равны нулю.
5,4 резерв, должны быть равны нулю;
3 таймаут; ¦
2,1 причина прерывания:
00 - по состоянию модема,
01 - буфер передатчика пуст,
10 - данные приняты,
11 - ошибка на линии или в принятом слове.
РЕГИСТР УПРАВЛЕНИЯ FIFO (для 16550 и более старших):
7,6 момент генерации прерывания:
00 - при получении 1 байта,
01 - при получении 4 байт,
10 - -"- 8 байт,
11 - -"- 14 байт;
5,4 резерв, должны быть равны нулю;
3 управление информационными миниями;
2 очистка очереди передатчика;
1 очистка очереди приемника;
0 разрешение очистки очередей.
РЕГИСТР УПРАВЛЕНИЯ МОДЕМОМ - управляет состояние выходных (управляющих) линий DTE:
7..5 зарезервированы, должны быть равны нулю;
4 включение тестового режима;
3 управление дополнительной линией OUT2;
2 управление дополнительной линией OUT1;
1 линия RTS;
0 линия DTR.
РЕГИСТР СТАТУСА ЛИНИИ - определяет причину ошибки и текущее состояние асинхронного адаптера:
7 тайм-аут (истекло время, отведенное на прием байта) или ошибка в очереди FIFO;
6 сдвиговый регистр передатчика пуст (закончена передача на физическом уровне);
5 регистр хранения передатчика пуст (информация переписана в сдвиговый регистр, можно загружать очеркдной байт);
4 обнаружен обрыв линии (состояние BREAK);
3 ошибка синхронизации (не обнаружено указанное количество стоповых бит);
2 ошибка четности в принятом слове;
1 ошибка переполнения (буфер приемника не был прочитан до окончания приема очередного слова;
0 готовность данных (получен очередной байт и готов к чтению процессором).
РЕГИСТР СТАТУСА МОДЕМА - определяет состояние сигналов, поступающих от DCE к DTE:
7 линия DCD;
6 линия RI;
5 линия DSR;
4 линия CTS;
3 изменение состояния линии DCD;
2 изменение состояния линии RI;
1 изменение состояния линии DSR;
0 изменение состояния линии CTS.
При работе с COM-портом через службы ROM BIOS или через стандартные функции выбранного языка программирования вышеперечисленные регистры устанавливаются автоматически и выдаются при чтении очередного байта.
Поскольку моменты записи байта на передачу и его передача разделены во времени (необходимо выполнение коммутации линий связи и готовность приемника), перед записью очередных данных необходимо убедиться, что буфер передатчика свободен; а перед чтением, что информация получена.
Передаваемые/принимаемые байты могут буферизироваться средствами ОС, если система работает по прерыванию.
Существуют сервисные программы для организации связи компьютеров через COM-порты, простейшую связь можно организовать при помощи надстройки "NC".