Сайт

 Звонок  по  России  бесплатный

8-800-20002-74

 Челябинск: 8 (351) 267-20-10
   xxx-xxx         
  xxx    
Главная Контакты Карта сайта

Авто на заказ

  • Логин:
    Пароль:
Зарегистрироваться | Забыли пароль?
» »

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

Опубликовано: 27.08.2018

видео Интерфейс I2C и Arduino

How I2C Communication Works and How To Use It with Arduino

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


Видеоуроки по Arduino. I2C и processing (7-я серия, ч1)

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

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. Есть несколько различающихся вариантов, рассмотрим один из распространённых. Воспользуемся логическим анализатором, подключённым к шинам SCL и SDA.

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

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

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

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

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

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

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

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

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

Плата Пин SDA Пин SCL
Arduino Uno, Nano, Pro и Pro Mini A4 A5
Arduino Mega 20 21
Arduino Leonardo 2 3
Arduino Due 20, SDA1 21, 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

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 Джереми Блюм в своём видео:




Хиты продаж!

Акции!

Нам 66 лет!

В наличии


Новости

rss