Kommunikation Atmega324PB - MLX90614 SMBus

OP #7361623
Lesenswert?

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?

Beitrag #7361632 wurde von einem Moderator gelöscht.
#7361643
Lesenswert?

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.

Angehängte Dateien:
OP #7361648
Lesenswert?

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

OP #7361781
Lesenswert?

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 :)

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