Перейти к содержанию

Интерфейс I2C

I2C - это интерфейс связи для небольших микросхем и модулей рядом с контроллером. Расшифровка: Inter-Integrated Circuit. В документации часто пишут I2C bus, то есть I2C-шина.

Главная идея: несколько устройств могут быть подключены к одним и тем же двум сигнальным линиям SDA и SCL, если у них разные адреса.

Где I2C используется

В простых устройствах вокруг 3D-принтера I2C часто используют для:

  • OLED-дисплеев;
  • датчиков температуры, влажности, давления и освещённости;
  • часов реального времени;
  • расширителей GPIO;
  • некоторых энкодеров и кнопочных модулей;
  • мультиплексоров I2C;
  • некоторых RFID/NFC-модулей;
  • маленьких вспомогательных плат.

I2C хорошо подходит для коротких соединений внутри одного корпуса. Для длинных проводов через весь принтер или рядом с силовыми линиями это уже рискованнее.

Линии SDA, SCL, питание и GND

Обычно модуль I2C имеет 4 контакта:

  • VCC или VIN - питание;
  • GND - общий минус;
  • SDA - данные;
  • SCL - тактовый сигнал.

Схема с несколькими устройствами выглядит так:

I2C-шина: один мастер и три устройства на общих SDA/SCL

Источник: Wikimedia Commons, Cburnett, CC BY-SA 3.0

Все устройства на одной I2C-шине подключаются к тем же SDA, SCL и GND. Питание может быть общим, но его напряжение и логические уровни нужно проверять по каждому модулю.

Адреса устройств

У каждого I2C-устройства есть адрес. Например, у маленьких OLED часто встречается 0x3C, у некоторых датчиков - 0x76, 0x77, 0x68, 0x69 и так далее.

Если два устройства на одной шине имеют одинаковый адрес, контроллер не сможет нормально обращаться к ним по отдельности.

Что можно сделать при конфликте адресов:

  • изменить адрес перемычкой или пайкой перемычки, если модуль это поддерживает;
  • выбрать другой вариант модуля;
  • использовать I2C-мультиплексор;
  • разнести устройства по разным I2C-шинам, если контроллер и прошивка это позволяют.

Адрес часто указывают в шестнадцатеричном формате (hex): 0x3C. Но некоторые прошивки или конфиги могут требовать десятичный формат (decimal). Например, 0x3C в десятичном формате - это 60. Это нужно читать в документации конкретной системы.

Pull-up резисторы

I2C-линии работают через подтягивающие резисторы. Устройства на шине обычно могут тянуть SDA или SCL вниз, а высокий уровень получается через pull-up к питанию логики.

Без подтяжек шина может не работать. Но слишком много модулей с собственными подтяжками на одной шине тоже может быть проблемой: суммарное сопротивление становится слишком маленьким, линии нагружаются сильнее, форма фронтов и уровни сигналов могут ухудшиться.

Практически:

  • многие OLED и платы датчиков уже имеют pull-up резисторы;
  • на короткой простой шине это обычно работает сразу;
  • если устройств много, нужно смотреть схему модулей и суммарные подтяжки;
  • если шина нестабильна, один из первых пунктов проверки - pull-up резисторы.

Частый стартовый номинал для отдельной шины - около 4.7 kOhm, но в готовых модулях подтяжки уже могут быть другими.

3.3V и 5V

I2C особенно чувствителен к уровням, потому что SDA и SCL обычно подтянуты к какому-то питанию.

ESP32, RP2040 и STM32 обычно работают с 3.3V логикой. Arduino Uno/Nano часто работает с 5V логикой.

Опасная ситуация:

  • контроллер 3.3V;
  • I2C-модуль питается от 5V;
  • pull-up резисторы на модуле подтягивают SDA и SCL к 5V.

В этом случае на GPIO контроллера может попасть 5V. Это может повредить микроконтроллер.

Перед подключением проверь:

  • от какого напряжения питается модуль;
  • к чему подтянуты SDA и SCL;
  • есть ли преобразователь уровней на модуле;
  • совместим ли модуль с 3.3V контроллером.

Если есть сомнения, используй 3.3V питание для I2C-модулей или преобразователь уровней.

Скорость

Типичные скорости I2C:

100000   # standard mode, 100 kHz
400000   # fast mode, 400 kHz

Для коротких проводов и нормальных модулей 400 kHz часто работает. Но для длинных проводов, слабых подтяжек, большого количества устройств или шумной среды лучше начинать с 100 kHz.

В Klipper параметр i2c_speed поддерживается не одинаково на всех MCU. В документации указано, что многие микроконтроллеры используют 100000, а часть платформ поддерживает 400000. Поэтому нельзя просто написать большую скорость и считать, что она реально применяется.

I2C-сканер

I2C-сканер - это маленькая программа или команда, которая перебирает адреса и показывает, какие устройства отвечают на шине.

Он помогает понять:

  • видит ли контроллер модуль;
  • какой адрес у устройства;
  • не перепутаны ли SDA и SCL;
  • есть ли питание и общий GND;
  • нет ли конфликта адресов.

Но сканер не доказывает, что устройство полностью работает. Он только показывает, что по адресу кто-то отвечает.

I2C в Klipper

В Klipper I2C-устройство подключено к конкретной MCU.

В конфигурации могут встречаться параметры:

  • i2c_mcu - к какой MCU подключено устройство;
  • i2c_bus - аппаратная I2C-шина, если их несколько;
  • i2c_software_scl_pin и i2c_software_sda_pin - software I2C на выбранных пинах;
  • i2c_address - адрес устройства;
  • i2c_speed - скорость, если поддерживается.

Важно: i2c_address в Klipper часто указывается десятичным числом, а не hex-форматом. Если в техническом описании написано 0x3C, в конфиге может понадобиться 60.

Если устройство подключено к дополнительной MCU, это тоже нужно указать. Иначе Klipper будет искать его на основной плате.

Длина проводов и помехи

I2C рассчитан на короткие соединения. Внутри маленького корпуса или на одной плате он удобен. В 3D-принтере условия хуже:

  • рядом моторы;
  • рядом нагреватели;
  • длинные провода;
  • разъёмы на дверцах;
  • силовые линии вентиляторов и нагревателей;
  • электромагнитные помехи.

Практические правила:

  • держать SDA и SCL короткими;
  • вести их рядом с GND;
  • не вести параллельно силовым проводам нагревателя;
  • не делать длинный шлейф на подвижную часть без причины;
  • уменьшить скорость до 100 kHz, если есть ошибки;
  • использовать нормальные разъёмы и разгрузку провода;
  • для длинной связи выбирать другой интерфейс: UART, CAN, RS-485 или локальную MCU рядом с датчиком.

Что проверить перед подключением

Перед подключением I2C-модуля проверь:

  • питание модуля;
  • уровень логики;
  • куда подтянуты SDA и SCL;
  • адрес устройства;
  • можно ли изменить адрес;
  • есть ли конфликт с другими устройствами;
  • длину проводов;
  • есть ли поддержка в прошивке;
  • к какой MCU и шине подключается устройство;
  • нужен ли hardware I2C или software I2C.

Типовые ошибки

  • перепутали SDA и SCL;
  • забыли общий GND;
  • подали 5V подтяжки на 3.3V контроллер;
  • два устройства имеют одинаковый адрес;
  • указали hex-адрес там, где нужен decimal;
  • поставили слишком длинные провода;
  • подключили много модулей с pull-up резисторами;
  • выбрали модуль, который не поддерживается прошивкой;
  • подключили устройство к дополнительной MCU, но не указали i2c_mcu;
  • путают I2C и I2S.

Главное

I2C удобен для маленьких дисплеев, датчиков и вспомогательных модулей рядом с контроллером. Для него нужны SDA, SCL, питание и общий GND.

Главные проверки перед подключением: адрес, уровни 3.3V/5V, pull-up резисторы, длина проводов и поддержка в прошивке. В шумной среде принтера I2C лучше держать коротким.

Материалы по теме