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

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

    Одним из полезных ресурсов для разработчиков электронной техники является конференция сети FIDONET RU.EMBEDDED (fido7.ru.embedded), которая также доступна в Интернете, например, через сервера или Конференция посвящена вопросам, связанным со встроенными системами, микроконтроллерами и другими компонентами этих систем, их разработкой, кросс-программированием, отладкой, тестированием: хард, софт, инструментарий, проблемы, возникающие при разработке и использовании, схемы, алгоритмы, исходные тексты, ноу-хау. По адресу находится FAQ конференции ┼ ответы на часто задаваемые вопросы, которые пишут сами участники. Ведет FAQ Алексей Владимиров ( Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ). Мы начинаем публиковать выдержки из FAQ. Сегодня на вопросы о EPP отвечает Александр Вишняков.

    Что такое EPP?

    EPP (Enchanced Parallel Port ) - скоростной (до 2 Мб/с) двунаправленный интерфейс, являющийся развитием Centronics и Bidirectional режимов LPT-порта. Его главная особенность - прием или передача байта со стороны PC осуществляется за одно обращение к порту I/O (более того, при 16/32-разрядном обращении принимается или передается сразу 2/4 байта, соответственно), цикл квитирования приема-передачи реализован аппаратно (для ISA - посредством сигнала IOCHRDY). Грубо говоря, EPP - отдешифрированный порт I/O, вынесенный на кабель. Сигналы LPT-порта получили другие функции и другие названия. Для более подробного знакомства можно посмотреть, например, и

    Как включить режим 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?

    Краткую историю вопроса можно почерпнуть на EPP1.7 еще называют pre-1284 EPP, EPP1.9 - доработка, положенная в основу стандарта IEEE1284 (точнее, IEEE1284 описывает все режимы LPT-порта: Compatibility, Nibble, Byte, EPP, ECP), сам стандарт может быть заказан на , точный его текст в Интернете я не видел. Отличие 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), производитель -

    ** ) (EPP-PCI) - карточка с микросхемой OX16PCI954 (Oxford Semiconductor), производитель - (на момент подготовки FAQ были неясности с работой этой карты при 16/32-разрядном I/O).

    I/O Recovery в BIOS SETUP выставлены минимальные, прочие опции "разгона" ISA на обеих машинах отсутствовали. Парадоксально, но на более "медленной" машине EPP работал быстрее и на интегрированном порту, и на PCI. По опыту коллег, при "разгоне" скорость 2 Mб/с достижима даже на интегрированном порту.

E-mail: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript







Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.