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).
Transmite adresele dispozitivelor, octeții de comandă și răspunsurile senzorilor. Se schimbă DOAR când SCL este LOW.
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.
2. Ghid Rapid: Adrese Hexazecimale Ale Modulelor Populare
3. Utilitar Diagnostic: Scanner I2C Universal
#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
}