32-Bit I2C-Register mit Arduino Wire-Bibliothek auslesen: Minimalbeispiel
Der folgende Code demonstriert, wie man ein Register, das 4 Bytes (32 Bit) lang ist, über I2C ausliest. Dies funktioniert mit fast allen I2C-Geräten wie EEPROMs, ADCs und anderen, vorausgesetzt man hat die korrekten Einstellungen. Beachten, dass einige Geräte wie der LAN9303 ein leicht abweichendes Adressierungsschema haben oder andere Besonderheiten aufweisen. Meiner Meinung nach ist es am effizientesten, einfach die Standardmethode zum Auslesen eines Registers auszuprobieren und von dort zu starten.
Beachten, dass dieser Code aus Gründen der Einfachheit keine Fehlerbehandlung implementiert. Zusätzlich warten wir auf Daten mit delay() anstelle von Wire.available(). Dies ist ein Minimalbeispiel, das minimale Verwirrung für den Leser erzeugt. Wir werden ein vollständiges Beispiel mit Fehlerbehandlung in einem Folgebeitrag bereitstellen.
Option 1: Auslesen in ein uint32_t (empfohlen)
delay(5); // Auf Daten warten
const uint8_t SLAVE_I2C_ADDRESS = 0b1010;
const uint16_t SLAVE_I2C_REGISTER_ADDRESS = 0x50;
Wire.beginTransmission(SLAVE_I2C_ADDRESS);
Wire.write(SLAVE_I2C_REGISTER_ADDRESS);
Wire.endTransmission();
Wire.requestFrom(SLAVE_I2C_ADDRESS, 4); // Dieses Register ist 32 Bit = 4 Bytes lang
delay(5); // Auf Daten warten
// Direkt in ein uint32_t einlesen
uint32_t buf;
size_t actually_read = Wire.readBytes((uint8_t*)&buf, 4);
// Registerwert ausgeben
Serial.printf("Register value: %08lx\r\n", __builtin_bswap32(buf));Eine Erklärung, warum __builtin_bswap32() benötigt wird, siehe Arduino: 32-Bit uint32_t als acht Hex-Ziffern ausgeben
Option 2: Auslesen in ein uint8_t-Array
delay(5); // Auf Daten warten
const uint8_t SLAVE_I2C_ADDRESS = 0b1010;
const uint16_t SLAVE_I2C_REGISTER_ADDRESS = 0x50;
Wire.beginTransmission(SLAVE_I2C_ADDRESS);
Wire.write(SLAVE_I2C_REGISTER_ADDRESS);
Wire.endTransmission();
Wire.requestFrom(SLAVE_I2C_ADDRESS, 4); // Dieses Register ist 32 Bit = 4 Bytes lang
delay(5); // Auf Daten warten
// In einen 4-Byte-Puffer einlesen
uint8_t buf[4];
size_t actually_read = Wire.readBytes(buf, 4);
// Registerwert ausgeben
Serial.printf("Register value: %02x%02x%02x%02x\r\n", buf[0], buf[1], buf[2], buf[3]);Siehe auch:
- 8-Bit I2C-Register mit Arduino Wire-Bibliothek auslesen: Minimalbeispiel
- 16-Bit I2C-Register mit Arduino Wire-Bibliothek auslesen: Minimalbeispiel