Protocoale de Comunicație Seriale

Protocolul I2C: Magistrala cu 2 Fire & Rezistențe Pull-Up

Cum conectezi până la 127 de senzori independenți folosind doar 2 pini (SDA & SCL), topologia Open-Drain și calculul precis al rezistențelor de pull-up conform standardului NXP UM10204.

1. Topologia Open-Drain: De ce nu apar scurtcircuite?

Într-un sistem clasic push-pull (cum este SPI), dacă două cipuri încearcă să transmită simultan (unul trimițând 5V iar celălalt 0V), pinii lor s-ar scurtcircuita și s-ar arde. Soluția ingenioasă din protocolul I2C este arhitectura Open-Drain (Colector Deschis): cipurile pot doar să tragă linia la MASĂ (0V - starea activă LOW). Când nimeni nu vorbește, o pereche de rezistențe de pull-up externe readuc linia la tensiunea de alimentare (HIGH).

SDA (Serial Data)
Linia Bidirecțională de Date

Transmite adresele dispozitivelor, octeții de comandă și răspunsurile senzorilor. Se schimbă DOAR când SCL este LOW.

SCL (Serial Clock)
Linia de Ceas Generată de Master

Sincronizează fiecare bit transferat. Datele de pe SDA sunt considerate valide și eșantionate exact pe palierul HIGH al SCL.

Calculator Inginerec: Rezistențe Pull-Up I2C (NXP UM10204)

Dacă rezistența este prea mică, cipurile nu pot trage linia la 0V (depășire curent de sink). Dacă este prea mare, capacitatea parazită a cablului rotunjește frontul crescător, corupând datele.

Tensiune Alimentare Bus (V_dd):3.3 V
Viteză Comunicație Bus:400 kHz (Fast-Mode)
Capacitate Parazită Est. a Cablului (Cb):120 pF
Trasee PCB scurte = 30-80 pF • Cablu lung de 1 metru = 150-300 pF
R_min (Limita Vol)
0.97 kΩ
R_max (Timp Front Tr)
2.95 kΩ
Valoare Optimă Recomandată de Pull-Up
2.0 kΩ
Plasează două rezistențe cu această valoare: una între SDA și Vdd, cealaltă între SCL și Vdd.
Timpul maxim permis de creștere al semnalului: 300 ns (standard NXP UM10204).

2. Ghid Rapid: Adrese Hexazecimale Ale Modulelor Populare

3. Utilitar Diagnostic: Scanner I2C Universal

i2c_bus_scanner.ino
#include <Wire.h>

void setup() {
  Wire.begin(); // Initializare magistrala I2C in mod Master
  Serial.begin(115200);
  while (!Serial);
  Serial.println("\n--- Reznex I2C Bus Diagnostic Scanner ---");
}

void loop() {
  byte error, address;
  int deviceCount = 0;

  Serial.println("Scanare adrese periferice (0x01 ... 0x7E)...");

  for (address = 1; address < 127; address++) {
    // Trimitem semnal START si pachet de adresare ACK
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("✅ Gasit periferic raspunzand la adresa: 0x");
      if (address < 16) Serial.print("0");
      Serial.print(address, HEX);
      Serial.println();
      deviceCount++;
    } else if (error == 4) {
      Serial.print("⚠️ Eroare necunoscuta la adresa: 0x");
      Serial.println(address, HEX);
    }
  }

  if (deviceCount == 0) {
    Serial.println("❌ Niciun periferic gasit. Verifica rezistentele de pull-up!");
  } else {
    Serial.print("Scanare terminata. Total periferice active: ");
    Serial.println(deviceCount);
  }

  delay(5000); // Re-scaneaza la fiecare 5 secunde
}