Einführung in die I2C -Kommunikation
I2C Alternativ bekannt als I2C oder IIC ist ein synchrones Master-Slave-Kommunikationsprotokoll, in dem ein Signal-Master-Gerät eine Vielzahl von Slave-Geräten über ein einzelnes Draht (SDA-Linie) steuern kann.
I2c kombinieren die Arbeit von UART- und SPI-Protokollen zum Beispiel unterstützt SPI mehrere Slave-Gerätesteuerung über einen einzelnen Master. I2C unterstützt dies auch. Andererseits verwendet UART zweizeilige TX und RX für die Kommunikation. Kommunikation.
Hier können wir sehen, dass wir Pull -Up -Widerstände mit beiden SCL -Linien verwendet haben. Dies liegt daran. Standardmäßig befindet sich I2C auf allen Chips im offenen Schaltungsmodus. Um sie hoch zu ziehen, haben wir einen Pull-up-Widerstand verwendet.
Im Folgenden werden die beiden Zeilen i2c verwendet:
ESP32 I2C -Busoberflächen
ESP32 verfügt über zwei I2C -Bus -Schnittstellen, die die I2C -Kommunikation je nach Gerät, das mit ESP32 miteinander verbunden ist, als Master oder Slave durchgeführt wird. Laut ESP32 -Datenblatt unterstützt die ESP32 -Board I2C -Schnittstelle die folgende Konfiguration:
Anschließen von I2C -Geräten mit ESP32
Die Schnittstellengeräte mit ESP32 mit i2C -Protokoll sind genau wie UART sehr einfach. Wir benötigen nur zwei Zeilen zum Verbinden von SDA und der SCL -Taktlinie.
ESP32 kann sowohl im Master- als auch im Slave -Modus konfiguriert werden.
ESP32 I2C Master -Modus
In diesem Modus erzeugt ESP32 ein Taktsignal, das die Kommunikation mit verbundenen Slave -Geräten initiiert.
Die beiden GPIO-Stifte in ESP32, die für die I2C-Kommunikation vorgegeben sind:
ESP32 I2C Slave -Modus
Im Sklavenmodus wird die Uhr vom Master -Gerät generiert. Master ist das einzige Gerät, das die SCL -Linie in der I2C -Kommunikation antreibt. Sklaven sind die Geräte, die auf Master reagieren, aber keine Datenübertragung initiieren können. In ESP32 I2C -Bus kann nur der Master die Datenübertragung zwischen Geräten einleiten.
Das Bild zeigt zwei ESP32-Boards in der Master-Slave-Konfiguration.
Ab sofort haben wir die Funktionsweise des i2c -Modus in ESP32 verstanden, jetzt können wir die i2c -Adresse eines jeden Geräts durch Hochladen des angegebenen Codes leicht finden.
So scannen Sie die I2C -Adresse in ESP32 mit Arduino IDE
Das Finden der I2C -Adresse von verbundenen Geräten mit ESP32 ist wichtig, da wir nicht mit ihnen über eine einzelne Buslinie mit ihnen kommunizieren können, wenn wir Geräte mit derselben I2C -Adresse verwenden können.
Jedes I2C -Gerät muss eine eindeutige Adresse und den Adressbereich von 0 bis 127 oder (0 bis 0x7f) in Hex enthalten. Wenn wir beispielsweise zwei OLED -Anzeigen derselben Modellnummer oder des gleichen Produkts verwenden, haben beide die gleiche I2C.
Um eine IC -Adresse zu finden, nehmen wir ein Beispiel.
Schematisch
Das folgende Bild zeigt das schematische Diagramm der OLED -Anzeige -Schnittstelle mit der ESP32 -Karte mit dem I2C -Kommunikationsprotokoll.
Die Verbindung von ESP32 mit OLED beinhaltet:
OLED -Anzeige | ESP32 PIN |
---|---|
VCC | 3v3/vin |
GND | GND |
Scl | GPIO 22 |
SDA | GPIO 21 |
Code
Öffnen Sie den Arduino -Editor und laden Sie den angegebenen I2C -Scancode in ESP32 -Board hoch. Stellen Sie sicher, dass ESP32 angeschlossen ist und der COM -Port ausgewählt ist.
/*****************
****************
LinuxHint.com
****************
****************//
#include /*Drahtbibliothek inklusive* /
void setup ()
Kabel.Start(); /*I2c Kommunikation beginnt*/
Serie.Beginnen Sie (115200); /*Baudrate für serielle Kommunikation*/
Serie.println ("\ ni2c Scanner"); /*Scanner auf Serienmonitor drucken*/
void Loop ()
Byte -Fehler, Adresse;
int nDevices;
Serie.println ("Scannen ..."); /*ESP32 startet das Scannen verfügbarer i2c -Geräte*/
nDevices = 0;
für (Adresse = 1; Adresse < 127; address++ ) /*for loop to check number of devices on 127 address*/
Kabel.begintransmission (Adresse);
Fehler = Kabel.Endtransmission ();
if (error == 0) /*wenn i2c -Gerät gefunden* /
Serie.print ("I2C -Gerät gefunden unter Adresse 0x");/*Drucken Sie diese Zeile, wenn I2C -Gerät gefunden wurde*/
if (Adresse<16)
Serie.print ("0");
Serie.println (Adresse, Hex); /*druckt den Hex -Wert der i2c -Adresse*/
nDevices ++;
sonst if (error == 4)
Serie.print ("Unbekannter Fehler bei Adresse 0x");
if (Adresse<16)
Serie.print ("0");
Serie.println (Adresse, Hex);
if (nDevices == 0)
Serie.println ("Keine I2C -Geräte gefunden \ n"); /*Wenn kein I2C -Gerät angeschlossen ist, drucken Sie diese Meldung*/
anders
Serie.println ("Done \ n");
Verzögerung (5000); /*Verzögerung für die Überprüfung des I2C -Busses alle 5 Sekunden*/
Der obige Code scannt nach den verfügbaren I2C -Geräten. Der Code ruft mit der Kabelbibliothek für I2C -Kommunikation auf. Die nächste serielle Kommunikation wird mit der Baud -Rate begonnen.
Im Schleifenteil des i2C -Scanningcodees zwei Variablennamen, Fehler Und Adresse sind festgelegt. Diese beiden Variablen speichern die I2C -Adresse von Geräten. Als nächstes wird ein für Schleifen initialisiert, der nach der i2C -Adresse ab 0 bis 127 Geräte scannt wird.
Nach dem Lesen der I2C.
Hardware
Hier sehen wir die OLED 0.Das 96-Zoll-I2C-Display ist mit der ESP32-Karte bei GPIO-Pins 21 und 22 verbunden. VCC und GND des Displays sind mit ESP32 3v3 und GND -Pin verbunden.
Ausgang
In der Ausgabe sehen wir die I2C -Adresse des OLED -Displays, das mit der ESP32 -Karte angeschlossen ist. Hier lautet die i2c -Adresse 0x3c, sodass wir kein anderes i2C -Gerät mit derselben Adresse verwenden können, da wir zuerst die i2c -Adresse dieses Geräts ändern müssen.
Wir haben erfolgreich die I2C -Adresse des OLED -Displays erhalten, das mit dem ESP32 -Board verbunden ist.
Abschluss
Das Finden einer I2C -Adresse beim Anschließen mehrerer Geräte mit ESP32 ist wichtig, da Geräte, die dieselbe i2C. Wenn Sie den obigen Code verwenden, kann die I2C -Adresse identifiziert werden. Wenn die Adresse zweier beliebiger Geräte übereinstimmt, kann sie je nach den Gerätespezifikationen entsprechend geändert werden.