LAN9303: Register über I2C mit Arduino / PlatformIO auslesen

English Deutsch

Der LAN9303 hat einige Besonderheiten beim Zugriff auf seine Register. Dieser Beitrag behandelt nicht den indirekten Registerzugriff, sondern nur den Zugriff auf Register, die direkt über I2C zugänglich sind. Voraussetzung dafür ist, dass der LAN9303 in einen Modus konfiguriert ist, in dem das Management über die I2C-Slave-Schnittstelle aktiviert ist. Siehe LAN9303 in den I2C-Managed-Modus versetzen für weitere Informationen.

Das Wichtigste vorweg: Man schreibt nicht den Register-Offset aus dem Datenblatt (wie z.B. 0x50 für das Chip ID and revision register) in das I2C-Adressbyte, sondern die Adresse geteilt durch 4 (0x50 >> 2 == 0x14). Dies geht aus Abbildung 8-8 im Datenblatt hervor, Copyright Microchip, die das Adressbyte als A[9:2] anstelle des üblichen A[7:0] angibt:

LAN9303 I2C-Slave-Register-Adressbyte-Struktur aus dem Datenblatt

Beispiel für den Zugriff auf das Register an Offset 0x50 (Chip ID and revision register) in Arduino mit der Wire-Bibliothek:

lan9303_i2c_example.cpp
const uint8_t LAN9303_I2C_ADDRESS = 0b1010;
const uint16_t LAN9303_CHIPID_REV_Register = 0x50;

Wire.beginTransmission(LAN9303_I2C_ADDRESS);
Wire.write(LAN9303_CHIPID_REV_Register >> 2);
Wire.endTransmission();
Wire.requestFrom(LAN9303_I2C_ADDRESS, 4); // Dieses Register ist 32 Bit = 4 Byte lang
delay(5); // Warten, bis Daten verfügbar sind

// Direkt in ein uint8_t einlesen
uint32_t buf;
size_t actually_read = Wire.readBytes((uint8_t*)&buf, 4);
// Prüfen, ob alle 4 Byte empfangen wurden
if(actually_read != 4) {
    Serial.println("Nicht genügend Bytes gelesen");
}

// Registerwert ausgeben
Serial.printf("LAN9303 Chip ID and revision: %08lx\r\n", __builtin_bswap32(buf));

Dies gibt aus:

output.txt
LAN9303 Chip ID and revision: 93030001

mit anderen Worten: Chip ID = 0x9303, Revision = 0x0001


Check out similar posts by category: Arduino, C/C++, Electronics, Embedded, Networking, PlatformIO