Problem I2C NACK im 3. Byte MLX90614 - Wiederholter Start

Ich versuche, den Infrarot-Temperatursensor MLX90614 von Melexis über SMBus (I2C- oder TWK-ähnliches Protokoll) zu lesen.

Das Protokoll (SMBus) implementiert eine spezielle Art von Befehl oder Sequenz, die als wiederholter Start bezeichnet wird, das heißt, wir senden eine Startbedingung ohne vorherige Stoppbedingung.

Ich verwende einen XMEGA-Mikrocontroller mit TWI-Bibliotheken, die im Anwendungshinweis AN1308 verwendet werden

Um die Sensordaten zu lesen, muss ich 1 Byte senden, um die zu lesende Adresse zu schreiben, und als nächstes 3 Byte Daten lesen.

Beispiel zum Lesen von Daten

Das Problem ist, dass ich ACK von 2 ersten Bytes bekomme (Schreibadresse und Befehl schreiben), aber ich bekomme NACK, wenn ich die Adresse nach wiederholter Startbedingung sende

Ich habe 3 Aufnahmen vom Oszilloskop:

Allgemeiner Ablauf Allgemeine Reihenfolge Die wiederholte Startbedingung erscheint OK, wir haben eine Startbedingung in der Mitte ohne vorherige Stoppbedingung. Die Adresse stimmt und der Befehl (Adresse zum Lesen) ist auch ok (0b00000110 - 6)

Die Initialisierung des Moduls ist:

// ************** TWI Master config ****************
TWI_MasterInit(&twiMaster,
               &TWIC,
               TWI_MASTER_INTLVL_HI_gc,
               TWI_BAUDSETTING);

Und die Verwendung ist:

    TWI_MasterWriteRead(&twiMaster,
                        MLX90164_ADDR,
                        bufferTX,
                        1,
                        3);

MLX90614 ist 0x5A und bufferTX ist ein unsigned char Array mit einem 0x06 an der ersten Position. Auch der Baudrate ist auf 100 kHz eingestellt

Ich weiß nicht, warum ich NACK im 2. Adressbyte bekomme, um die Daten vom Sensor zu lesen, die wiederholte Startbedingung sieht richtig aus. Außerdem müssen die Hardwarekonfigurationen in Ordnung sein, da ich ACK vom 1. und 2. Byte bekomme

Vielen Dank im Voraus

Es sollte ein einzelnes ACK geben – was voraussichtlich der zweite Peak sein wird. Sie sollten anstelle der ersten Spitze eine "Null" haben - das ist das Befehlsbit "Schreiben".
Ich verwende eine 5-V-Version von MLX90614 und einen XMEGA D-Mikrocontroller (3,3-V-Stromversorgung), daher muss ich einen Pegelumsetzer verwenden. Ich verwende eine "I2C-sichere" Schaltung zur Pegelverschiebung, basierend auf einem NMOS-Transistor (BSS138).
Ich bin mir nicht sicher, wie Ihr Level-Shifter funktioniert, aber er muss eine Zwei-Wege-Signalisierung aufrechterhalten, damit der Master und der Slave die SCL- und SDA-Leitungen herunterziehen können.

Antworten (1)

Es ist schwer zu sagen, ohne weiter hineinzuzoomen, aber es sieht so aus, als hätten Sie versehentlich unmittelbar nach dem wiederholten Start einen Stopp gesendet. SDA sieht so aus, als wäre es ein wenig hoch gegangen, bevor SCL niedrig wurde. Dies würde sicherlich verhindern, dass der Slave ACKt.

Der erste Start hat das gleiche Verhalten, aber es sieht so aus, als wäre er nicht ganz so schlimm und wurde daher nicht als Stopp wahrgenommen.