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

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.