Одним из полезных ресурсов для разработчиков электронной техники является конференция сети FIDONET RU.EMBEDDED
(fido7.ru.embedded), которая также доступна в Интернете, например, через
сервера www.talk.ru или www.fido-online.com. Конференция посвящена вопросам, связанным со встроенными системами, микроконтроллерами и другими компонентами этих систем, их разработкой, кросс-программированием, отладкой, тестированием: хард, софт, инструментарий, проблемы, возникающие при разработке и использовании, схемы, алгоритмы, исходные тексты, ноу-хау. По адресу www.svtehs.com/ru/embedded.htm находится FAQ конференции ┼ ответы на часто задаваемые вопросы, которые пишут сами участники. Ведет FAQ Алексей Владимиров (avlad@mail.svtehs.com). Мы начинаем публиковать выдержки из FAQ. Сегодня на вопросы о EPP отвечает Александр Вишняков.
Что такое EPP?
EPP (Enchanced Parallel Port ) - скоростной (до 2 Мб/с) двунаправленный интерфейс, являющийся развитием
Centronics и Bidirectional режимов LPT-порта. Его главная особенность - прием или передача байта со стороны PC осуществляется за одно обращение к порту I/O (более того, при 16/32-разрядном обращении принимается или передается сразу 2/4 байта, соответственно), цикл квитирования приема-передачи реализован аппаратно (для ISA - посредством сигнала IOCHRDY). Грубо говоря, EPP - отдешифрированный порт I/O, вынесенный на кабель. Сигналы LPT-порта получили другие функции и другие названия. Для более подробного знакомства можно посмотреть, например, www.fapo.com/ieee1284.htm и www.lvr.com/parport.htm.
Как включить режим EPP на компьютере?
Переключение режимов LPT-порта, как правило, производится "магическими последовательностями". Смотреть их надо в описаниях соответствующих микросхем MIO (SIO). Довольно подробный список микросхем SIO содержится на ic.doma.kiev.ua/bios/chip/sio.htm.
Для пользователя выбор режима
LPT-порта сводится к установкам в BIOS SETUP. Как правило, там есть режимы Standard, Bidirectional, EPP, ECP, часто - ECP+EPP, на более старых - что-нибудь вроде Extended. Если есть режим "чистого" EPP - выбирайте его (часто есть еще выбор между EPP1.7 и EPP1.9). Если только смешанный "ECP+EPP" или "Extended" - скорее всего, потребуется еще выполнить запись в порт ECR байта 0x80 (ECR - это регистр ECP-режима, ECR=BASE_ADDR+0x402; BASE_ADDR - базовый адрес LPT-порта). Если это не поможет - все же не обойтись без документации на микросхему.
Кстати, учтите, что базовый адрес порта в режиме EPP не может быть 3BC
(поскольку EPP занимает в пространстве I/O 8 смежных адресов, а по адресу 3С0 уже расположены регистры CGA), некоторые BIOS≥ы не блокируют возможность ввода конфигурации "EPP на 3BC". Нужно помнить, что регистр управления LPT-порта по-прежнему влияет на состояние выходных линий, а для работы аппаратного квитирования нужно перевести линии nDATASTB, nADDRSTB, nWRITE в состояние "1" (ВIOS также это делать не обязан), сброс устройства линией nRESET также целиком в вашей власти.
В чем различие между EPP1.7, EPP1.9, IEEE1284?
Краткую историю вопроса можно почерпнуть на www.fapo.com/eppmode.htm. EPP1.7 еще называют pre-1284 EPP, EPP1.9 - доработка, положенная в основу стандарта IEEE1284 (точнее, IEEE1284 описывает
все режимы LPT-порта: Compatibility, Nibble, Byte, EPP, ECP), сам стандарт может быть заказан на www.ieee.org, точный его текст в Интернете я не видел. Отличие 1.7 и 1.9 (IEEE1284) - в способе квитирования.
Временная диаграмма для EPP1.9
(передача двух байт, рассматривается на примере циклов данных, для циклов
адреса - аналогично) показана на рис. 1.
Рис. 1
EPP-Host опускает линию nDATASTB только при низком уровне сигнала nWAIT, а поднимает только при высоком, то есть периферийное устройство (далее "периферия") подтверждает оба фронта сигнала
nDATASTB.
Временная диаграмма для EPP1.7 - на рис. 2.
Рис. 2
Здесь передача первого байта
выглядит как и раньше, но с опусканием линии nWAIT периферия "замешкалась", и Host имеет право начать новый цикл обмена (опустить nDATASTB) при любом уровне сигнала nWAIT. С подъемом же линии nDATASTB - разнобой - некоторые реализации 1.7 поднимают ее только после перехода nWAIT из "0" в "1" (как на рис. 2 вверху), то есть им важно наличие фронта; другие требуют только, чтобы nWAIT было "1". То есть, если периферия хочет задержать подъем nDATASTB, она должна быстро выставить nWAIT="0l", иначе цикл может выглядеть, как показано на рис. 3
(длительность импулься nDATASTB="0" при этом меньше 500 нс).
Рис. 3
Можно ли сделать EPP-периферию на микроконтроллере?
Конечно, но процессор должен быть достаточно быстрым - цикл I/O нельзя затягивать слишком долго (большинство EPP-Host контроллеров отслеживают тайм-аут квитирования (10 мкс по стандарту), да и у ISA есть тайм-аут для IOCHRDY (иногда может устанавливаться в BIOS SETUP)). Порты процессора должны быть достаточно мощными и с триггерами
Шмитта на ввод. Для совместимости с обоими толкованиями EPP1.7 может понадобиться внешняя обвеска (триггер). Так например, скорости 20 МГц PIC16C65 практически не хватило для чисто программного квитирования, и была использована следующая схема (рис. 4):
Рис. 4
- Исходно (при nDATASTB = "1") , SW = "0" , nWAIT = "0".
- При переходе nDATASTB из "1" в "0", nWAIT остается в "0", PIC обнаруживает этот переход, считывает или выставляет байт данных и затем дает короткий импульс "1" по линии SW (SetWait), что приводит к установке nWAIT = "1".
- Host поднимает nDATASTB в "1", nWAIT автоматически опускается в "0". Триггер легко строится на элементах И-НЕ/ИЛИ-НЕ.
Что адресуют адресные циклы?
Это целиком отдано на усмотрение
разработчика. По существу, это дополнительный отдешифрированный порт, но, в отличие от циклов данных, доступ здесь только байтовый. При процессорной реализации периферии, возможно, проще вообще не пользоваться адресными циклами; при чисто "дискретной" реализации логично использовать их именно для внутренней адресации на устройстве (если таковая нужна).
Когда EPP-устройство генерирует прерывание?
Поскольку (в отличие от Centronics)
передача байта квитируется автоматически, то прерывание на передачу одного байта не требуется. Логично использовать линию прерывания для сообщения о готовности к обмену очередного блока данных (при высоких скоростях буферизация на обеих
сторонах почти всегда необходима). В вашем распоряжении есть также две User-defined линии (PE, nERROR).
А если EPP-устройство все же не успевает квитировать?
В большинстве реализаций хоста есть бит Time-Out (ошибка квитирования со стороны периферии) - это бит 0 порта статуса (BASE_ADDR+1), который в Centronics не использовался. Разумеется, нерационально проверять этот бит после передачи/приема одного байта, делать это можно после обмена блоком данных. Бит Time-Out сбрасывается либо при чтении порта статуса, либо (гораздо чаще) при записи байта xxxxxxx1b в порт статуса (в
Centronics он был Read Only), так что запись 0x01 не помешает в любом случае. Но если бит Тime-Out не реализован, и в младшем бите статуса всегда считывается 1, то ясно, что такая "проверка" недопустима, поэтому в начале работы программа на PC может попытаться сбросить бит 0 статуса; если это не удается - то бита
Time-Out нет. Имейте в виду, что с момента после возникновения Time-Out и до его сброса Host-контроллер может вести себя непредсказуемо. Например, наблюдалось (микросхема SMS FDC37C672), как при возникновении Time-Out в цикле EPP-чтения
шина данных как бы запирается на ввод (и бит направления LPT-порта перестает на это влиять!), циклы EPP- записи больше не генерируются, а циклы EPP-чтения идут нормально. Как правило, такие "тонкости" в "даташитах" не приводятся.
Важен ли бит направления порта LPT?
Да, важен, и, увы, здесь тоже разночтения. Я встречался со следующими реализациями:
- Направление шины данных определяется битом направления LPT (бит 5 регистра BASE_ADDR+2) в промежутках между EPP-циклами, и направлением EPP-цикла (запись или чтение) в момент самого цикла.
- Аналогично 1), но в цикле EPP-записи при бите направления iа1lа (на ввод) байт на шину данных не выставляется, хотя квитирование ведется.
- Аналогично 1), но бит направления должен совпадать с фактическим направлением EPP-цикла. Иначе сигналы квитирования (nDATASTB/nADDRSTB, nWRITE) не генерируются (но и Time-Out тоже не фиксируется).
- Бит направления программируется, но ни на что не влияет. После записи в порт данных LPT (BASE_ADDR+0) или EPP-цикла записи порт остается на вывод, после EPP- цикла чтения порт остается на ввод.
Для совместимости со всеми реализациями делалось следующее:
- EPP-периферия в основном держит шину данных на ввод и переводит на вывод только в момент EPP-цикла чтения (по спаду nDATASTB/nADDRSTB при nWRITE=i/1"). При обмене блоками по оговоренному протоколу коммутация направления возможна и один раз на целый блок;
- на EPP-хосте бит направления устанавливается в "0" перед началом передачи блока данных и в "1" перед началом приема блока данных;
- для защиты от возможных столкновений шины данных при сбоях предусмотренные стандартом последовательные резисторы становятся совершенно необходимыми.
Нужно ли применять специальный кабель?
По стандарту IEEE1284 - нужно -
специальный кабель с экранированием каждого сигнала, однако такие кабели дороги и не всегда доступны.
Опыт показывает, что EPP прекрасно
работает на стандартном 25-контактном RS-232 кабеле, в том числе, на кабеле длиной 6 метров, при сочленении нескольких кабелей и с использованием механического переключателя принтера. Разумеется, рекомендации по подтяжкам, последовательным резисторам и триггерам Шмитта на входах нужно соблюдать.
Какие еще проблемы могут возникнуть?
Если ваше EPP-устройство должно
работать как в автономном режиме, так и в режиме связи с PC (следовательно, имеет автономное питание), то возникает неприятная проблема "натекания" напряжения (через выходы и резисторы подтяжек включенного устройства на питание выключенного через защитные диоды и те же подтяжки). При уровне порядка 1 В импульсный блок питания PC может просто не включиться (наблюдалось неоднократно). Поэтому желательно, чтобы ваше устройство умело обнаруживать,
когда PC выключен, но на входах с подтяжками это не так просто сделать! В моем устройстве это делалось по уровню сигнала nADDRSTB (адресные циклы не использовались), эта линия специально имела подтяжку не к +5 В а к земле (и немного подфильтрована). Если PC включен и порт в режиме EPP, то nADDRSTB="1" , в противном случае, PIC16 переводил все выходные линии в iи0lи и отключал
подтяжки на входных (использовался один транзистор на все подтяжки). Также следует учесть, что в процессе перезагрузки PC на порту EPP может быть что угодно (например, Windows98 мучает LPT-порт при загрузке не так, как Windows95), нужно позаботиться, чтобы устройство не приняло это за исполнительную команду - как минимум, оно должно обнаруживать ошибки интерфейса, корректно восстанавливаться по сигналу nRESET.
Какая скорость может быть достигнута на EPP?
Максимальная скорость обмена
достигается при использовании на Host-PC команд "rep ins", "rep out". (ввод/вывод цепочки байт в порт). Цифры, полученные на двух компьютерах при максимально быстром квитировании (nWAIT получен инверсией nDATASTB), сведены в таблицу.
Таблица
PC | chip (card) | 8 bit (rep insb) (rep outsb) |
16 bit (rep insw) (rep outsw) |
32 bit (rep insd) (rep outsd) |
Cel-433 (440BX) | W83977TF (EPP-ISA)* (EPP-PCI)** |
645 Kб/с 590 Kб/с 1175 Kб/с |
870 Kб/с 770 Kб/с ? |
1000 Кб/с 930 Kб/с ? |
K5-166 (430TX) | IT8679F (EPP-PCI) |
800 Kб/с 1330 Kб/с |
910 Kб/с ? |
1050 Kб/с ? |
* ) (EPP-ISA) - карточка с микросхемой AP138B (ASP), производитель - www.namdosys.com.
** ) (EPP-PCI) - карточка с микросхемой OX16PCI954 (Oxford Semiconductor), производитель -
www.vscom.de (на момент подготовки FAQ были неясности с работой этой карты при 16/32-разрядном I/O).
I/O Recovery в BIOS SETUP выставлены
минимальные, прочие опции "разгона" ISA на обеих машинах отсутствовали. Парадоксально, но на более "медленной" машине EPP работал быстрее и на интегрированном порту, и на PCI. По опыту коллег, при "разгоне" скорость 2 Mб/с достижима даже на интегрированном порту.
E-mail: avlad@mailbox.riga.lv
Ваш комментарий к статье | ||||