Для підключення декількох пристроїв або датчиків по шині I2C, необхідно визначити адресу кожного пристрою. Зазвичай виробник пише інформацію про адресу, але іноді адреса невідома. Нижче наведено приклад коду як просканувати всі підключення пристрою по штні I2C і вивести їх адреси в монітор серійного порта. Код працює як на ATMega так і на ESP.
Адресація
Кожен пристрій, підключений до шини, може бути програмно адресований за унікальною адресою. Для вибору приймача повідомлення передавач використовує унікальну адресну компоненту у форматі посилки. При використанні однотипних пристроїв, ІС часто мають додатковий селектор адреси, який може бути реалізований як у вигляді додаткових цифрових входів селектора адреси, так і у вигляді аналогового входу. При цьому адреси таких однотипних пристроїв виявляються рознесені в адресному просторі пристроїв, підключених до шини. У звичайному режимі використовується 7-бітна адресація. Після того, як адреса послана, кожний пристрій в системі порівнює перші сім біт після сигналу СТАРТ зі своєю адресою. при збігу пристрій вважає себе обраним як ведений-приймач або як ведений-передавач, залежно від біта напряму.
Контакти для підключення I2C
ATMega328
SCL | A4 |
SDA | A5 |
ATMega2560
SCL | 21 (PD0) |
SDA | 20 (PD1) |
ESP32 має дві шини I2C, та може прцювати майже на всіх виводах ESP32 ( ESP32 pinout ), заумочанням у framework Arduino використовується тільки один.
SCL | GPOI 22 |
SDA | GPOI 21 |
ESP8266
SCL | GPIO 5 |
SDA | GPIO 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 – енергонезалежна пам’ять.