4.09. Интерфейсы связи - I2C.md
В предыдущем параграфе мы научились связывать Рудирон
с другими устройствами с помощью UART. Это надёжный способ, но у него есть недостаток - для каждого нового устройства нужен отдельный аппаратный UART
или его программная эмуляция, что занимает драгоценные пины и ресурсы микроконтроллера. А что, если нам нужно подключить к плате десяток разных датчиков: температуры, влажности, давления, гироскоп, магнитометр? Пинов не хватит!
Именно для таких ситуаций был придуман гениальный по своей простоте и эффективности интерфейс — I2C (произносится как «ай-ту-си»), который расшифровывается как Inter-Integrated Circuit.
Принцип работы I2C - общая шина
Представьте себе автобусный маршрут. Есть всего одна дорога (шина), по которой ездит автобус (данные), и множество остановок (устройств). У каждой остановки есть свой уникальный номер (адрес). Когда кому-то нужно передать посылку, он выходит на дорогу, громко называет номер остановки-получателя и передаёт посылку. Все слышат, но забирает посылку только тот, чей номер назвали.
I2C работает по очень похожему принципу. Это шинный интерфейс, где все устройства подключаются параллельно всего к двум проводам:
- SDA (Serial Data) — линия данных. По этому «проводу-дороге» передаются сами данные.
- SCL (Serial Clock) — линия тактирования. Это «регулировщик», который задаёт ритм передачи данных, гарантируя, что все устройства работают синхронно.
Ведущий и ведомый (Master и Slave)
В шине I2C всегда есть одно главное устройство — Ведущий (Master
). Как правило, это наш микроконтроллер Рудирон
. Он инициирует всё общение и генерирует тактовые сигналы на линии SCL. Все остальные устройства на шине — датчики, дисплеи, микросхемы памяти — являются Ведомыми (Slave
). Они только слушают команды от ведущего и отвечают, когда к ним обращаются.
У каждого ведомого устройства на шине должен быть уникальный 7-битный адрес. Этот адрес обычно жёстко задан производителем микросхемы (иногда его можно частично изменить с помощью специальных перемычек на плате модуля). Именно по этому адресу ведущий обращается к нужному устройству.
I2C на плате Рудирон
На плате Рудирон
для работы с I2C выделены специальные пины:
- SCL: Пин 18.
- SDA: Пин 19.
Для работы с этим интерфейсом в среде Arduino
используется стандартная библиотека Wire
.
Библиотека Wire
Библиотека Wire
предоставляет простой и удобный набор функций для общения по шине I2C.
Инициализация — Wire.begin()
Прежде чем начать работу, нужно инициализировать Рудирон
в качестве ведущего на шине. Это делается один раз в setup()
.
#include <Wire.h> // Подключаем библиотеку
void setup() {
Wire.begin(); // Инициализируем I2C как ведущее устройство
Serial.begin(9600);
}
Поиск устройств на шине Как узнать адреса устройств, подключённых к шине? Можно посмотреть в документации на датчик, а можно попросить Рудирон
просканировать шину и сообщить адреса всех, кто откликнется.
Пример (сканер I2C-устройств):
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
nDevices++;
}
else if (error == 4) {
Serial.print("Unknown error at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // Ждём 5 секунд перед следующим сканированием
}
Передача и приём данных Обмен данными с ведомым устройством — это всегда сеанс связи, который инициирует ведущий: 1. Wire.beginTransmission(адрес)
. Начать сеанс связи с устройством по его адресу. 2. Wire.write(данные)
. Отправить один или несколько байт данных. Например, адрес регистра, из которого мы хотим прочитать, или значение, которое хотим записать. 3. Wire.endTransmission()
. Завершить сеанс передачи. 4. Wire.requestFrom(адрес, количество_байт)
. Запросить у ведомого устройства определённое количество байт. 5. Wire.read()
. Прочитать байт, полученный от ведомого устройства.
Работа с конкретным устройством всегда зависит от его внутреннего устройства и команд, которые оно понимает. Эту информацию нужно искать в документации (datasheet) на компонент.
Зачем это нужно?
I2C — это промышленный стандарт, который используется повсеместно. Его главные достоинства — экономия пинов и простота расширения системы. С помощью всего двух проводов вы можете подключить к Рудирону
целый комплекс устройств:
- Датчики: гироскопы и акселерометры (
MPU6050
), барометры (BMP280
), датчики освещённости (BH1750
). - Дисплеи: небольшие OLED-экраны.
- Память: микросхемы EEPROM для хранения настроек.
- Расширители портов: микросхемы, которые добавляют
Рудирону
большеGPIO
пинов.
Теперь вы знаете, как организовать целую сеть устройств с помощью I2C. Если вы хотите немедленно применить эти знания на практике, переходите к лабораторным работам, где мы напишем полезную программу — сканер, который поможет находить адреса любых подключённых I2C
-устройств. Если же вам нужна ещё большая скорость и надёжность для таких задач, как работа с SD-картами или быстрыми дисплеями, то отправляйтесь в следующий параграф, где мы изучим интерфейс SPI
.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home