I2C mit MSP430FR5739 ACK wird nicht gesetzt

OP #2593588
Lesenswert?

Hallo alle zusammen,

Ich bin im Moment dabei einen MSP430FR5739 zu programmieren. Dieser soll 
über I2C Werte von einem Temperatursensor (DS1631) einlesen. Dazu sende 
ich ihm zunächst die Konfigurationsdaten (12 Bit Result + Single convert 
mode) anschließend den Befehl die Temperatur einzulesen.

Um zu überprüfen ob die Wandlung abgeschlossen ist lese ich das 
Statusbyte des DS1631 wieder ein und überprüfe das DONE Bit.
Ist Die Wandlung abgeschlossen will ich die Temperatur auslesen.

Jetzt ist allerdings das Problem, dass ich nach dem ersten einlesen des 
Statusbytes die anfrage mit einem NACK quittiere, was dazu führt, dass 
bei den nächsten Einlesevorgängen Nur noch die Adresse, aber nicht mehr 
der erforderliche Befehl gesendet wird.

Wie kann ich an stelle des NACK mit einem ACK quittieren?


Datasheet DS1631: http://datasheets.maxim-ic.com/en/ds/DS1631-DS1731.pdf
Datasheet MSP430FR5739: http://www.ti.com/lit/ug/slau272/slau272.pdf
im Anhang mein Code + Mitschnitt des I2C Bus
Angehängte Dateien:
OP #2594980
Lesenswert?

Ja richtig, das zweite init_iic(); ist nicht notwendig, das was ein 
Überbleibsel von einem Test. Hat aber keine Auswirkung auf das 
Verhalten.

Einen Interrupt der bei einem ACK ausgelöst wird gibt es nicht, ich kann 
lediglich auf ein NACK einen Interrupt auslösen.
Doch in diesem Fall ist es ja kein NACK welches vom Sensor kommt, 
sondern eines, das mein Controller setzt.

Ja ich möchte lesen, jedoch muss ich ihm ja angeben, was ich lesen 
möchte, also sende ich ihm zunächst 0xAC was bedeutet, dass das 
Configurationsbyte ausgelesen werden soll.
Dies wäre theoretisch nur einmal notwendig, da er dieses Byte ja 
mehrfach auslesen soll.

Spätestens jedoch beim auslesen der Temperatur, muss ich angeben dass 
ich diese auslesen will. D.h. zunächst muss ich 0xAA (Read_Temperature) 
senden und anschließend den Wert einlesen. Doch da dies nicht gesendet 
wird bekomme ich beim einlesen der Temperatur den wert des 
Controllregisters zurück.


Ich bin mir auch nicht sicher ob es überhaupt mit zusammen hängt, ich 
dachte es nur, weil bei meinem ersten send-Befehl mein Comand ja noch 
gesendet wurde und nachdem ich eingelesen habe (also nach dem ersten 
NACK) nicht mehr.
OP #2595865
Lesenswert?

Richtig, genau das versuche ich, beim ersten mal sendet er das 
Kommando-Byte noch, nach dem ersten mal Einlesen dann nicht mehr. Daher 
habe ich gedacht, könnte es vielleicht an dem NACK liegen, das der µC 
beim vorhergegangenen Einlesen gesendet hat. Wenn das NACK aber wie Jörg 
sagt in Ordnung ist weiß ich auch nicht mehr woran es liegen könnte.
#3337409
Lesenswert?

Ist zwar schon ein Jahr her aber ich antworte trotzdem mal.

In der iic_init fehlt noch die aktivierung der RX-Interrupts
1
UCB0IE |= UCTXIE0 + UCRXIE0 + UCNACKIE;

Dann werden auch mehrere Bytes als nur eines gelesen und das NACK kommt 
auch an der richtigen stelle.

MfG Rush

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren