Hardwarenahe Programmierung
ESP32 I2C Bus Interface
Der ESP32 unterstützt die I2C-Kommunikation über seine zwei I2C-Busschnittstellen, die je nach Konfiguration des Benutzers als I2C-Master oder -Slave dienen können. Entsprechend dem ESP32-Datenblatt unterstützen die I2C-Schnittstellen des ESP32:
- Standardmodus (100 Kbit / s)
- Schneller Modus (400 Kbit / s)
- Bis zu 5 MHz, jedoch eingeschränkt durch die SDA-Pull-up-Stärke
- 7-Bit / 10-Bit Adressierungsmodus
- Dualer Adressierungsmodus. Benutzer können Befehlsregister zur Steuerung von I²C-Schnittstellen programmieren, um mehr Flexibilität zu erhalten
Das I2C-Kommunikationsprotokoll verwendet zwei Drähte, um Informationen auszutauschen. Eine wird für das Taktsignal (SCL) und die andere zum Senden und Empfangen von Daten (SDA) verwendet. Die SDA- und SCL-Leitungen sind aktiv low, daher sollten sie mit Widerständen hochgezogen werden, die aber meist schon eingebaut sind. Die Default- Pin sind wie folgt, wobei auch andere Pins verwendet werden können:
I2C Sensor | ESP32 |
SDA | SDA (default is GPIO 21) |
SCL | SCL (default is GPIO 22) |
GND | GND |
VCC | 3.3V oder 5V |
Bei der I2C-Kommunikation verfügt jeder Slave am Bus über eine eigene Adresse, mit der der ESP32 mit jedem Gerät kommunizieren kann. Die I2C-Adresse finden man im Datenblatt der Komponente. Wenn es jedoch schwierig ist, dies herauszufinden kann mit dem folgenden I2C-Scanner die I2C-Adresse herausgefunden werden:
I2C-Scanner.ino
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(115200); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; 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.println(address,HEX); 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); }
Folgendes wird auf der seriellen Schnittstelle (Arduino-IDE->Tools->Serial Monitor; Ctrl+Shift+M) angezeigt: