Guten Morgen, ich muss in einem Projekt den I2C/SMBus Sensor MLX90614 von Melexis benutzen. Ich habe Grundsätzlich die Unterschiede zwischen I2C und SMBus verstanden und auch meine I2C.h macht das was ich möchte. Problem ist folgendes: Ich sende auf dem Bus (per Oszilloskop überprüft) genau das, was im Datenblatt gefordert ist, der Sensor bestätigt mit Ack, sendet aber keine Daten!? Übertragung läuft folgendermaßen ab: Start Bit Send SLA+W (mit Ack bestätigt) Send Command Read (mit Ack bestätigt) Rep Start Send SLA+R (mit Ack bestätigt) SCL high - SDA low (bis Eingreifen vom Master) Hat jemand ähnliche Erfahrungen gemacht oder hat eine Idee?
Für den MLX90614 gibt es eine wunderbare Arduino-Lib. Da kannst du ja mal nachschauen, wie's geht. Die habe ich auch benutzt und bei mir funktioniert sie! Sie ist übrigens von Adafruit.
:
Bearbeitet durch User
Ja stimmt, die hab ich mir auch schon durch geschaut. Die sind etwas anders geschrieben mit den Klassen usw. Aber einen grundsätzlichen Unterschied in der Übertragung bzw. dem Protokoll erkenne ich nicht.
Beitrag #7361632 wurde vom Autor gelöscht.
Steven D. schrieb: > Send SLA+R (mit Ack bestätigt) Und was ist mit dem Lesen? Der Master muß den Lesetakt erzeugen und das ACK, wenn noch ein Byte folgen soll, bzw. NACK beim letzten Byte.
1 | uint16_t readRegister(byte reg) |
2 | { |
3 | uint16_t res1,res2,res; |
4 | Wire.beginTransmission(MLX90614_ADDR); |
5 | Wire.write(reg); |
6 | if (Wire.endTransmission(false) == 0) |
7 | { |
8 | Wire.requestFrom(MLX90614_ADDR,3); |
9 | res1 = Wire.read(); |
10 | res2 = Wire.read(); |
11 | res = res1 + res2*256; |
12 | } |
13 | Wire.endTransmission(); |
14 | return res; |
15 | } |
Ohne Wire.endTransmission(false) geht das nicht. Weil wire.h ohne (false) ein end/start auf den bus haut anstatt einen restart.
:
Bearbeitet durch User
Peter D. schrieb: > Steven D. schrieb: >> Send SLA+R (mit Ack bestätigt) > > Und was ist mit dem Lesen? > Der Master muß den Lesetakt erzeugen und das ACK, wenn noch ein Byte > folgen soll, bzw. NACK beim letzten Byte. Also muss ich in meiner I2C_read Funktion nachschauen? Okay, danke für den Tipp. Neumann schrieb: > Ohne Wire.endTransmission(false) geht das nicht. > Weil wire.h ohne (false) ein end/start auf den bus haut anstatt einen > restart. Ich benutze keinen Arduino oder eine Wire.h Es wird ein Atmega324PB benutzt und eine selbst neu aufgesetzte I2C.h (hat Gründe) Eventuell ist mir da ein Fehler unterlaufen
Steven D. schrieb: > Es wird ein Atmega324PB benutzt und eine selbst neu aufgesetzte I2C.h Schau dir das mit dem restart an weil genau "ack aber keine daten" das ist das symptom. Musste auch erst pulseview anhängen um das zu sehen.
:
Bearbeitet durch User
Peter D. schrieb: > Steven D. schrieb: >> Send SLA+R (mit Ack bestätigt) > > Und was ist mit dem Lesen? > Der Master muß den Lesetakt erzeugen und das ACK, wenn noch ein Byte > folgen soll, bzw. NACK beim letzten Byte. Danke... Ist mir fast etwas peinlich aber es war mir tatsächlich in diesem Moment nicht bewusst dass der Master "den Takt vorgibt". Was ja eigentlich absolut logisch ist. Mein Fehler war ein falsches Bit in der i2c_read() Funktion. Danke für die schnellen (und vor allem freundlichen) Antworten :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.