MLX90393 - NACK beim Schreiben

OP #5837078
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
Angehängte Dateien:
#6436134
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.