Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Обратите внимание, что все устройства в этом случае обязаны иметь выход с "открытым коллектором", а привязка к шине питания обеспечивается парой внешних резисторов. Как мы знаем, выходы портов AVR построены иначе — по симметричной КМОП-схеме с третьим состоянием. Чтобы обеспечить совместимость с "открытым коллектором", и в программной имитации 12С, и в аппаратном TWI предусмотрен хитрый прием: состояние разрыва (выключенного транзистора на выходе) имитируется установкой выхода в третье состояние, т. е. фактически — в режим вывода порта на вход, а включенное состояние — установкой вывода порта на выход и при этом обязательно в состояние логического нуля. Чтобы различить несколько устройств, каждое из них обязано иметь индивидуальный адрес. Он задается 7-битовым кодом (восьмой бит байта адреса служит для других целей, как мы увидим далее), потому всего таких устройств на одной линии может быть 128. Этот адрес обычно задает изготовитель (в некоторых случаях его можно изменить программно или внешними соединениями). За право присвоения индивидуального адреса изготовитель по сей день, кажется, платит лицензионные отчисления фирме Philips. В самом AVR он, разумеется, задается программно, но для наших целей это не потребуется, т. к. "мастер" (МК) у нас один, и "ведомые" устройства не будут к нему обращаться.

Типовой вариант обмена информацией по интерфейсу 12С показан на рис. 12.2. Кратко расшифруем эту диаграмму. Любой сеанс передачи по протоколу 12С начинается с состояния линии, именуемого Start (когда сигнал на линии SDA меняется с лог. 1 на лог. О при высоком уровне на линии SCL). Start может выдаваться неоднократно (тогда он называется "повторный старт"). Заканчивается сеанс сигналом Stop (состояние линии SDA меняется с лог. О на лог. 1 при высоком уровне на линии SCL). Между этими сигналами линия считается занятой, и только ведущий (тот, который выдал сигнал Start) может управлять ею1. Сама информация передается уровнями на линии SDA (в обычной положительной логике, старший разряд первым), причем смена состояний может происходить только при низком уровне на SCL, а при высоком уровне на ней происходит считывание значения бита. Любая смена уровней SDA при высоком уровне SCL будет воспринята как либо Start, либо Stop.

Процесс обмена всегда начинается с передачи ведущим байта, содержащего адрес устройства (также начиная со старшего разряда), который содержится в семи старших битах. Первый (младший!) бит этого байта называется R/W и несет информацию о направлении обмена: если он равен 0, то далее ведущий будет передавать информацию, т. е. писать (W), если равен 1 — читать (R), т. е. ожидать данные от ведомого. Все посылки (и адресные, и содержащие данные) сопровождаются девятым битом, который передается последним и называется битом квитирования. Во время действия этого девятого импульса адресуемое устройство (т. е. ведомый, который имеет нужный адрес после посылки адреса ведущим, или ведущий, если данные направлены к нему, и т. п.) обязан сформировать ответ (АСК) низким уровнем на линии SDA.

Хотя это и не совсем так, но здесь мы не будем углубляться, за подробностями я отсылаю читателя к [2].
Если такого ответа нет (NACK), то можно считать, что данные не приняты и фиксировать сбой на линии. Иногда устройства не требуют отсылки бита АСК (или игнорируют его), и это учтено в процедурах, которые рассмотрены далее.
Заметим, что сигналы SCL необязательно должны представлять собой равномерный меандр со скважностью 2 — период их следования в принципе ничем не ограничен, кроме "терпения" приемника, который, естественно, ждет сигнала какое-то ограниченное время (иначе при нарушении протокола программа может зависнуть). Более подробно мы разбирать протокол не будем, т. к. вы легко можете найти его изложение в описании любого устройства, которое этот протокол поддерживает (в том числе и в описаниях AVR, изложенных по-русски в книге [2]).

Как видим, организовать обмен по протоколу 12С непросто, но это плата за универсальность и простоту электрической схемы. Большинство современных устройств с интерфейсом 12С могут работать с тактовой частотой до 400 кГц и более, но из-за не слишком высокой помехоустойчивости такой линии максимальные частоты целесообразны только тогда, когда микросхемы установлены на одной плате недалеко друг от друга. При соединении проводами (например, МК с каким-нибудь датчиком) лучше ограничиться частотами до 100 кГц, а при длинных линиях связи (провода в полметра длиной и более), частоту обмена следует снизить до 10-30 кГц.

Программная эмуляция протокола 12С
Здесь мы рассмотрим только программную эмуляцию протокола. Наша задача будет формулироваться так: есть контроллер, и есть некое (одно или более) внешнее устройство. Нужно прочесть/записать данные. Контроллер тут всегда будет выступать как Master, а устройство — как Slave. Для того чтобы программно эмулировать протокол I С, нам тогда -придется сначала решить вопрос о том, как формировать тактирующую последовательность на линии SCL.
В принципе это можно сделать с помощью таймера, но на самом деле это неудобно — и таймеры обычно заняты более полезными делами, и нет тут у нас каких-то жестких требований ни к стабильности, ни к форме сигнала. Потому мы воспользуется способом формирования временной задержки на основе пустого цикла (см. главу 5). Для формирования импульса будем использовать счетчик cnt (пусть это будет регистр из числа старших— от г1б до r3l). Тогда простейший пустой цикл, повторенный NN раз, запишется так:
ldi cnt,NN cyk_delay: dec cnt brne cykjdelay



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru