Все статьиПрограммирование

Как работает I2C (Inter-Integrated Circuit)? Полное руководство для Arduino и электроники

БА
Бексултан Айтен
CTO, Alashed
27 июля 2025 г.
8 мин чтения
Как работает I2C (Inter-Integrated Circuit)? Полное руководство для Arduino и электроники

I2C (Inter-Integrated Circuit) — популярный последовательный протокол связи для подключения датчиков, дисплеев и других периферийных устройств к микроконтроллерам. Полное руководство с примерами кода.

Пример подключения устройства по I2C
Пример подключения устройства по I2C

I2C (Inter-Integrated Circuit) — это популярный последовательный протокол связи, широко используемый для подключения датчиков, дисплеев и других периферийных устройств к микроконтроллерам. В отличие от SPI, I2C требует всего два провода, что делает его идеальным для проектов с ограниченным количеством выводов.

В этой статье мы подробно разберём:

  • Что такое I2C и где он применяется?
  • Принцип работы I2C (адресация, формат сообщений)
  • Основные линии I2C: SDA и SCL
  • Использование I2C в Arduino
  • Примеры кода для работы с I2C
  • Сравнение I2C с SPI и UART
  • Типичные проблемы и их решения

1. Что такое I2C и зачем он нужен?

I2C — это синхронный последовательный интерфейс, разработанный Philips (ныне NXP) для связи между микросхемами. Он используется для подключения:

  • Датчиков (акселерометры, гирометры, барометры)
  • Дисплеев (OLED, LCD)
  • EEPROM-памяти
  • Цифровых потенциометров
  • RTC (часов реального времени)

Ключевые особенности I2C:

  • Всего 2 провода (SDA — данные, SCL — тактовый сигнал)
  • Поддержка множества устройств (до 128 на одной шине)
  • Низкая скорость (обычно 100 кГц или 400 кГц)
  • Встроенная адресация (каждое устройство имеет уникальный адрес)

Основные ограничения:

  • Меньшая скорость, чем у SPI
  • Требует подтягивающих резисторов
  • Более сложная отладка при проблемах

2. Принцип работы I2C

Структура шины I2C

Шина I2C состоит из:

  • SCL (Serial Clock) — тактовый сигнал
  • SDA (Serial Data) — линия данных

Все устройства подключены параллельно к этим двум линиям. Каждое устройство имеет уникальный 7-битный адрес (реже 10-битный).

Также по I2C подключается популярный модуль гироскопа MPU6050
Также по I2C подключается популярный модуль гироскопа MPU6050

Формат передачи данных

1. Стартовое условие (Start condition) — SDA переходит в LOW при HIGH на SCL

2. Адрес устройства (7 бит) + бит чтения/записи (0 — запись, 1 — чтение)

3. Подтверждение (ACK) — устройство отвечает LOW на 9-м такте

4. Данные (по 8 бит, каждый байт подтверждается ACK)

5. Стоповое условие (Stop condition) — SDA переходит в HIGH при HIGH на SCL

Пример передачи данных

`

[Start] [Адрес 0x68 + W] [ACK] [Данные 0xAB] [ACK] [Stop]

`

3. I2C в Arduino

Аппаратная реализация I2C

В Arduino Uno и Nano (ATmega328P) I2C выведен на:

  • SDAA4
  • SCLA5

Также на плате Arduino Uno есть отдельные пины SCL и SDA для подключения устройств по I2C.

Для работы используется библиотека Wire:

```cpp

#include <Wire.h>

void setup() {

Wire.begin(); // Инициализация I2C (мастер)

Serial.begin(9600);

}

void loop() {

// Запись в устройство с адресом 0x68

Wire.beginTransmission(0x68);

Wire.write(0x00); // Регистр

Wire.write(0xAB); // Данные

Wire.endTransmission();

// Чтение из устройства

Wire.beginTransmission(0x68);

Wire.write(0x00); // Указываем регистр для чтения

Wire.endTransmission(false); // Не завершаем передачу

Wire.requestFrom(0x68, 1); // Запрашиваем 1 байт

if (Wire.available()) {

byte data = Wire.read();

Serial.println(data, HEX);

}

delay(1000);

}

`

Подключение нескольких устройств

Каждое устройство должно иметь уникальный адрес. Например:

  • Модуль RTC DS3231 — 0x68
  • Акселерометр MPU6050 — 0x68 (но можно изменить на 0x69 через перемычку)
  • OLED-дисплей — обычно 0x3C или 0x3D

4. Сравнение I2C с SPI и UART

ПараметрI2CSPIUART
СкоростьДо 400 кГц (стандарт), до 3.4 МГц (быстрый режим)До 50 МГцДо 1 МГц
Линии2 (SDA, SCL)4 (SCK, MOSI, MISO, SS)2 (TX, RX)
АдресацияВстроенная (7/10 бит)Нет (используется SS)Нет
Тип передачиПолудуплексПолный дуплексПолудуплекс
Подключение устройствДо 128 (7-бит)Ограничено количеством SS1:1

Когда выбирать I2C?

  • Нужно подключить несколько устройств с минимальным количеством проводов
  • Скорость не критична
  • Важна простота разводки платы
  • Нужно подключить модуль с I2C

---

5. Типичные проблемы и решения

1. Устройство не отвечает

Проверьте:

  • Правильность подключения SDA/SCL. Подключать эти пины нужно соответственно на плате и на модуле
  • Наличие подтягивающих резисторов (обычно 4.7 кОм к VCC)
  • Правильность адреса устройства (можно проверить сканером I2C)

Сканер I2C-адресов:

```cpp

#include <Wire.h>

void setup() {

Wire.begin();

Serial.begin(9600);

Serial.println("I2C Scanner");

}

void loop() {

byte error, address;

for (address = 1; address < 127; address++) {

Wire.beginTransmission(address);

error = Wire.endTransmission();

if (error == 0) {

Serial.print("Found device at 0x");

Serial.println(address, HEX);

}

}

delay(1000);

}

`

2. Искажение данных

Решения:

  • Уменьшите скорость (перейдите на стандартный режим 100 кГц)
  • Убедитесь в качестве соединений
  • Проверьте питание устройств

3. Конфликты адресов

Если два устройства имеют одинаковый адрес:

  • Используйте устройства с изменяемым адресом
  • Примените I2C-мультиплексор (например, PCA9548A)
  • Подключайте конфликтующие устройства на разные шины

---

Заключение

I2C — это простой и эффективный интерфейс для подключения множества устройств с минимальным количеством проводов. Он идеально подходит для проектов с Arduino, где важна компактность и простота разводки.

Ключевые моменты:

  • I2C использует всего два провода (SDA и SCL)
  • Поддерживает до 128 устройств с разными адресами на одной шине
  • В Arduino работа с I2C осуществляется через библиотеку Wire
  • Всегда проверяйте адреса устройств с помощью I2C-сканера

Теперь вы готовы использовать I2C в своих проектах! Попробуйте подключить датчик температуры или OLED-дисплей — это отличный способ закрепить знания.

P.S. Для более сложных проектов изучите:

  • 10-битную адресацию I2C
  • Использование I2C с DMA
  • Альтернативные реализации (например, Bit Banging)
Попробуйте Alashed бесплатно

Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.

Попробовать бесплатноДемо