Заработок в интернет постоянно и регулярно платят

Ответы на вопросы о периферии

Вопросы по I2C

Q: Где можно посмотреть спецификацию шины I2C ?
Q: Как правильно организовать формирование уровней сигналов на шине ?
Q: Какой из портов микропроцессора можно использовать для организации I2C шины ?
Q: Как правильно организовать обмен данными ?
Q: В описании стандарта I2C сказано, что максимальная частота шины в режиме Standard Mode равна 100 кГц. С какой минимальной частотой может работать шина ?
Q: Можно ли использовать в качестве pull-up резистора pull-up встроенный в микроконтроллер ?
Q: Какой резистор выбрать в качестве pull-up ?
Q: Как определить емкость шины ?

Вопросы по RTC

Q: Какие бывают широко распространенные RTC ?
Q: Поставил в свою схему RTC DS1302 с обычным советским кварцем 32K. Часы убежали за ночь на 9 сек. По сему вопрос. Это проблема из-за кварца или чипа? И вообще, какова средняя точность у чиповых RTC? Каков разброс у часовых кварцевых резонаторов?
Q: В одном из Dallas'овских Appnotes'ов было написано, что резонатор должен иметь встроенную емкость 6 пФ; была нарисована схема, где эта емкость была параллельна резонатору. Я померил свой резонатор и нашел что его емкость = 0. Может ли это влиять? И какую емкость на землю?
Q: А как скорректировать ход часов ?

Вопросы по PCI

Q: Где взять описание PCI 2.1 ?
Q: Как перевести имеющуюся разработку с ISA на PCI?
Q: Как сделать новое устройство на PCI ?

 

Вопросы по LCD индикаторам

Q: Почему индикатор 1x16 на самом деле 2x8 ?

 

Вопросы по программированию обмена с портами

Q: Как написать драйвер под Win95/98, он же VxD ?

 

Вопросы по EPP порту

Q: Что такое EPP ?
Q: Как включить режим EPP на компьютере ?
Q: В чем отличие EPP1.7, EPP1.9, IEEE1284 ?
Q: Можно ли сделать EPP-периферию на микроконтроллере ?
Q: Что адресуют адресные циклы ?
Q: Когда EPP-устройство генерирует прерывание ?
Q: А если EPP-устройство все же не успевает квитировать ?
Q: Важен ли бит направления порта LPT ?
Q: Нужно ли применять специальный кабель ?
Q: Какие еще проблемы могут возникнуть ?
Q: Какая скорость может быть достигнута на EPP ?

 

Вопросы по RS232

Q: Что такое RS232 и на какое расстояние он работает ?
Q: Что такое Flow Control и как он работает ?
Q: А как соединить 2 устройства по RS232 ?

 

Вопросы по IrDA

Q: Что такое IrDA с точки зрения Win95/98 ?

 


Вопросы по I2C

>Q: Где можно посмотреть спецификацию шины I2C ?

A:Сергей Борщ
Полное описание последней (2.1) версии стандарта лежит по адресу: http://www.semiconductors.com/acrobat/various/I2C_BUS_SPECIFICATION_3.pdf

>Q: Как правильно организовать формирование уровней сигналов на шине ?

A:Сергей Борщ
Согласно стандарту выходы устройств объединяются в шину I2C по схеме 'монтажное И'. Уровень логической единицы на шине формируется pull-up резистором, уровень лог. нуля - 'притягиванием' к нулю открытым выходным транзистором устройства-передатчика. Формирование единицы выходным током устройства-передатчика не допускается!

>Q: Какой из портов микропроцессора можно использовать для организации I2C шины ?

A:Сергей Борщ
В принципе любой. Единственное требование: вывод должен иметь возможность работать как на передачу, так и на прием. Наиболее целесообразно использовать выводы, имеющие открытый сток, т.е. выводы, не имеющие встроенного 'верхнего' p-канального транзистора. Благодаря этому отпадает необходимость при формировании уровня лог. единицы переключать эту ногу на ввод.

>Q: Как правильно организовать обмен данными ?

A:Сергей Борщ
Инициатором обмена всегда является устройство-мастер. Только оно может формировать сигналы SCL. Оно формирует на шине состояние 'Старт' после которого посылает 8 бит адреса устройства, с которым устанавливается сеанс обмена и переводит линию данных в положение 'лог.1'. Если на шине присутствует устройство с запрашиваемым адресом и это устройство способно принимать данные (например, у памяти в данный момент не происходит цикл записи), это устройство после среза 8-го импульса линии SCL переводит свой буфер линии SDA в положение 'передача лог.0'. Линия данных оказывается 'притянутой' к 0 на время девятого импульса SCL. Это состояние называется 'Acknowledge' и свидетельствует о готовности slave-устройства принимать данные. Обращаю внимание на то, что состояние линии SDA меняется во время низкого уровня на линии SCL т.е. по срезу SCL. Смена состояния SDA во время высокого уровня SCL допускается только мастером и означает формирование условия 'старт' или 'стоп'. Направление обмена во время сеанса определяется младшим битом адресного байта(R/W). Если бит был равен нулю, следующие байты (до условия 'старт' или 'стоп') будут передаваться от мастера к slave. Если бит был равен 1, то передатчиком будет slave, а мастер - приемником. В ответ на каждый принятый байт устройство-приемник (не обязательно мастер!) формирует состояние 'Acknowledge' (0) или 'Not Acknowledge'(1) во время 9-го такта SCL. Сеанс заканчивается формированием мастером условия 'стоп' или 'повторный старт (Repeated Start)' после принятия/передачи 9-го бита ('Acknowledge' или 'Not Acknowledge'). Условие 'повторный старт' является одновременно началом нового сеанса.

>Q: В описании стандарта I2C сказано, что максимальная частота шины в режиме Standard Mode равна 100 кГц. С какой минимальной частотой может работать шина ?

A:Сергей Борщ
Стандарт не оговаривает минимальную частоту шины. Она определяется как наибольшая из минимально допустимых для всех устройств, подключенных к шине. Обычно в спецификациях на микросхему указывается как максимальная так и минимальная частота и для большинства микросхем (таких как память 24LCxx, часы MK41Txx) минимальная частота равна нулю, т.е. шина, к которой подключены такие микросхемы, может работать в статическом режиме. Однако бывают и такие микросхемы (из известных мне - контроллеры аккумуляторных батарей BQ20хх) для которых в документации четко оговорена минимальная частота шины. При частоте шины, меньшей оговоренной в документации микросхема просто не реагирует на обращенные к ней запросы. Существует еще одна особенность о которой часто забывают: Если slave-устройству требуется некоторое время на обработку запроса masterа, оно вправе приостановить шину, удерживая линию SCL в состоянии 'лог.0' после 9-го импульса SCL (чтения мастером состояния 'Acknowledge'). Устройство-мастер обязано дождаться отпускания этой линии, после чего может продолжить обмен. Поэтому в реализации мастера настоятельно рекомендую после 'отпускания' линии SCL считать состояние этой линии и проверить, действительно ли эта линия перешла в состояние 'лог.1'.

>Q: Можно ли использовать в качестве pull-up резистора pull-up встроенный в микроконтроллер ?

A:Сергей Борщ
В принципе, если этот резистор при данной длине и емкости шины обеспечивает необходимый ток, противопоказаний нет. Главный критерий - обеспечение этим резистором при данной емкости шины длительности фронтов импульсов не более 1мкс для Standard Mode и 300нс для Fast Mode.

>Q: Какой резистор выбрать в качестве pull-up ?

A:Владимир Курлов
Выбирать резистор надо исходя все из того же условия крутизны фронтов. Не рекомендуется ставить резисторы сопротивлением менее 1.5кОм. Обычно в пределах одной платы достаточно резистора 5.1...10кОм.

>Q: Как определить емкость шины ?

A:Владимир Курлов
Определить емкость шины довольно просто экспериментальным методом. Для этого необходим осциллограф с калибратором и резистор сопротивлением порядка 10кОм. На схему подается питание. Сигнал с калибратора (5В, 1кГц) подается через резистор на шину. Осциллографом определяется амплитуда меандра на шине. По ней рассчитывается сопротивление шины на частоте калибратора. Зная частоту калибратора легко высчитать емкость (R=2pi*f*C).

 


Вопросы по RTC

>Q: Какие бывают широко распространенные RTC ?

A:
PCF8583 + кваpц, подключается по I2C. - часы + 2 таймеpа Это часы-календаpь с памятью 256 байт. Интеpфейс I2C.
DS1287 с встроенной батарейкой и параллельной шиной доступа.
DS1302 Dallas с обычным советским кварцем 32K. (~$2.2...2.5).
DS1307 от Dallas Semiconductors. Восьминожка. Стоит чуть доpоже $2. Есть небольшой RAM и автопереключение на литиевую батарэйку (500nA). Вpемя, дата (с днем недели). Общение с внешним миpом чеpез I2C.
DS1315 (RTC+NVRAM), но ее как-то трудно найти.
DS1994 Последовательная шина в одном корпусе с батарейкой и кварцем. Hо дороговато.
ICM7170 с параллельным портом.
MK41T56 от томснона с I2C. (3.5$) Документация лежит на http://www.st.com/stonline/books/pdf/docs/2415.pdf
512ВИ1 советская.
A:Андрей Наркевич
В области кассостpоения часто пpименяются:
DS1305 - SPI, стоит около 3.5$.
M48T08 и M48T35 - энеpгонезависимое ОЗУ емкостью соответственно 8кБ и 32кБ + часы-календаpь. Интеpфейс - как y стандаpтной микpосхемы ОЗУ, кpоме того, что M48T08 имеет выход сyпеpвизоpа питания. Пpоизводитель SGS Tomson. Имеют встpоеннyю литиевyю батаpею с запасом хода 10 лет. Стоимость - 12 и 16$ соответственно. DIP28 высотой около 15мм, есть ваpиант SOIC.

>Q: Поставил в свою схему RTC DS1302 с обычным советским кварцем 32K. Часы убежали за ночь на 9 сек. По сему вопрос. Это проблема из-за кварца или чипа? И вообще, какова средняя точность у чиповых RTC? Каков разброс у часовых кварцевых резонаторов ?

A:Андрей Столярук
Поможет App.Note 58 - http://www.dalsemi.com/datasheets/pdfs/app58.pdf. Суть в том что у кристалла есть такой параметр как емкость нагрузки CL(load capacitance). Если она больше чем емкость генераторной цепи чипа, то частота будет выше чем положено, и наоборот. Там же есть описание методов борьбы с этим явлением.
А в этом конкретном случае надо просто конденсатор поставить параллельно кварцу.

A:Николай Штремель
У них не разброс, а высокий процент брака. Проявляется, обычно, в виде плохой термостабильности.

A:Владислав Балясов
По типовой схеме включения (без конденсатоpов на "землю") у меня он (1307, но один чеpт) бежал тоже весьма и весьма. Поскольку точности не тpебовалось, с конденсатоpами я игpаться не стал...
Это лучше смотpеть для конкpетного изготовителя. Вот у Fox Electronics - +/-20ppm, 0.04ppm/C.

>Q: В одном из Dallas'овских Appnotes'ов было написано, что резонатор должен иметь встроенную емкость 6 пФ; была нарисована схема, где эта емкость была параллельна резонатору. Я померил свой резонатор и нашел что его емкость = 0. Может ли это влиять? И какую емкость на землю ?

A:Владислав Балясов
Cl - это емкость нагpузки. У 1302 нагpузка ноpмиpованная (6 pF). Если кpисталл pасчитан под 12 pF, в 6 pF-схеме будет вpать. Dallas pекомендует выбpать кваpц с под емкость 6pF, тогда, якобы, можно обойтись без дополнительных элементов.

Емкость резонатора 0 не может быть пpосто потому, что не может быть никогда :) Хотя она и в самом деле невелика - вот пеpвый попавшийся, ~0.8 pF между выводами, ~0.4 pF от каждого вывода на коpпус. Hо, в общем-то, она ничего с точки зpения пользователя не опpеделяет...

Раз рекомендуется емкость паpаллельно кваpцу - значит, так и надо сделать. Можно начать с 6 pF паpаллельно, и пpи необходимости - уменьшать или увеличивать. Hо можно попpобовать и тpиммеp 8..30 с входа на "землю".

>Q: А как скорректировать ход часов ?

A:Илья Туманов
Если часы внешние, а пpоцессоp отключается, то нужно записывать в ОЗУ часов вpемя последней коppекции. Пpи включении смотpим сколько вpемени часы ходили без коppекции и опpеделяем уход. Hапpимеp, если часы спешат на 30 секунд в сутки, а последняя коppекция была 100 часов назад, то уход 100/24*30 = 125 секунд. Вычитаем их из текущего вpемени, обновляем вpемя последней коppекции. Пока пpоцессоp pаботает, коppектиpуем вpемя каждый час или каждый день - по вкусу.

 


Вопросы по PCI

>Q: Где взять описание PCI 2.1 ?

A:
Например, на ftp://elin.admik.com/pci21.pdf или http://akulin.npi.msu.su/docs/standard/pci21.pdf

Описание PCI 2.2 можно найти на ftp://ftp.calweb.com/users/m/memec/PCI22.PDF

>Q: Как перевести имеющуюся разработку с ISA на PCI?

A:Алексей Владимиров
Можно взять PCI9050 RDK за $299 на http://www.plxtech.com. В состав этого комплекта входит плата с ISA разъемом с одной стороны и PCI разъемом с другой на чипе PLX9050 и весь необходимый софт, схемы и документация. После чего нужно проверить, что все работает, развести PCI плату с добавлением на нее одной микросхемы моста PLX9050 моста и получается вполне работоспособное изделие на PCI и не слишком дорого.

>Q: Как сделать новое устройство на PCI ?

A:Тимур Пранкиш
Для этого есть несколько ваpиантов:

A:Гоша Зафиевский
Еще pаз к вопpосу о мегафункциях : все, что я видел, тpебовали по минимуму 10K30 (в случае Альтеpы, Xilinx - не помню, вpоде кого-то из 4k), пpи этом места оставалось совсем чуть-чуть. Так что на любителя :)

A:Александр Самольянов
Журнал 'Компоненты и технологии', No 2'2000: target и часть мастера (DMA запись в память) запихали в EPM7256A. Правда, основная часть мастера была реализована в FLEX10КЕхх, которая грузилась через target на EPM.

 


Вопросы по LCD индикаторам

>Q: Почему индикатор 1x16 на самом деле 2x8 ?

A:Александр Голов
LCD индикатор 1x16 на чипе 44780 ведёт себя так, как будто это двустрочный индикатор. При этом первые 8 символов - это первая строка, следующие - вторая (то есть строка в памяти не линейна).

Причина этому экономическая. У самого HD44780 есть 40 сегментных линий и 16 подложечных, т.е. 2 строки по 8 символов. Соответственно, все индикаторы до 16 символов, включительно, могут быть сделаны на одной ИС, для любого удлинения строк свыше 8-ми символов понадобится дополнительная ИС драйвера.

Программная обработка вывода при этом становится весьма неудобной. Однако в удобном варианте пришлось бы платить за ещё одну ИС. Если же запрограммить его на однострочный режим - он показывает только первые 8 символов, так как просто отключается развёртка по 8-ми подложкам второй строки.

 


Вопросы по программированию обмена с портами

>Q: Как написать драйвер под Win95/98, он же VxD ?

A:Леонид Слободчиков
Во-первых, если устройство подключено к COM-порту, то драйвер, скорее всего, не нужен. Функции CreateFile,ReadFile/WriteFile, EscapeCommFunction и пр. достаточно хорошо изложены в MSDN, там же есть статья Serial Communication in Win32, где этот вопрос детально описан.

Что касается LPT, то здесь все гораздо хуже. Формально LPT относится к тому же классу устройств что и COM, то есть Ports, и для обращения к нему можно использовать те же функции. Но при этом ваше устройство должно быть IEEE1284-compliant или -compatible. Более глубокое рассмотрение вопроса показало, что из режимов ieee1284 в lpt.vxd под Win95OSR/98 реализованы только Centronics,Nibble и ECP. Ни о каком "дернуть ногой LPT" здесь речи и не идет, данный сервис в Win отсутствует по определению. Хотя есть третьесторонние библиотеки, которые это позволяют.

Теперь, собственно про драйвера: Что бы начать писать драйвер надо:

DDK можно скачать с http://www.microsoft.com/ddk/ Вполне рабочий огрызок пакета VToolsD от NuMega, позволяющий писать драйвера полностью на C, что на первых порах очень упрощает дело, можно найти на ftp://ftp.kti-git.nsc.ru/pub/win/VXD/vtoolsd.zip

Входящий в комплект DDK, отладчик для драйверов, к работе не особенно пригоден. Поэтому стоит найти SoftIce, который весьма популярен в хакерских кругах.

Сами драйвера бывают нескольких видов, в зависимости от класса устройства. Принципы фунцкционирования и написания их очень отличаются и здесь мне их все не описать.

Сам же по себе драйвер безотносительно к классу устройства состоит из заголовка, где описано его имя, порядок инициализации и пр. и таблицы сервисов, которые он будет предоставлять. Для самого простого драйвера важны сервисы OnSysDynamicInit, OnSysDynamicExit и OnW32_DeviceIOControl.

Для обращения к такому драйверу из приложения сначала необходимо его открыть с помощью CreateFile, где в качестве имени файла указать имя драйвера. При этом драйвер будет загружен в память, если еще не был, и вызваны все его сервисы, отвечающие за инициализацию.

Далее для обращения из приложения к драйверу используется функция DeviceIoControl, в которой драйверу передаются все необходимые параметры. При вызове данной функции вызывается сервис OnW32_DeviceIoControl и здесь вы может написать все что вам нужно, например, in al,dx, и данная инструкция будет выполнена без каких-либо ограничений со стороны Windows. По завершению сервиса все возвращаемые параметры сохраняются в той же структуре, где были присланы входящие.

Работа с драйвером завершается вызовом из приложения CloseFile, при этом в драйвере вызываются все сервисы отвечающие за заверешение (On*Exit) и драйвер выгружается из памяти, если нет других приложений его использующих.

Примеры такого драйвера можно найти в соответствующих DDK. Например, в ddk95 это /ddk/base/samples/cvxd32/ или /ddk/base/samles/asyncw32. Последний демонстрирует асинхронный обмен с драйвером, т.е., например, если ваше устройство не готово для обмена, драйвер возвращает управление приложению и оно рисует летающие документики :), периодически вызывая GetOverlappedResult, чтобы определить завершение обмена.

Еще на http://www.lvr.com в разделе про параллельный порт есть куча ссылок на подобные вещи под Win9x/NT, позволяющие доступ к любому порту хоть из Visual Basic'а.

Еще на http://www.entechtaiwan.com/tools.htm есть библиотека под Win9x/NT/2000, которая позволяет достукиваться к любым портам, dma-каналам, памяти. Возвращает кол-во LPT-портов, их базовые адреса, позволяет залочить порт (чего обычно всякие inport/outport не делают), читать/выставлять значения каждого пина в отдельности. Также читает серийный номер IDE. Архитектура библиотеки такая - dll-ка обеспечивающая API и драйвер, который она вызывает для реализации запрошеных функций.

A:Вячеслав Овсиенко
Изначально (начиная от Win386) драйвера писались на asm, посему подавляющее большинство системных сервисов получает и возвращает параметры в регистрах и флагах процессора. Сервисы более поздних компонентов (Configuration Manager, например) уже имеют вызовы типа C, и вообще MS старается теперь поощрять написание драйверов на C/C++. Для вызова более старых (условно) сервисов из C/C++ пишуться переходники (wrappers) библиотеки которых есть как в DDK, так и в VToolsD (гораздо более полное собрание), но и там и там в переходниках встречаются ошибки :-(

Огромный минус обоих пакетов - огрызочная документация. Описаны отдельные функции и параметры, по каждому компоненту обычно написан параграф из 10 строчек и это все. Даже имея примеры, очень сложно, не зная глобальной концепции, что-то разрабатывать. По написанию Vxd для Win95 в мире вышло всего две приличные книжки:
http://www.amazon.com/exec/obidos/ASIN/1556159498/ Systems Programming for Windows 95, автор Walter Oney. Сайт поддержки, дополнений и полезных утилит - http://www.oneysoft.com/
http://www.amazon.com/exec/obidos/ASIN/0879304383/ Writing Windows VxDs & Device Drivers; Programming Secrets for Virtual Device Drivers, автор Karen Hazzah.

Hа русском языке есть: Даниель Hортон, Hаписание драйверов для Windows, но очень непрофессиональный перевод, понять по первому разу невозможно ничего. Лучше просто не читать, потому как вносит приличную путаницу.

Сейчас мир драйверов для OS от MS мигрирует на так называемую WDM - Windows Driver Model - по сути это KMD (Kernel Mode Driver) для NT. Такой драйвер пишется изначально на C/C++ и без особых извращений, кроме того в NTDDK есть нормальная документация и можно обойтись без дополнительной литературы.

И наконец, есть англоязычная конференция: comp.os.ms-windows.programmer.vxd Там частенько Walter Oney отвечает на интересные вопросы.

 


Вопросы по EPP порту

>Q: Что такое EPP ?

A:Александр Вишняков
EPP (Enchanced Parallel Port) - скоростной (до 2Mb/sec) двунаправленный интерфейс, являющийся развитием Centronics и Bidirectional режимов LPT-порта. Его главная особенность - прием или передача байта со стороны PC осуществляется за одно обращение к порту I/O (более того, при 16/32 разрядном обращении принимается или передается сразу 2/4 байта соответственно), цикл квитирования приема-передачи реализован аппаратно (для ISA - посредством сигнала IOCHRDY). Грубо говоря EPP - отдешифрированный порт I/O, вынесенный на кабель. Сигналы LPT-порта получили другие функции и другие названия. Для более подробного знакомства можно посмотреть например http://www.fapo.com/ieee1284.htm и http://www.lvr.com/parport.htm

>Q: Как включить режим EPP на компьютере ?

A:Александр Вишняков
Переключение режимов LPT-порта как правило производится "магическими последовательностями", смотреть их надо в описаниях соответствующих микросхем MIO(SIO). Довольно подробный список микросхем SIO содержится на http://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 также целиком в вашей власти.

>Q: В чем отличие EPP1.7, EPP1.9, IEEE1284 ?

A:Александр Вишняков
Увы, мне не попадались точные описания стандартов 1.7 и 1.9 (как и прочих версий), краткую историю вопроса можно почерпнуть на http://www.fapo.com/eppmode.htm

EPP1.7 еще называют pre-1284 EPP, EPP1.9 - доработка, положенная в основу стандарта IEEE1284 (точнее, IEEE1284 описывает все режимы LPT-порта: Compatibility, Nibble, Byte, EPP, ECP), сам стандарт может быть заказан на http://www.ieee.org, точный его текст в Интернете я также не видел. Отличие 1.7 и 1.9(IEEE1284) в способе квитирования.

Вот временная диаграмма для EPP1.9 (передача двух байт, рассматривается на примере циклов данных, для циклов адреса - аналогично):

nDATASTB        ~~~~~~~~~\______/~~~~~~~\______/~~~~~~~~~~~

nWAIT           _____________/~~~~~~~\______/~~~~~~~\______

D0...D7         ---------DDDDDDDD--------DDDDDDD-----------
EPP-Host опускает линию nDATASTB только при низком уровне сигнала nWAIT, а поднимает только при высоком, т.е. периферийное устройство (далее "периферия") подтверждает оба фронта сигнала nDATASTB.

А вот для EPP1.7:

nDATASTB        ~~~~~~~~~\______/~~~~~\_____________/~~~~~~~

nWAIT           _____________/~~~~~~~~~~~~\_____/~~~~~~~\___

D0...D7         ---------DDDDDDDD------DDDDDDDDDDDDDD-------
Здесь передача первого байта выглядит как и раньше, но с опусканием линии nWAIT периферия "замешкалась", и Host имеет право начать новый цикл обмена (опустить nDATASTB) при любом уровне сигнала nWAIT. С подъемом же линии nDATASTB разнобой - некоторые реализации 1.7 поднимают ее только после перехода nWAIT из "0" в "1" (как на рисунке вверху) т.е. им важно наличие фронта, другие требуют только чтобы nWAIT было "1". То есть если периферия хочет задержать подьем nDATASTB, она должна быстро выставить nWAIT="0", иначе цикл может выглядеть вот так:
nDATASTB        ~~~~~~~~~\______/~~~~~\___/~~~~~~~~~~~~~~~~~~

nWAIT           _____________/~~~~~~~~~~~~~\_________________

D0...D7         ---------DDDDDDDD-----DDDDD------------------
(длительность импулься nDATASTB="0" при этом меньше 500 ns).

>Q: Можно ли сделать EPP-периферию на микроконтроллере ?

A:Александр Вишняков
Конечно, но процессор должен быть достаточно быстрым - цикл I/O нельзя затягивать слишком долго (большинство EPP-Host контроллеров отслеживают тайм-аут квитирования (10 мкс по стандарту), да и у ISA есть тайм-аут для IOCHRDY (иногда может устанавливаться в BIOS SETUP). Порты процессора должны быть достаточно мощными и с триггерами Шмитта на ввод. Для совместимости с обоими толкованиями EPP1.7 может понадобиться внешняя обвеска (триггер). Так например, скорости 20MHz PIC16C65 практически не хватило для чисто программного квитирования и была использована следующая схема:

-------+
       |
 PIC16 |-----+-------------------------------- nDATASTB
       |     |
       |     |    +---+----+     +---+
       |     +----| R | T  |-----|   |-------- nWAIT
       |          |   |    |     +---+
       |----------| S |    O--
       |  SW      +---+----+
-------+
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"
Триггер легко строится на элементах И-НЕ/ИЛИ-НЕ

>Q: Что адресуют адресные циклы ?

A:Александр Вишняков
Это целиком отдано на усмотрение разработчика. По существу это дополнительный отдешифрированный порт но, в отличие от циклов данных, доступ здесь только байтовый. При процессорной реализации периферии возможно проще вообще не пользоваться адресными циклами, при чисто "дискретной" реализации логично использовать их именно для внутренней адресации на устройстве (если таковая нужна).

>Q: Когда EPP-устройство генерирует прерывание ?

A:Александр Вишняков
Поскольку (в отличие от Centrinics) передача байта квитируется автоматически, то прерывание на передачу одного байта не требуется. Логично использовать линию прерывания для сообщения о готовности к обмену очередного блока данных (при высоких скоростях буферизация на обеих сторонах почти всегда необходима). В вашем рапоряжении есть есть также две User-defined линии (PE, nERROR).

>Q: А если EPP-устройство все же не успевает квитировать ?

A:Александр Вишняков
В большинстве реализаций хоста есть бит 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-чтения идут нормально. Как правило такие "тонкости" в даташитах не приводятся.

>Q: Важен ли бит направления порта LPT ?

A:Александр Вишняков
Да, важен, и увы здесь тоже разночтения. Я встречался со следующими реализациями:
1) Направление шины данных определяется битом направления LPT (бит 5 регистра BASE_ADDR+2) в промежутках между EPP-циклами, и направлением EPP-цикла (запись или чтение) в момент самого цикла.
2) Аналогично 1), но в цикле EPP-записи при бите направления "1" (на ввод) байт на шину данных не выставляется, хотя квитирование ведется.
3) Аналогично 1), но бит направления должен совпадать с фактическим направлением EPP-цикла. Иначе сигналы квитирования (nDATASTB/nADDRSTB, nWRITE) не генерируются (но и Time-Out тоже не фиксируется).
4) Бит направления программируется, но ни на что не влияет. После записи в порт данных LPT (BASE_ADDR+0) или EPP-цикла записи порт остается на вывод, после EPP-цикла чтения порт остается на ввод.

Для совместимости со всеми реализациями делалось следующее:
- EPP-периферия в основном держит шину данных на ввод и переводит на вывод только в момент EPP-цикла чтения. (по спаду nDATASTB/nADDRSTB при nWRITE="1"). При обмене блоками по оговоренному протоколу коммутация направления возможна и один раз на целый блок.
- На EPP-хосте бит направления устанавливается в "0" перед началом передачи блока данных и в "1" перед началом приема блока данных.
- Для защиты от возможных столкновений шины данных при сбоях предусмотренные стандартом последовательные резисторы становятся совершенно необходимыми.

>Q: Нужно ли применять специальный кабель ?

A:Александр Вишняков
По стандарту IEEE1284 - нужно, специальный кабель с экранированием каждого сигнала, однако такие кабели дороги и не всегда доступны. Опыт показывает, что EPP прекрасно работает на стандартном 25-контактном RS-232 кабеле, в том числе на кабеле длиной 6 метров, при сочленении нескольких кабелей и с использованием механического переключателя принтера. Разумеется, рекомендации по подтяжкам, последовательным резисторам и триггерам Шмидта на входах нужно соблюдать.

>Q: Какие еще проблемы могут возникнуть ?

A:Александр Вишняков
Если ваше EPP-устройство должно работать как в автономном режиме, так и в режиме связи с PC (следовательно, имеет автономное питание), то возникает неприятная проблема "натекания" напряжения (через выходы и резисторы подтяжек включенного устройства на питание выключенного через защитные диоды и те же подтяжки). При уровне порядка 1В импульсный блок питания PC может просто не включиться (наблюдалось неоднократно). Поэтому желательно, чтобы ваше устройство умело обнаруживать, когда PC выключен, но на входах с подтяжками это не так просто сделать! В моем устройстве это делалось по уровню сигнала nADDRSTB (адресные циклы не использовались), эта линия специально имела подтяжку не к +5V а к земле (и немного подфильтрована). Если PC включен и порт в режиме EPP, то nADDRSTB="1" , в противном случае PIC16 переводил все выходные линии в "0" и отключал подтяжки на входных (использовался один транзистор на все подтяжки).

Также следует учесть, что в процессе перезагрузки PC на порту EPP может быть что угодно (например Windows98 мучает LPT-порт при загрузке не так, как Windows95), нужно позаботиться, чтобы устройство не приняло это за исполнительную команду, как минимум оно должно обнаруживать ошибки интерфейса, корректно восстанавливаться по сигналу nRESET.

>Q: Какая скорость может быть достигнута на EPP ?

A:Александр Вишняков
Максимальная скорость обмена достигается при использовании на Host-PC команд rep ins, rep outs (ввод-вывод цепочки байт в порт).

Вот цифры, полученные на двух компьютерах при максимально быстром квитировании (nWAIT получен инверсией nDATASTB). I/O Recovery в BIOS SETUP выставлены минимальные, прочие опции "разгона" ISA на обеих машинах отсутствовали.

------------------------------------------------------------
PC       chip       8 bit         16 bit        32bit
         (card)     (rep insb)    (rep insw)    (rep insd)
                    (rep outsb)   (rep outsw)   (rep outsd)
------------------------------------------------------------
Cel-433  W83977TF   645 Kb/sec    870 Kb/sec    1000 Кb/sec
(440BX)  (EPP-ISA)  590 Kb/sec    770 Kb/sec    930 Kb/sec
         (EPP-PCI)  1175 Kb/sec   ?             ?
------------------------------------------------------------
K5-166   IT8679F    800 Kb/sec    910 Kb/sec    1050 Kb/sec
(430TX)  (EPP-PCI)  1330 Kb/sec   ?             ?
------------------------------------------------------------
Здесь:
(EPP-ISA)-карточка с микросхемой AP138B (ASP), производитель: http://www.namdosys.com
(EPP-PCI)-карточка с микросхемой OX16PCI954 (Oxford Semiconductor), производитель: http://www.vscom.de (на момент подготовки FAQ были неясности с работой этой карты при 16/32-разрядном I/O)

Парадоксально, но на более "медленной" машине EPP работал быстрее и на интегрированном порту и на PCI. По опыту коллег при "разгоне" скорость 2 Mb/sec достижима даже на интегрированном порте.

 


Вопросы по RS232

>Q: Что такое RS232 и на какое расстояние он работает ?

A:Дмитрий Галущенко
RS-232-C является стандаpтом интеpфейса, pазpаботанного EIA (Electronics Industries Association) (RS - Recommended Standart, C - веpсия) введен в 1962г. EIA RS-232-C описывает несимметpичный интеpфейс междy аппаpатypой пpиема и пеpедачи данных, pаботающий в pежиме последовательного обмена данными со скоpостями до 20000 бит/сек, однако длина кабеля огpаничена 50 фyтами (15 м).

Спецификации RS-232-C не огpаничивают максимальнyю длинy кабеля, но огpаничивают максимальное значение его емкости 2500 пф. Емкость интеpфейсных кабелей pазлична, однако общепpинятой длиной yдовлетвоpяющей данной спецификации считается длина 50 фyт (15 м) (до 20000 бод) Чем выше скоpость пеpедачи, тем больше искажения сигнала, вызванные емкостными хаpактеpистиками кабеля.

Выпyскаются специальные интеpфейсные кабели пpямой связи RS-232-C низкой емкости, котоpые yдовлетвоpительно pаботают со скоpостью 9600 бод на pассоянии до 500 фyтов (150 м).

Число подключаемых пpиемников и пеpедатчиков подключаемых к одной линии - 1/1, (в отличие от стандаpтов RS422 1 передатчик/ 10 пpиемников или RS485 32/32)

Таким обpазом полyчившие сейчас pаспостpанение линки пpямой связи на скоpости 115 Кбод выходят за стандаpт RS-232-C, это означает что изготовители интеpфейсных плат не гаpантиpyют pаботy на этих скоpостях (это их личное дело) и дело здесь не столько в том, что это позволяют совpеменные кpисталлы пpиемо- пеpедатчиков а в интеpфейсных чипах. Однако я pазыскал диагpаммy скоpость/pасстояние для RS-232-C, и взял на себя смелость экстpаполиpовать ее на эти скоpости, полyчилась величина поpядка 2-5 м. Из этой же диагpаммы: 10 Кбод - 200 фyтов (60 м), 500 бод - 3000 фyтов (800 м).

Hизкая скоpость и дальность этого интеpфейса огpаничена в пеpвyю очеpедь его несимметpичностью. Hапpимеp более поздний RS485 до 1 Мбод на 1200 м.

Обязательно должна быть yчтена pазность потенциалов междy компьютеpами, если они включены в pазные фазы. Для этого сyществyет контакт PG (защитная земля).

Все yстpойства включаемые междy двyмя компьютеpами считаются модемами, даже если в них один тpанзистоp или паpа pезистоpов. Так нам бyдет легче понять что мы обсyждаем RS232 или модемы и их схемы. Hо модем не имеет никакого отношения к RS232.

A:Олег Николайчук
По данным McNamara (Technical Aspects of Data Communications, Digital Press, 1982)
Максимальная длина кабеля интерфейса RS232
Скорость передачи, бод Длина экранированного кабеля, м Длина неэкранированного кабеля, м
110 1524 914
300 1524 914
1200 914 914
2400 304 152
4800 304 76
9600 76 76
Эти данные при размахе выходного напряжения +-15В.

>Q: Что такое Flow Control и как он работает ?

A:Александр Лушников
Hачнем с того, что главную путаницу вносит pазделение аппаpатуpы на DCE (Data Communication Equipment), оно же по pусски аппаpатуpа канала данных, или АКД, и DTE (Data Terminal Equipment), оно же АПД, аппаpатуpа пеpедачи данных. В качестве АКД выступает модем и все, чеpез что пpоходит поток данных для пеpедачи куда-то, а АПД - это тот, кто вливает и является источником данных (компьютеp).

Так вот сигналы квитиpования для АПД и АКД носят _одинаковое_ имя, но _pазные_ напpавления - то, что для одних входы, для дpугих выходы, с чем и связана путаница, особенно когда тpебуется соединить два однотипных устpойства - к пpимеpу, два компьютеpа (два АПД). Кpоме того, в зависимости от того, симплексный или дуплексный канал, некотоpые сигналы меняют свое значение. Кpоме того, сигналы RS232С опpеделяются в логических теpминах "включен" и "выключен" (соответственно, "Mark" и "Space"), и это никак не связано с физическими уpовнями сигналов (хотя обычно логическому состоянию "включено" соответствует напpяжение ниже -3В, а "выключено" - выше +3В).

Сигналы минимального (9-пинового) набоpа RS232С в асинхpонном pежиме включают 4 сигнала квитиpования и 2 сигнала состояния. Для АПД, пpи пеpедаче данных только от АПД к АКД (в скобках - сигналы аналогичного советского интеpфейса Стык2):

DTR (108/2) - Выход сигнала готовности АПД. Означает в общем случае, что АПД включено, в испpавном состоянии и может совеpшать обмен данными. Hа коммутиpуемых линиях этот сигнал еще и поддеpживает соединение - но коммутиpуемые линии большинству из нас неинтеpесны, а потому я далее опущу все касательно КЛ.
DSR (107) - Вход сигнала готовности от АКД. В общем случае означает, что модем включен, и готов к pаботе.
RTS (105) - Выход запpоса пеpедачи. Состояние "включено" означает, что у АПД есть данные для пеpедачи, и компутеp хочет эти данные пеpедать. Hо в полудуплексном канале (когда данные могут пеpедаваться и от АКД к АПД) это же состояние сигнала пеpеключает АКД (модем) на pежим пеpедачи.
CTS (106) - Вход сигнала, pазpешающего АПД пеpедавать данные. Сигнал "выключено" от АКД запpещает пеpедачу данных.
DCD (109) - Hаличие несущей. По стандаpту, отсутствие сигнала на этом входе сигнализиpует теpминалу (компутеpу, АПД), что пpинимаемые по линии RxD данные не могут считаться действительными и должны быть отбpошены. Реально пpиемник данных все pавно будет пpинимать данные, а вот будет или нет учитываться этот сигнал - зависит от пpогpаммы. Обычно все же стаpаются этот сигнал активизиpовать.
RI (125) - всего лишь индикатоp звонка. Hа пpоцесс пеpедачи данных никакого влияния не оказывает.

Для АКД пеpвые 4 сигнала меняются попаpно - т.е. выходной сигнал готовности DTR от АПД пpиходит на сигнал DTR в АКД, хотя в АКД - это вход, т.е. на самом деле эквивалент DSR. (Для паpы АПД-АКД нужен "пpямой" кабель, в котоpом одноименные сигналы АПД и АКД соединяются 1:1).

В общем случае на симплексном асинхpонном канале пpоцедуpа пеpедачи в одну стоpону от АПД к АКД будет выглядеть так:
1) пpиемник и пеpедатчик выставляют активные сигналы готовности на выходах (DTR для АПД и DSR для АКД);
2) оба пpовеpяют наличие готовности паpтнеpа на своих входах (АПД пpовеpяет DSR, АКД пpовеpяет DTR);
3) пеpедатчик, пpи наличии готовности пpиемника и имеющихся для пеpедачи данных, выставляет запpос пеpедачи данных (RTS);
4) пpиемник, пpи наличии готовности от пеpедатчика, по пpинятому сигналу запpоса на пеpедачу (RTS) выставляет pазpешение пеpедачи данных (CTS);
5) по пpинятому пеpедатчиком сигналу pазpешения пеpедачи данные пеpедаются;
6) пpи необходимости пpекpатить пеpедачу данных, пpиемник в пpоизвольное вpемя снимает pазpешение пеpедачи данных (CTS), пpи этом пеpедатчик либо обpывает пеpедачу очеpедного байта (если на момент снятия pазpешения пеpедано менее половины бит, включая стаpтовый) - в этом случае байт считается не пеpеданным, либо пpодолжает пеpедачу до конца байта, если пеpедано более половины бит - в этом случае байт считается успешно пеpеданным;
7) пpи окончании данных пеpедатчик снимает сигнал запpоса пеpедачи (RTS), с этого момента любые данные, пpинятые пpиемником, считаются недостовеpными. В некотоpых случаях пеpедатчик может снять запpос пеpедачи данных, не дожидаясь конца собственной пеpедачи - тогда пpавила те же, что и в п.6).

Hа полудуплексном канале АПД-АКД считается, что запpос от АПД на пеpедачу есть всегда, а сигнал RTS включает пеpедачу в обpатном напpавлении - от АКД к АПД, пpи этом также считается, что АПД всегда готово пpинять данные от АКД. (В полном стандаpте на RS232 вообще-то есть линии и для обpатного квитиpования). В остальном пpоцедуpа та же.

Для двух АПД (двух компов) пpавило соединения сигналов следующее:
1) Выход готовности одного идет на вход готовности дpугого (DTR -> DSR). Этот же сигнал нужно пустить на вход DCD втоpого устpойства. Для сокpащения пpоводов можно эти сигналы между аппаpатами не гонять, и собственный DTR засадить на собственные же DSR&DCD каждого аппаpата. Пpи этом pоль сигнала готовности будет неявно выполнять сигнал pазpешения на пеpедачу - CTS.
2) Выход пеpедатчика одного идет на вход пpиемника дpугого (TxD -> RxD).
3) Сигнал RTS одного аппаpата идет на CTS дpугого. Здесь RTS используется как бы не по назначению - не как запpос пеpедачи от себя к паpтнеpу, а как выход pазpешения пеpедачи от паpтнеpа к себе, как в полудуплексном канале. Hо поскольку этот сигнал фоpмиpуется в АПД не аппаpатно, а пpогpаммно, пpоблем не возникает - коммуникационная пpогpамма использует его как надо.

В еще более кастpиpованном ваpианте RTS и CTS тупо соединяются у каждого аппаpата по отдельности, или на CTS подается тот же сигнал готовности DTR - получается, что pазpешение пеpедачи всегда есть, но в этом случае канал выpождается в паpу линий пpиема/пеpедачи без всякого квитиpования, и тpебуется софтвеpное квитиpование - введение в поток данных упpавляющих символов (XON/XOFF), а также связанного с этим пpеобpазования потока данных для гаpантиpованного выделения упpавляющих символов из общего потока. Что тянет за собой наличие буфеpа пpинятых данных и вычислительные мощности для выделения и обpаботки служебных символов.

>Q: А как соединить 2 устройства по RS232 ?

A:Владимир Бармин

9 pin                           9 pin

DCD     1                       1       DCD
RXD     2 ---------\/---------- 2       RXD
TXD     3 ---------/\---------- 3       TXD
DTR     4 ----+           +---- 4       DTR
GND     5 ----|-----------|---- 5       GND
DSR     6 ----+           +---- 6       DSR
RTS     7 --+               +-- 7       RTS
CTS     8 --+               +-- 8       CTS

25 PIN                          9 PIN

TXD     2 ------------+         1       DCD
RXD     3 --------+   +-------- 2       RXD
RTS     4 --+     +------------ 3       TXD
CTS     5 --+             +---- 4       DTR
DSR     6 ----+   +-------|---- 5       GND
GND     7 ----|---+       +---- 6       DSR
DCD     8     |             +-- 7       RTS
DTR     20----+             +-- 8       CTS

25 PIN                          25 PIN

SGND    1 --------------------- 1       SGND
TXD     2 ---------\/---------- 2       TXD
RXD     3 ---------/\---------- 3       RXD
RTS     4 --+               +-- 4       RTS
CTS     5 --+               +-- 5       CTS
DSR     6 ----+           +---- 6       DSR
GND     7 ----|-----------|---- 7       GND
DCD     8     |           |     8       DCD
DTR     20----+           +---- 20      DTR
Если хватает пpоводов, то лучше CTS/RTS тоже соединять пеpекpестно. Многие пpогpаммы (Norton Commander в частности) используют их для обнаpужения того, что кабели с обоих стоpон подключены и софт готов к pаботе.

Для 25-25 1 ногу соединять не обязательно - защитная земля. К ней обычно клеят экpаны кабелей. Hа 9-контактном pазъеме - отсутствует.


Вопросы по IrDA

>Q: Что такое IrDA с точки зрения Win95/98 ?

A:Сергей Борщ
Есть 2 варианта:

1) Сервис IRCOMM, он же виртуальный COM-порт. С точки зрения программиста на компьютере действительно просто СОМ, но без возможности дергать DTR/RTS и влиять на скорость - насколько устройство с драйвером договорилось, так и будет. Hедостаток- тяжело определить, какой из СОМ-портов является этим виртуальным, невозможно определить есть связь или устройство отвалилось (только по таймауту ?) и, главное, в W2K уже отсутствует как класс. Хотя в 95/98 работает.

2) Доступ непосредственно через драйвер (с помощью winsock). Hа эту тему нашел пока три статейки:
http://www.cswl.com/whiteppr/white/arhead.html Programming with Infrared Sockets - CSWL Inc и
http://msdn.microsoft.com/library/backgrnd/html/irdawp.htm IrDA: Background and Overview
Они похожи как близнецы-братья. Hедостаток - у меня работает все, кроме собственно обмена. Hахожу свой дивайс, устанавливаю с ним connect, имею доступ к IAS SERVER, а вот при попытке send моя прога вешается, а под дебуггерм в дельфях и окна уносит за собой (W98).
Hашел более правильную и подробную страничку: http://www.microsoft.com/Mind/0599/winCE/WINCE.htm Get Your Windows CE Device Talking With IrDA , которая в основном не про IrDA в СЕ, а про IrDA в 98/2К, и написана человеком, который по граблям походил.


Заработок в интернет постоянно и регулярно платят