Рейтинг@Mail.ru
Логотип шины I2C
Логотип шины I2C

Интерфейс I2C и Arduino

В этой статье мы рассмотрим, что такое интерфейс I2C (ай-ту-си, и-два-цэ), в чём его особенности и как с ним работать.

Инструкция по использованию протокола I2C совместно с Arduino

Вам понадобится

  • Arduino;
  • цифровой потенциометр AD5171;
  • светодиод;
  • резистор на 220 Ом;
  • 2 резистора по 4,7 кОм;
  • соединительные провода.

1Описание интерфейса I2C

Последовательный протокол обмена данными IIC (также называемый I2C – Inter-Integrated Circuits, межмикросхемное соединение) использует для передачи данных две двунаправленные линии связи, которые называются шина последовательных данных SDA (Serial Data) и шина тактирования SCL (Serial Clock). Также имеются две линии для питания. Шины SDA и SCL подтягиваются к шине питания через резисторы.

В сети есть хотя бы одно ведущее устройство (Master), которое инициализирует передачу данных и генерирует сигналы синхронизации. В сети также есть ведомые устройства (Slave), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Адрес устройства указывается в паспорте (datasheet). К одной шине I2C может быть подключено до 127 устройств, в том числе несколько ведущих. К шине можно подключать устройства в процессе работы, т.е. она поддерживает «горячее подключение».

Описание интерфейса I2C
Описание интерфейса I2C

Давайте рассмотрим временную диаграмму обмена по протоколу I2C. Есть несколько различающихся вариантов, рассмотрим один из распространённых. Воспользуемся логическим анализатором, подключённым к шинам SCL и SDA.

Мастер инициирует обмен. Для этого он начинает генерировать тактовые импульсы и посылает их по линии SCL пачкой из 9-ти штук. Одновременно на линии данных SDA он выставляет адрес устройства, с которым необходимо установить связь, которые тактируются первыми 7-ми тактовыми импульсами (отсюда ограничение на диапазон адресов: 27 = 128 минус нулевой адрес). Следующий бит посылки – это код операции (чтение или запись) и ещё один бит – бит подтверждения (ACK), что ведомое устройство приняло запрос. Если бит подтверждения не пришёл, на этом обмен заканчивается. Или мастер продолжает посылать повторные запросы.

Это проиллюстрировано на рисунке ниже. Задача такая: подключиться к ведомому устройству с адресом 0x27 и передать ему строку "SOLTAU.RU". В первом случае, для примера, отключим ведомое устройство от шины. Видно, что мастер пытается установить связь с устройством с адресом 0x27, но не получает подтверждения (NAK). Обмен заканчивается.

Попытка мастера установить соединение с ведомым по I2C
Попытка мастера установить соединение с ведомым по I2C

Теперь подключим к шине I2C ведомое устройство и повторим операцию. Ситуация изменилась. На первый пакет с адресом пришло подтверждение (ACK) от ведомого. Обмен продолжился. Информация передаётся также 9-битовыми посылками, но теперь 8 битов занимают данные и 1 бит – бит подтверждения получения ведомым каждого байта данных. Если в какой-то момент связь оборвётся и бит подтверждения не придёт, мастер прекратит передачу.

Временная диаграмма обмена по протоколу I2C
Временная диаграмма обмена по протоколу I2C

2Реализация I2Cв Arduino

Arduino использует для работы по интерфейсу I2C два порта. Например, в Arduino UNO и Arduino Nano аналоговый порт A4 соответствует SDA, аналоговый порт A5 соответствует SCL.

Реализация I2C в Arduino UNO и Nano
Реализация I2C в Arduino UNO и Nano

Для других моделей плат соответствие выводов такое:

ПлатаПин SDAПин SCL
Arduino Uno, Nano, Pro и Pro MiniA4A5
Arduino Mega2021
Arduino Leonardo23
Arduino Due20, SDA121, SCL1

3Библиотека "Wire" для работы с IIC

Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire. Она имеет следующие функции:

ФункцияНазначение
begin(address) инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация;
requestFrom()используется ведущим устройством для запроса определённого количества байтов от ведомого;
beginTransmission(address)начало передачи данных к ведомому устройству по определённому адресу;
endTransmission()прекращение передачи данных ведомому;
write()запись данных от ведомого в ответ на запрос;
available()возвращает количество байт информации, доступных для приёма от ведомого;
read()чтение байта, переданного от ведомого ведущему или от ведущего ведомому;
onReceive()указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего;
onRequest()указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого.

4Подключение I2C устройствак Arduino

Давайте посмотрим, как работать с шиной I2C с помощью Arduino.

Сначала соберём схему, как на рисунке. Будем управлять яркостью светодиода, используя цифровой 64-позиционный потенциометр AD5171, который подключается к шине I2C. Адрес, по которому мы будем обращаться к потенциометру – 0x2c (44 в десятичной системе).

Подключение цифрового потенциометра к Arduino по шине I2C
Подключение цифрового потенциометра к Arduino по шине I2C

5Управление устройством по шине IIC

Теперь откроем из примеров библиотеки "Wire" скетч: Файл Образцы Wire digital_potentiometer. Загрузим его в память Arduino.

#include <Wire.h> // подключаем библиотеку "Wire"

void setup() {
  Wire.begin();   // подключаемся к шине I2C как мастер
}

byte val = 0; // значение для передачи потенциометру

void loop() {
  Wire.beginTransmission(44); // начало передачи устройству с адресом "44" (0x2c)
  Wire.write(byte(0x00));     // посылаем байт инструкции
  Wire.write(val);            // посылаем потенциометру значение
  Wire.endTransmission();     // конец передачи

  val++;           // инкрементируем val на 1
  if (val == 64) { // по достижении максимума потенциометра
    val = 0;       // сбрасываем val до нуля
  }
  delay(500);
}

После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.

6Дополнительно о шине I2C

Доступно и интересно рассказывает о шине I2C Джереми Блюм в своём видео:

Видеоуроки по Arduino. Шина I2C
Последнее изменениеСуббота, 28 Январь 2017 09:59
(6 голосов)
Прочитано 33862 раз

Поделиться

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

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены