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