Главная > Электроника и компоненты > |
EMBEDDED FAQ: Периферия |
Секция 1 из 2 - Предыдущая - Следующая
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'). Условие 'повторный
старт' является одновременно началом
нового сеанса.
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).
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.
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.
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емя каждый час или каждый день
- по вкусу.
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:Александр Самольянов
Журнал 'Компоненты и технологии', No 2'2000: target
и часть мастера (DMA запись в память) запихали
в EPM7256A. Правда, основная часть мастера была
реализована в FLEX10КЕхх, которая грузилась
через target на EPM.
A:Александр Голов
LCD индикатор 1x16 на чипе 44780 ведёт себя так,
как будто это двустрочный индикатор. При
этом первые 8 символов - это первая строка,
следующие - вторая (то есть строка в памяти
не линейна).
Причина этому экономическая. У самого HD44780 есть 40 сегментных линий и 16 подложечных, т.е. 2 строки по 8 символов. Соответственно, все индикаторы до 16 символов, включительно, могут быть сделаны на одной ИС, для любого удлинения строк свыше 8-ми символов понадобится дополнительная ИС драйвера.
Программная обработка вывода при этом становится весьма неудобной. Однако в удобном варианте пришлось бы платить за ещё одну ИС. Если же запрограммить его на однострочный режим - он показывает только первые 8 символов, так как просто отключается развёртка по 8-ми подложкам второй строки.
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, отладчик для драйверов, к работе не особенно пригоден. Поэтому стоит найти 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 отвечает на интересные вопросы.
Секция 1 из 2 - Предыдущая - Следующая
Вернуться в раздел "Электроника и компоненты" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |