Адреси пристроїв на шині I2C

Для підключення декількох пристроїв або датчиків по шині I2C, необхідно визначити адресу кожного пристрою. Зазвичай виробник пише інформацію про адресу, але іноді адреса невідома. Нижче наведено приклад коду як просканувати всі підключення пристрою по штні I2C і вивести їх адреси в монітор серійного порта. Код працює як на ATMega так і на ESP.

Адресація

Кожен пристрій, підключений до шини, може бути програмно адресований за унікальною адресою. Для вибору приймача повідомлення передавач використовує унікальну адресну компоненту у форматі посилки. При використанні однотипних пристроїв, ІС часто мають додатковий селектор адреси, який може бути реалізований як у вигляді додаткових цифрових входів селектора адреси, так і у вигляді аналогового входу. При цьому адреси таких однотипних пристроїв виявляються рознесені в адресному просторі пристроїв, підключених до шини. У звичайному режимі використовується 7-бітна адресація. Після того, як адреса послана, кожний пристрій в системі порівнює перші сім біт після сигналу СТАРТ зі своєю адресою. при збігу пристрій вважає себе обраним як ведений-приймач або як ведений-передавач, залежно від біта напряму.

Опис протоколу I2C.

Контакти для підключення I2C

ATMega328

SCLA4
SDAA5

ATMega2560

SCL 21 (PD0)
SDA20 (PD1)

ESP32 має дві шини I2C, та може прцювати майже на всіх виводах ESP32 ( ESP32 pinout ), заумочанням у framework Arduino використовується тільки один.

SCLGPOI 22
SDAGPOI 21

ESP8266

SCLGPIO 5
SDAGPIO 4

Для ESP32 та ESP8266 розкоментуйте 7 рядок “// Wire.begin();”

#include <Arduino.h>
#include <Wire.h>

void setup()
{
  Serial.begin(9600);
  // Wire.begin();      // Розкоментувати для ESP32 та ESP8266
}

void search()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for (address = 8; 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.print(address, HEX);
      Serial.println(" !");

      nDevices++;
    }
    else if (error == 4)
    {
      Serial.print("Unknow 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);
}

void loop()
{
   search();
}

Даний приклад циклічно опитує I2C шину. Якщо знаходить підключенні пристрої виводить їхні адреси в монітор серійного порта. В даному випадку підключений модуль RTC DS1307, на модулі дві адреси, перша DS1307, друга мікросхема I2C EEPROM 24C32 – енергонезалежна пам’ять.

Підключення LCD1602 дисплея по I2C.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *