Forum: Mikrocontroller und Digitale Elektronik MLX90393 - NACK beim Schreiben


von Daniel K. (daniel_k80)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche gerade einen MLX90393 Magnetsensor an einem XMega zu 
betreiben und bin dabei auf ein Problem gestoßen.
Anscheinend kommt es öfters mal vor, dass der Sensor nach dem Schreiben 
des zweiten Datenbytes bei einem Lesebefehl ein NACK sendet. Auf dem 
Bild "Korrekt.png" ist die fehlerfreie Kommunikation zu sehen. Ich sende 
erst die Adresse mit W-Bit, dann den Befehl "Read Register" und dann das 
Register (in diesem Fall Register 0).
Hin und wieder kommt aber das Verhalten, das in dem Bild "Fehler.png" 
gezeigt ist zum Vorschein, wodurch der nachfolgende Lesezugriff zum 
Auslesen des Status-Bytes nicht mehr durchgeführt wird (entgegen dem 
Bild wurde zu dem Zeitpunkt KEINE Stop-Kondition gesendet - das Bild ist 
nach einer Anpassung des I2C entstanden).

Ich habe meine I2C-Funktionen nun bereits so abgeändert, dass ein Fehler 
ausgegeben wird und eine Stop-Kondition gesendet wird um die 
Kommunikation abzubrechen (siehe Bild "Fehler.png", wenn ich beim 
Schreiben ein NACK bekomme. Falls dies der Fall ist, soll die gesendete 
Nachricht, also der "Read Register"-Befehl erneut gesendet werden.
1
 #define I2CM_WRITEBYTES(Interface, Address, Bytes, Data, Stop)              I2CM_WriteBytes(Interface, Address, Bytes, Data, Stop)
2
3
uint8_t Tx[] = {MLX30393_CMD_READ_REG, ((Address & 0x3F) << 0x02)};
4
5
I2C_Error_t ErrorCode = I2CM_WRITEBYTES(MLX90393_INTERFACE, MLX90393_ADDRESS, sizeof(Tx), Tx, FALSE);
6
    
7
// ToDo: Add timeout
8
if(ErrorCode == I2C_DATA_ERROR)
9
{
10
  ErrorCode = I2CM_WRITEBYTES(MLX90393_INTERFACE, MLX90393_ADDRESS, sizeof(Tx), Tx, FALSE);
11
}
12
    
13
ErrorCode = I2CM_READBYTES(MLX90393_INTERFACE, MLX90393_ADDRESS, 3, Data, TRUE);
14
15
return ErrorCode;

Allerdings bekomme ich weiterhin ein NACK zurück.

Wie kann ich das Problem möglichst elegant lösen?

Vielen Dank für die Anregungen

: Bearbeitet durch User
von Markus F. (mfulde)


Lesenswert?

Hallo Daniel,

es ist schon lange her, als Du diesen Thread hier im Forum eröffnet 
hast. Ich habe auch keine wirkliche Antwort auf Dein Problem. Bin aber 
gerade auch dabei den Sensor MLX90393 mit BASCOM zu programmieren und da 
kenne ich das Thema nicht. Ich hatte am Anfang auch Probleme mit NACK, 
als ich aber nach der Kommando-Sequenz, vor dem Auslesen des Statusbyte 
eine "Repeat Start Condition" eingebaut habe, waren die NACKS vorbei.

Interessanter Weise habe ich die NACKs auch im Logic Analyzer mit dem 
originalen Adafruit Example auf dem Adafruit mit einem Adafruit Feather 
M0 Expressboard gesehen.

Bei mir in BASCOM tauchen sie nicht mehr auf.

Ich habe aber eine andere Frage an Dich und vielleicht gibt es darauf ja 
eine Antwort....

Gemäß neuestem Datenblatt von Melexis Januar 2020 benötigt der Sensor 
IMMER am Ende einer Kommunikation ein vom Master ausgelöstes NACK. Das 
wunder mich sehr. In der letzten Datasheet Version Rev3 von 2017 welche 
ich hatte, da war das noch nicht. Kennst Du das Thema und kannst Du mir 
etwas dazu sagen, warum der Sensor ein NACK benötigt.

Ich habe nämlich gerade ein Thema mit dem Reset Kommando, bei welchem 
ich stabil immer 100% I2C Kommunikationsfehler bekomme .... Hier stimmt 
etwas in meiner Implementierung mit der Start - ACK - Stop Bedingung 
nicht.....

Grüße,
Markus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.