Forum: Mikrocontroller und Digitale Elektronik Kommunikation Atmega324PB - MLX90614 SMBus


von Steven D. (draeste)


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?

von Helmut -. (dc3yc)


Lesenswert?

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
von Steven D. (draeste)


Lesenswert?

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.
von Peter D. (peda)


Lesenswert?

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.

von Neumann (mralfred)


Angehängte Dateien:

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.

: Bearbeitet durch User
von Steven D. (draeste)


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

von Neumann (mralfred)


Lesenswert?

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
von Steven D. (draeste)


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

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
Noch kein Account? Hier anmelden.