I2C-Schreibvorgang auf TCA9539

Ich verwende den TCA9539 von TI für einige Lese- und Schreib-I2C-Operationen, um einige Signale auf meinem Testboard (Schulprojekt) zu steuern. Pro TI umfasst die Schreiboperation Folgendes:

„Um auf den I2C-Bus zu schreiben, sendet der Master eine START-Bedingung auf den Bus, wobei die Adresse des Slaves sowie das letzte Bit (das R/W-Bit) auf 0 gesetzt sind, was einen Schreibvorgang bedeutet. Nachdem der Slave sendet Das Acknowledge-Bit sendet der Master dann die Registeradresse des Registers, in das er schreiben möchte. Der Slave bestätigt erneut und teilt dem Master mit, dass er bereit ist. Danach beginnt der Master, die Registerdaten an den Slave zu senden, bis der Master alle erforderlichen Daten gesendet hat (was manchmal nur ein einzelnes Byte ist), und der Master die Übertragung mit einer STOP-Bedingung beendet."

Allerdings erhalte ich immer einen Nack vom Slave, wenn ich die Registeradresseninformationen an den Slave sende.

Hier ist mein Beispielcode (sehr einfach)

int Address = 0x74;
#define control_register 0x02 // command byte for Output Port 0
#define data_register_1 0xFF

void setup()
{
    byte ack;
    Wire.begin();
    Serial.begin(9600);
    while (!Serial);
    Wire.beginTransmission(Address);
    ack = Wire.endTransmission();
    if (ack == 0)
    {
        Wire.beginTransmission(control_register);
        Serial.print("Control Register is : ");
        byte bck = Wire.endTransmission();
        if (bck == 0) // since i dont get a nack, this portion of code doesnt execute
        {
            Wire.write(control_register);
            Wire.write(data_register_1);

        }

    }
}
Verwenden Sie die richtige Adresse? 7bit oder 8bit? AFAIK benötigt die Arduino-Bibliothek die 7-Bit-Adresse, ohne das Lese- / Schreibbit.
Ein 7-Bit-0x74 erfordert, dass A0 und A1 mit Masse verbunden sind. Hast du das gemacht?
Welchen Wert liefert die drahtgebundene Übertragung? Eine 1 bedeutet Übertragungsfehler. 2 ist Adressfehler. 3 ist ein Daten-/Registerfehler. 4 ist anders.
Sie verwechseln die Slave-Adresse und die Registeradresse. Mindestens einer Ihrer beginTransmissionAufrufe ist falsch.
Hallo, bedeutet das, dass ich nur eine Übertragung starten und dann beenden muss, nachdem ich den vollständigen Schreibzyklus basierend auf dem Datenblatt gesendet habe?
Ja. Genau das.

Antworten (1)

Oh. Einfach genug. Sie beginnen mit der Übertragung auf 0x74. Dann machst du Schluss.

Dann beginnen Sie mit der Übertragung an 0x02. Das bedeutet, dass Sie wirklich eine Übertragung an die Geräteadresse 0x02 gesendet haben. Statt Gerät 0x74 Register 0x02.

Dafür würdest du tun

Begin transmission 0x74.  
Write 0x02. Register
Write value.  
End transmission. 
If back = 0, you successfully
wrote value to register 0x02 on device 0x74

Indem Sie die Übertragung beenden, senden Sie eine i2c-Stopp-Bedingung, die das Schreiben oder Lesen von dem Gerät ruiniert, zu dem Sie mit der Übertragung begonnen haben.

Hallo Passant, ja, die Adresse ist 7-Bit rechtsbündig und ich kann einen erfolgreichen Scan des i2c-Geräts durchführen und 0x74 sehen. Ich bekam 2, was bedeutet, dass die Slave-Adresse nackte, als ich versuchte, in das Befehlsregister zu schreiben.
@jyasir ja. Das wurde mir klar, nachdem CL seinen Kommentar gepostet hatte. Sie müssen wire.write verwenden, um das Steuerregister zu schreiben.
@jyasir vergiss nicht, die Antwort zu akzeptieren, wenn sie geholfen hat