Forum: Mikrocontroller und Digitale Elektronik I2C Verständnissfrage


von Elisa W. (Gast)


Lesenswert?

Guten Tag,

auf dieser Seite gibt es ja eine gute Sammlung von "I2C Bibliotheken" 
gefunden.

Seit geraumer Zeit benutze Ich die von "Peter Flury".
Nun habe Ich einen Temperatursensor im Einsatz (I2C), der laut 
Datenblatt mir ein NACK sendet wenn er keine neuen Daten hat.

Ist das Richtig das Ich ihn erstmal sage, dass Ich jetzt lesen möchte 
und wenn die Funktion mir dann eine '1' zurückliefert weiß Ich das er 
keine neuen Daten für mich hat? Verstehe Ich das falsch?
1
if ( i2c_rep_start ( SLAVE_ADDR + I2C_READ) )
2
{
3
     // keine neuen daten vorhanden..
4
}

von Stefan F. (Gast)


Lesenswert?

Verrate mal, welchen Sensor du konkret meinst. Dann kann ich für Dich in 
das Datenblatt gucken.

von Elisa W. (Gast)


Lesenswert?

Stefan U. schrieb:
> Verrate mal, welchen Sensor du konkret meinst. Dann kann ich für
> Dich in
> das Datenblatt gucken.

Dieser hier ist es.: 
https://www.mouser.com/ds/2/682/Sensirion_Temperature_Sensors_STS3x_Datasheet_V1-1152208.pdf

von Stefan F. (Gast)


Lesenswert?

Dann lies mal Kapitel 4.2 und folgende, da ist beschrieben, wie die 
Kommunikation bei diesem Sensor funktioniert.

Deine oben geschriebene Annahme zum Protokoll ist jedenfalls falsch.

von Elisa W. (Gast)


Angehängte Dateien:

Lesenswert?

Stefan U. schrieb:
> Dann lies mal Kapitel 4.2 und folgende, da ist beschrieben, wie
> die
> Kommunikation bei diesem Sensor funktioniert.
>
> Deine oben geschriebene Annahme zum Protokoll ist jedenfalls falsch.
Ich meinte diesen Abschnitt.. (siehe Anhang..)

von Stefan F. (Gast)


Lesenswert?

Welchen Modus verwendest du denn? Single-Shot oder Periodic?

Im Periodic Modus kannst du das Meßinterval einstellen. Beim leseversuch 
wird Dir das ACK bzw NACK zeigen, ob ein Meßwert vorliegt. NACk würdest 
du nur bekommen, wenn du versucht, den Sensor zu früh auszulesen. Dann 
muss man sich dann aber fragen, warum man das tun will?

Beitrag #5331878 wurde von einem Moderator gelöscht.
von Elisa W. (Gast)


Lesenswert?

Ja woher weiß ich denn das der Sensor wirklich neue Daten zum lesen 
bereit hält? Es gibt nirgends ein Flag?

von Elisa W. (Gast)


Lesenswert?

Stefan U. schrieb:
> Welchen Modus verwendest du denn? Single-Shot oder Periodic?
>
> Im Periodic Modus kannst du das Meßinterval einstellen. Beim leseversuch
> wird Dir das ACK bzw NACK zeigen, ob ein Meßwert vorliegt. NACk würdest
> du nur bekommen, wenn du versucht, den Sensor zu früh auszulesen. Dann
> muss man sich dann aber fragen, warum man das tun will?

Ich messe im langsamsten Modus und dann zyklisch. Keine Einzelmessung.

von Stefan F. (Gast)


Lesenswert?

> Es gibt nirgends ein Flag?

NACK ist doch ein Flag. Aber wenn ich dem Sensor sage, daß er alle 10ms 
messen soll, dann frage ich ihn auch erst nach 10ms wieder ab.

> Ich messe im langsamsten Modus und dann zyklisch. Keine Einzelmessung.

Ja dann mach mal.

von Elisa W. (Gast)


Lesenswert?

Stefan U. schrieb:
> Es gibt nirgends ein Flag?
>
> NACK ist doch ein Flag. Aber wenn ich dem Sensor sage, daß er alle 10ms
> messen soll, dann frage ich ihn auch erst nach 10ms wieder ab.
>
> Ich messe im langsamsten Modus und dann zyklisch. Keine Einzelmessung.
>
> Ja dann mach mal.

Meine Frage war doch, wie ich an das NACK komme..

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo
Schau mal in die Tabelle 9, dort steht Fetch Data 0xE0 00 wenn keine 
Daten da sind kommt Nack

Gruß
Frank

von Elisa W. (Gast)


Lesenswert?

Frank L. schrieb:
> Hallo
> Schau mal in die Tabelle 9, dort steht Fetch Data 0xE0 00 wenn keine
> Daten da sind kommt Nack
>
> Gruß Frank

Hallo Frank,
das sende ich ja. Meine Frage war in Bezug auf den Funktionsaufruf vom 
ersten Post. Wenn die Funktion mir eine 1 zurückliefert das ein NACK 
ist..

von Hmmm (Gast)


Lesenswert?

Soweit ich Dich verstehe, hast Du es richtig verstanden:

Start condition, Adresse (Write), Kommando hinterher, alles wird ACKed.

Dann repeated start condition, Adresse (Read), und wenn dabei das ACK 
ausbleibt, ist kein neuer Wert da, und i2c_rep_start() liefert 1.

von Elisa W. (Gast)


Lesenswert?

Hmmm schrieb:
> Soweit ich Dich verstehe, hast Du es richtig verstanden:
>
> Start condition, Adresse (Write), Kommando hinterher, alles wird ACKed.
>
> Dann repeated start condition, Adresse (Read), und wenn dabei das ACK
> ausbleibt, ist kein neuer Wert da, und i2c_rep_start() liefert 1.

Das wollte ich wissen.

von HolgerT (Gast)


Lesenswert?

Ich benutze die Bibliothek von P. Fleury nicht, habe mir aber eben mal 
seine Doku angesehen.
http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__ic2master.html

Ich denke, Du bist auf dem richtigen Weg.

i2c_start und i2c_rep_start bringen ja die Werte:
1
Return values
2
    0  device accessible
3
    1  failed to access device
zurück.

Und lt. code in der i2c_start Funktion:
1
:
2
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
3
return 0;
4
:
muss ACK empfangen worden sein, um den Rückgabewert 0 zu erhalten.

Sollte so klappen, wie Du vorhast.

von Elisa W. (Gast)


Lesenswert?

HolgerT schrieb:
> Sollte so klappen, wie Du vorhast.
Klappt leider nicht..
1
uint16_t sts3x_read(void)
2
{
3
  
4
  #define MSB  0
5
  #define LSB 1
6
  #define CRC  2
7
  
8
  uint8_t read[3] = { 0 , 0 , 0 };
9
  
10
  i2c_start_wait( STS3x_ADDR + I2C_WRITE);
11
  i2c_write( STS3x_FETCH_DATA_MSB );
12
  i2c_write( STS3x_FETCH_DATA_LSB );
13
  
14
  
15
  read[MSB] = i2c_rep_start( STS3x_ADDR + I2C_READ );
16
17
  /*
18
  *  Eine neue Messung vorhanden..
19
  */
20
  if ( (read[MSB]) == 1 )
21
  {  
22
    sts3x.state |= STS3X_NO_NEW_DATA;
23
  }
24
  else
25
  {
26
    sts3x.state &= ~(STS3X_NO_NEW_DATA);
27
  }
28
  
29
  read[MSB] = i2c_readAck();
30
  read[LSB] = i2c_readAck();
31
  read[CRC] = i2c_readNak();
32
  i2c_stop();
33
34
  uint8_t crc = 0xff;
35
  crc = _crc8_ccitt_update(crc,read[MSB]);
36
  crc = _crc8_ccitt_update(crc,read[LSB]);
37
38
  /* data correct received? */
39
  if ( crc == read[CRC] )
40
  {
41
    return (uint16_t)read[MSB] << 8 | read[LSB];
42
  }
43
  
44
  return 17000; // 17000 ad value for 0
45
}
Hier mal der ganze Kode.

von Wolfgang (Gast)


Lesenswert?

Bekommst du überhaupt ein ACK, oder ist deine I2C Adresse beim Start 
falsch angegeben?

von Elisa W. (Gast)


Lesenswert?

Wolfgang schrieb:
> Bekommst du überhaupt ein ACK, oder ist deine I2C Adresse beim
> Start
> falsch angegeben?

Ab und zu bekomme Ich ja mal korrekte Werte. Die I2C Adresse vom Sensor 
ist folgende
{c]
#define STS3x_ADDR  ( 0x4A << 1 )
[/c]

von Joachim B. (jar)


Lesenswert?

Elisa W. schrieb:
> Ab und zu bekomme Ich ja mal korrekte Werte.

welche pullups hast du?

von Elisa W. (Gast)


Lesenswert?

Joachim B. schrieb:
> Elisa W. schrieb:
>> Ab und zu bekomme Ich ja mal korrekte Werte.
>
> welche pullups hast du?

Mit der Funktion keine Probleme.. Die macht doch eigentlich nichts 
anderes als auch zu pollen..
1
;*************************************************************************  
2
; Issues a start condition and sends address and transfer direction.
3
; If device is busy, use ack polling to wait until device is ready
4
;
5
; extern void i2c_start_wait(unsigned char addr);
6
;  addr = r24
7
;*************************************************************************
8
9
  .global i2c_start_wait
10
  .func   i2c_start_wait
11
i2c_start_wait:
12
  mov  __tmp_reg__,r24
13
i2c_start_wait1:
14
  sbi   SDA_DDR,SDA  ;force SDA low
15
  rcall   i2c_delay_T2  ;delay T/2
16
  mov  r24,__tmp_reg__
17
  rcall   i2c_write  ;write address
18
  tst  r24    ;if device not busy -> done
19
  breq  i2c_start_wait_done
20
  rcall  i2c_stop  ;terminate write operation
21
  rjmp  i2c_start_wait1  ;device busy, poll ack again
22
i2c_start_wait_done:
23
  ret
24
  .endfunc

von Joachim B. (jar)


Lesenswert?

Elisa W. schrieb:
> Joachim B. schrieb:
>> Elisa W. schrieb:
>>> Ab und zu bekomme Ich ja mal korrekte Werte.
>>
>> welche pullups hast du?
>
> Mit der Funktion keine Probleme..

worüber schreibst du dann hier?

und warum beantwortest du nicht die Frage?

von Elisa W. (Gast)


Lesenswert?

Joachim B. schrieb:
> Elisa W. schrieb:
> Joachim B. schrieb:
> Elisa W. schrieb:
> Ab und zu bekomme Ich ja mal korrekte Werte.
>
> welche pullups hast du?
>
> Mit der Funktion keine Probleme..
>
> worüber schreibst du dann hier?
>
> und warum beantwortest du nicht die Frage?

Die PullUps sind 4K7.

von Joachim B. (jar)


Lesenswert?

Elisa W. schrieb:
> Die PullUps sind 4K7.

versuche mal 1,8k bis 2,2k
manchmal kommen unerklärliche Probleme mit der SW wirklich aus 
Hardwarestörungen.

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Joachim B. schrieb:
> versuche mal 1,8k bis 2,2k
> manchmal kommen unerklärliche Probleme mit der SW wirklich aus
> Hardwarestörungen.

Man könnte den Signalverlauf auch erstmal mit einem Oszi betrachten und 
schaun wie schön der Rechteck ausschaut. ;)

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.