
Рис. 7.1.Устройства с интерфейсом I2C
Стандарт I2C определяется как стандарт шины, потому что допускает подключение множества устройств друг к другу. Например, если вы уже подключили дисплей к микроконтроллеру, к той же паре контактов на «ведущем» устройстве можно подключить целое множество «ведомых» устройств. Плата Arduino выступает в роли «ведущего» устройства, а все «ведомые» устройства имеют уникальные адреса, идентифицирующие устройства на шине.
На рис. 7.2 изображена возможная схема подключения к плате Arduino двух компонентов I2C: часов реального времени и модуля дисплея.
Через интерфейс I2C можно также соединить две платы Arduino и организовать обмен данными между ними. В этом случае одна из плат должна быть настроена как ведущее устройство, а другая — как ведомое.

Рис. 7.2.Arduino управляет двумя устройствами I2C
Аппаратная часть I2C
Электрически линии соединения интерфейса I2C могут действовать подобно цифровым выходам или входам (их также называют выводами с тремя состояниями ). В третьем состоянии линии соединения не находятся ни в одном из состояний, HIGH или LOW, а имеют плавающий уровень напряжения. Кроме того, выходы являются логическими элементами с открытым коллектором , то есть они требуют использования подтягивающего сопротивления. Эти сопротивления должны иметь номинал 4,7 кОм, и только одна пара контактов на всей шине I2C должна подключаться через подтягивающее сопротивление к шине питания 3,3 В или 5 В в зависимости от уровня напряжения, на котором действует шина. Если какое-то устройство на шине имеет другое напряжение питания, для его подключения необходимо использовать преобразователь уровня напряжения. Для шины I2C можно использовать модули двунаправленного преобразования, такие как BSS138, выпускаемые компанией Adafruit (www.adafruit.com/products/757).
На разных моделях Arduino интерфейс I2C подключается к разным контактам. Например, в модели Uno используются контакты A4 и A5 — линии SDA и SCL соответственно, а в модели Leonardo используются контакты D2 и D3. (Подробнее о линиях SDA и SCL рассказывается в следующем разделе.) На обеих моделях линии SDA и SCL выводятся также на колодку, находящуюся рядом с контактом AREF (рис. 7.3).
В табл. 7.1 перечисляются наиболее распространенные модели платы Arduino и контакты, соответствующие интерфейсу I2C.

Рис. 7.3.Контакты I2C на плате Arduino Uno
Таблица 7.1.Контакты I2C в разных моделях Arduino
Модель
Контакты
Примечания
Uno
A4 (SDA) и A5 (SCL)
Контакты подписаны SCL и SDA и находятся рядом с контактом AREF. Эти линии интерфейса выводятся также на контакты A4 и A5
Leonardo
D2 (SDA) и D3 (SCL)
Контакты подписаны SCL и SDA и находятся рядом с контактом AREF. Эти линии интерфейса выводятся также на контакты D2 и D3
Mega2560
D20 (SDA) и D21 (SCL)
—
Due
D20 (SDA) и D21 (SCL)
Модель Due имеет вторую пару контактов I2C, подписанных SDA1 и SCL1
Протокол I2C
Для передачи и приема данных через интерфейс I2C используются две линии (отсюда второе название — двухпроводной интерфейс, Two Wire Interface). Эти две линии называют также тактовой линией (Serial Clock Line, SCL) и линией данных (Serial Data Line, SDA). На рис. 7.4 изображена временная диаграмма сигнала, передаваемого через интерфейс I2C.

Рис. 7.4.Временная диаграмма сигнала, передаваемого через интерфейс I2C
Ведущее устройство генерирует тактовые импульсы на линии SCL, и, когда имеются данные для передачи, отправитель (ведущее или ведомое устройство) выводит линию SDA из третьего состояния (в режим цифрового выхода) и посылает данные в виде логических нулей и единиц в моменты положительных импульсов тактового сигнала. По окончании передачи вывод тактовых импульсов может быть остановлен, и линия SDA возвращается в третье состояние.
Библиотека Wire
Можно, конечно, генерировать описанные ранее импульсы самостоятельно, управляя битами, то есть включая и выключая цифровые выходы программно. Но чтобы упростить нам жизнь, в составе программного обеспечения для Arduino имеется библиотека Wire, принимающая на себя все сложности, связанные с синхронизацией, и позволяющая нам просто посылать и принимать байты данных.
Читать дальше