I2C Verständnissfrage

Gast #5331757
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
}
Gast #5331876
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.
Gast #5332073
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.
Gast #5332090
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.
Gast #5332099
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..
Gast #5332153
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..
Gast #5332171
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.
Gast #5332185
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.
Gast #5332208
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.
Gast #5332481
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.
Gast #5332510
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
Gast #5333355
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.

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