Главная
Новости рынка
Рубрикатор



Архив новостей -->



 



   

Fчасто Aзадаваемые Qвопросы

Одним из полезных ресурсов для разработчиков электронной техники является конференция сети 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

  1. Исходно (при nDATASTB = "1") , SW = "0" , nWAIT = "0".
  2. При переходе nDATASTB из "1" в "0", nWAIT остаётся в "0", PIC обнаруживает этот переход, считывает или выставляет байт данных и затем даёт короткий импульс "1" по линии SW (SetWait), что приводит к установке nWAIT = "1".
  3. 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?

Да, важен, и, увы, здесь тоже разночтения. Я встречался со следующими реализациями:

  1. Направление шины данных определяется битом направления LPT (бит 5 регистра BASE_ADDR+2) в промежутках между EPP-циклами, и направлением EPP-цикла (запись или чтение) в момент самого цикла.
  2. Аналогично 1), но в цикле EPP-записи при бите направления iа1lа (на ввод) байт на шину данных не выставляется, хотя квитирование ведётся.
  3. Аналогично 1), но бит направления должен совпадать с фактическим направлением EPP-цикла. Иначе сигналы квитирования (nDATASTB/nADDRSTB, nWRITE) не генерируются (но и Time-Out тоже не фиксируется).
  4. Бит направления программируется, но ни на что не влияет. После записи в порт данных 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







Реклама на сайте
тел.: +7 (495) 514 4110. e-mail:admin@eust.ru
1998-2014 ООО Рынок микроэлектроники