Последовательный интерфейс I2C

June 27, 2010 by admin Комментировать »

Собственно термин I2C принадлежит фирме Phillips, которая придумала этот интерфейс, а в описаниях AVR «местный» вариант I2C называют TWI (от two-wire, «двухпроводной»). Мы не будем вдаваться в тонкости различий этих протоколов, потому что для нас они, по большому счету, не важны — главное, что они полностью совместимы, и все внешние устройства, имею­щие интерфейс I2C, будут работать с AVR. Потому во избежание путаницы мы всегда будем использовать более распространенный термин I2C, тем бо­лее что встроенный вариант интерфейса TWI мы не будем применять, огра­ничившись его программной имитацией.

Этот интерфейс использует два сигнальных провода, как и UART (плюс, ко­нечно, «землю», поэтому физически это трехпроводной интерфейс, а не двухпроводной, как его часто называют), только по одному из них (SCL) все­гда передаются синхронизирующие импульсы, а по второму (SDA) — собст­венно информация. Информация в каждый данный момент времени переда­ется только одним устройством и только в одну сторону, с помощью I2C может быть (теоретически) соединено до 128 устройств, как показано на рис. 21.6. «Подтягивающие» резисторы должны иметь номинал порядка еди­ниц или десятков килоом (чем выше скорость передачи, тем меньше). В ка­честве их можно использовать встроенные резисторы выходных линий пор­тов AVR, но автор не рекомендует это делать — их номинал слишком велик для обычных скоростей передачи (см. далее).

Обратите внимание, что все устройства в этом случае обязаны иметь выход с «открытым коллектором», а привязка к шине питания обеспечивается парой внешних резисторов. Как мы знаем, выходы портов AVR построены иначе — по схеме с симметричным КМОП-выходом и третьим состоянием. Чтобы обеспечить совместимость с «открытым коллектором», здесь используют хитрый прием: состояние разрыва (выключенного транзистора на выходе) имитируется установкой выхода в третье состояние, то есть фактически — в режим вывода порта на вход, а включенное состояние — установкой вывода порта на выход и при этом обязательно в состояние логического нуля.

clip_image002

Рис. 21.6. Соединение устройств по интерфейсу I2C (общий провод не показан)

clip_image004

Рис. 21.7. Обмен информацией по интерфейсу

clip_image006

Для того чтобы избежать конфликтов, во всех таких протоколах какое-то од­но устройство может выставить себя главным — Master (ведущим) Оно мо­жет тогда инициализировать процесс обмена данными, выставляя на шину адрес того устройства, от которого желательно получить информацию — ве­домого (Slave, что значит «слуга»). Все остальные устройства при этом мол­чат, и таким образом налаживается двусторонний обмен. В принципе «масте­ром» может объявить себя любое устройство, но в простейшем случае это, естественно, микроконтроллер, а ведомыми при этом выступают другие мик­росхемы.

Разумеется, чтобы обеспечить различение нескольких устройств, каждое из них обязано иметь индивидуальный адрес. Он задается 7-битным кодом (вось­мой, младший бит байта адреса используется в других целях, как мы увидим), потому-то всего таких устройств на одной линии и может быть 128. Адрес этот задается еще изготовителем, и хотя в самом AVR он может быть, разумеется, задан программно, для наших целей это не потребуется — контроллер у нас всегда будет выступать «мастером», а ему свой адрес не требуется.

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

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

Заметим, что сигналы SCL совершенно необязательно должны представлять собой равномерный меандр со скважностью 2— период их следования в принципе ничем не ограничен, кроме «терпения» приемника, который, есте­ственно, ждет сигнала какое-то ограниченное время (иначе при нарушении протокола программа может зависнуть). Более подробно мы разбирать про­токол не будем, так как вы легко можете найти его изложение в описании любого устройства, которое этот протокол поддерживает (в том числе и в описаниях AVR, изложенных по-русски в книге [8]).

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

Организовать обмен по интерфейсу I2C можно различными способами, и еще недавно это была исключительно программная эмуляция протокола. В AVR семейства Mega интерфейс I2C (TWI) реализован аппаратно. Реализация эта, впрочем, не очень удобна, и программа получается даже более громоздкой, чем при программной эмуляции. Единственное, чего мы лишаемся при про­граммной эмуляции — это возможности «будить» контроллер, находящийся в «спящем» режиме, обращением к нему через TWI, но нам это не понадо­бится, так как контроллер у нас всегда находится в режиме ведущего.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты