Интерфейс 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- тактовый сигнал.
Схема с несколькими устройствами выглядит так:
Источник: 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:
Для коротких проводов и нормальных модулей 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 лучше держать коротким.
Материалы по теме¶
- SparkFun: I2C at the Hardware Level - практическое объяснение
SDA,SCL, open-drain линий и pull-up резисторов. - SparkFun: I2C tutorial - общий гайд по I2C, адресам, нескольким устройствам на шине и аппаратным особенностям.
- Adafruit: STEMMA QT technical specs - пример стандартизированного I2C-разъёма, распиновки, питания и
GND. - Adafruit: PCA9548 I2C multiplexer - пример решения конфликта одинаковых I2C-адресов через мультиплексор.
- Klipper Configuration Reference: common I2C settings - параметры
i2c_address,i2c_mcu,i2c_bus, software I2C иi2c_speed.