Программирование LPT порта

В данной статье описаны этапы программирования LPT порта при организации обмена данными между двумя компьютерами в режиме стандартного LPT порта (SPP).

Функциональным отличием LPT порта от COM порта является отсутствие каких-либо схем для организации обмена данными. Так, COM порт управляется универсальным асинхронным приёмо-передатчиком (UART), который вырабатывает все необходимые сигналы интерфейса при записи в данных в регистр передачи. При работе с LPT портом в режиме SPP программист должен сам заботиться о формировании тех или иных сигналов интерфейса. Однако LPT порт обеспечивает существенно большую скорость передачи данных по сравнению с COM портом (в режиме SPP около 150 Кбит/с).

В режиме SPP обычно обеспечивается обмен данными между компьютером и принтером по интерфейсу Centronics. В этом режиме параллельный порт является однонаправленным, т.е. для передачи и приёма данных используются различные линии физического интерфейса. В режиме SPP возможна организация обмена данными полубайтами, т.е. за единицу времени может быть передано 4 бита данных, а посылка 1 байта требует двух циклов обмена.

Примечание: далее все номера регистров соответствуют порту LPT1.

Аппаратная организация LPT порта

LPT порт имеет три регистра, с помощью которых возможна организация обмена данными и управление портом. Регистр передачи (378h) - при записи данных в этот регистр на линиях интерфейса Centronics появляются сигналы, соответствующие записанным данным. Приёмный регистр (регистр состояния) (379h) служит для считывания принятых данных, а если обмен данными организуется с принтером, то этот регистр используется для получения состояния принтера (отсутствие бумаги, разрешение передачи данных, готовность и т.д.). Регистр управления (37Ah) в основном предназначен для разрешения и запрета прерываний от LPT порта.

Рис. 1. Распайка стандартного кабеля LPT-LPT.

Стандартный кабель LPT-LPT имеет распайку, показанную на рис. 1 (cправа подписаны названия линий для интерфейса Centronics). Для передачи данных в регистре передачи (378h) используются биты 0, 1, 2 и 4 (D0, D1, D2, D4). Бит 3 (D3) используется для подтверждения приёма данных (см. ниже). В приёмном регистре бит 7 (D7) является инвертированным значением бита 4 (D4) регистра передачи. Таким образом возможна организация обмена полубайтами с подтверждением приёма. При организации обмена данными между двумя компьютерами схема на рис. 1 идентична для обоих компьютеров.

Алгоритм обмена данными

Рис. 2. Схема обмена.

Рассмотрим алгоритм обмена данными между двумя компьютерами с подтверждением. Этот процесс показан в виде диаграммы на рис. 2. Пусть первый компьютер будет передающим, а второй - принимающим.

В момент времени t0 (начало передачи) передающий компьютер (передатчик) выставляет данные для передачи (записывает их в порт 378h). Причём в каждом цикле обмена записывается один полубайт в регистр передачи 378h, бит 3 должен быть сброшен (= 0). Таким образом значения битов 0, 1, 2, 3 данного полубайта записываются в биты 0, 1, 2, 4 регистра передачи, а бит 3 регистра передачи равен 0.

В момент времени t1 передатчик выставляет сигнал готовности (ACK1), который означает, что данные переданы и принимающий компьютер (приёмник) может их считать из приёмного регистра 379h. Чтобы выставить сигнал готовности нужно в бит 3 регистра передачи 378h записать 1.

В момент времени t2 приёмник определяет, что поступил сигнал готовности от передатчика и данные можно считать. Приёмник считывает данные из приёмного регистра (см. ниже) и устанавливает сигнал подтверждения приёма (ACK2). Это нужно для того, чтобы передатчик смог определить, когда можно будет посылать следующие данные. Если этого не сделать, то передатчик может послать данные в тот момент, когда приёмних их ещё не считал и это может привести к сбою передачи или приёма.

В момент времени t3 передатчик получает сигнал подтверждения приёма (ACK2) от приёмника и сбрасывает сигнал готовности (ACK1). Это нужно для того, чтобы приёмник смог сбросить свой сигнал подтверждения (ACK2). Если этого не сделать то цикл обмена будет нарушен, так как в следущем цикле обмена передатчик не будет знать принял ли приёмник данные или нет, если сигнал ACK2 будет всегда установлен.

В момент времени t4 приёмник определяет, что сигнал готовности (ACK1) сброшен и сбрасывает свой сигнал подтверждения приёма (ACK2). Таким образом завершается цикл обмена полубайтом - передатчик снова готов к передачи данных, а приёмник - к приёму.

В следующем цикле посылается другой полубайт - если посылался младший полубайт, то посылается старший и наоборот. В следующем за этим цикле обмена снова посылается младший полубайт и т.д.

При чтении данных из приёмного регистра 379h следует учитывать, что бит 7 приёмного регистра является инверсией бита 4 регистра передачи. Таким образом при чтении данных бит 7 приёмного регистра необходимо инвертировать.

При записи данных в регистр передачи 378h не следует изменять значение бита 3, так как в данном варианте алгоритма обмена он используется для других целей.

Организация обмена по опросу

При организации обмена данными по опросу возможна следующая реализация приведённого выше алгоритма обмена (примеры действий связаны между собой):

Действия передатчика Действия приёмника
1. Дождаться сброса сигнала подтверждения приёма данных (ACK2) предыдущего цикла обмена:
mov dx, 379h
m1: in al, dx
test al, 40h
jnz m1

2. Записать передаваемые данные в регистр передачи 378h (в примере производится запись младшего полубайта регистра BL):

mov al, bl
shl al, 1
and al, 00010000b
or al, bl
and al, 00010111b
mov dx, 378h
out dx, al

3. Выставить сигнал готовности (ACK1):

or al, 08h
out dx, al

4. Дождаться прихода сигнала подтверждения приёма (ACK2) от приёмника:

mov dx, 379h
m2: in al, dx
test al, 40h
jz m2

5. Сбросить сигнал готовности (ACK1):

xor al, al
mov dx, 378h
out dx, al
1. Дождаться прихода сигнала готовности (ACK1) передатчика:
mov dx, 379h
m3: in al, dx
test al, 40h
jz m3

2. Прочитать данные из приёмного регистра 379h (в примере полубайт читается в регистр BL):

in al, dx
xor al, 80h
mov cl, 3
shr al, cl
mov bl, al
and bl, 07h
shr al, 1
and al, 00001000b
or bl, al

3. Выставить сигнал подтверждения приёма (ACK2):

mov al, 08h
mov dx, 378h
out dx, al

4. Дождаться снятия сигнала готовности передатчика (ACK1):

mov dx, 379h
m4: in al, dx
test al, 40h
jnz m4

5. Сбросить сигнал подтверждения приёма (ACK2):

mov dx, 378h
xor al, al
out dx, al

 

Организация обмена по прерыванию

При организации обмена по прерыванию приёмник принимает данные тогда, когда поступило прерывание от LPT порта. Генерацию прерываний LPT портом можно разрешить, установив бит 4 регистра управления (37Ah) в 1. Запретить прерывания можно сбросом данного бита. Когда прерывания от LPT порта разрешены они генерируются при изменении бита 6 приёмного регистра (сигнал ACK) с 0 на 1. Таким образом, при организации обмена по прерыванию в приёмнике отсутствует проверка прихода сигнала готовности передатчика (действие 1 приёмника), так как обработчик прерываний от LPT порта будет вызван сразу после появления сигнала готовности. Далее обработчик прерываний от LPT порта приёмника выполняет приведённый выше цикл обмена без изменений. Прерывание порта LPT1 - 0Fh. По окончании обработки этого прерывания следует послать сигнал EOI (End Of Interrupt - конец прерывания) в контроллер прерываний.

 

Возврат к разделу "Писанина"Переход на главную страницу

Copyright © 1999 by HackMaster

Hosted by uCoz