I2C SHT31 i2cmaster.h

OP #4959540
Lesenswert?
• ▲
▼
Hallo Zusammen,

habe mir ein kleines Board mit ATMEGA328P, SHT31 Sensor und einem 
Arduino OLED Display gebaut.

So Display funktioniert! Ich versuche über den I2C Bus die Werte vom 
Sensor auszulesen. Dies klappt irgendwie nicht ganz. Ich bekomme für 
alle data 0-5 die Zahl 17476 zurück.

Wer hat eine Idee?

1
#include "i2cmaster.h"
2

3
#define SHT31    0x44      // I2C Address A of SHT31
4

5
//------------------------------------------------------------------------
6
  //            SHT31
7
  //------------------------------------------------------------------------
8

9

10
  // SHT31 I2C address is 0x44(68)
11
  unsigned int data[6];
12

13
  i2c_init();                                // init I2C interface
14
  i2c_start(SHT31+I2C_WRITE);
15

16
  i2c_write(0x2C);
17
  i2c_write(0x06);
18
  i2c_stop();
19

20
  _delay_ms(300);
21

22
  i2c_init();                                // init I2C interface
23
  i2c_start(SHT31+I2C_WRITE);
24
  i2c_stop();
25

26

27
//  i2c_init();
28
  // Read 6 bytes of data
29
  // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
30
  i2c_rep_start(SHT31+I2C_WRITE);
31

32

33
  data[0] = ((uint8_t)i2c_readAck())<<8;
34
  data[0]|= i2c_readAck();
35
  data[1] = ((uint8_t)i2c_readAck())<<8;
36
  data[1]|= i2c_readAck();
37
  data[2] = ((uint8_t)i2c_readAck())<<8;
38
  data[2]|= i2c_readAck();
39
  data[3] = ((uint8_t)i2c_readAck())<<8;
40
  data[3]|= i2c_readAck();
41
  data[4] = ((uint8_t)i2c_readAck())<<8;
42
  data[4]|= i2c_readAck();
43
  data[5] = ((uint8_t)i2c_readAck())<<8;
44
  data[5]|= i2c_readNak();
45

46
  
47
  i2c_stop();
48

49

50
  char char_data0[20];
51
  itoa( data[0], char_data0, 10 ); 
52
  
53
  char char_data1[20];
54
  itoa( data[1], char_data1, 10 ); 
55
  
56
  char char_data2[20];
57
  itoa( data[2], char_data2, 10 ); 
58
  
59
  char char_data3[20];
60
  itoa( data[3], char_data3, 10 );
61
  
62
  char char_data4[20];
63
  itoa( data[4], char_data4, 10 );
64
   
65
  char char_data5[20];
66
  itoa( data[5], char_data5, 10 );
#4959725
Lesenswert?
• ▲
▼
Hi

Alain F. schrieb:
> i2c_stop();
>
> //  i2c_init();
>   // Read 6 bytes of data
>   // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
>   i2c_rep_start(SHT31+I2C_WRITE);

Wieso eigentlich STOP und darauf folgend ein REPEAT-START?
Ok, unterm Strich sind START und REPEAT-START 100% identisch (auf dem 
Bus kommt das Gleiche an), aber 'mit Sinn und Verstand' ist Das nicht, 
eher C&P.

Von einem Init eines Display sehe ich in dem Code Nichts.
Ebenfalls dürften, irgendwo, auch Spezialitäten des verwendeten µC 
includiert werden - sehe ich auch Nichts von.

Auch beziehst Du Dich auf die Header-Datei XYZ.h, Welche nur includiert 
wird, also mit dem eigentlichen Problem wohl wenig bis Nichts zu tun 
hat.

Meine Frage:
Ist das Programm ggf. doch etwas umfangreicher, als hier gezeigt?
(ein einfaches Ja würde, theoretisch, schon reichen, aber nicht wirklich 
helfen)

MfG
Gast #4959751
Lesenswert?
• ▲
▼
Alain F. schrieb:
> #define SHT31    0x44      // I2C Address A of SHT31

> i2c_start(SHT31+I2C_WRITE);

Bist du sicher, dass du den SHT31 mit dem I2C_Start-Aufuf überhaupt 
erreichst. Laut Datenblatt liegt der auf 0x44 (ADDR an Gnd) bzw. 0x45 
(ADDR an VCC). So wie du den Aufruf gemacht hast versuchst du es auf 
0x22.

Guck dir mal den Unterschied zwischen I2C-Adresse und dem für deinen 
Funktionsaufruf erforderlichen Argument an. So ist das jedenfalls 
sinnfrei.
http://www.nxp.com/documents/user_manual/UM10204.pdf
Gast #4959993
Lesenswert?
• ▲
▼
Alain F. schrieb:
> Wieso ist der Aufruf auf 0x22? Ich habe ja i2c_start(SHT31+I2C_WRITE);

Eben.

Ich kenne jetzt die von dir verwendete I2C-Bibliothek nicht, aber bei 
den meisten Bibliotheken erwartet die i2c_start()-Funktion als Argument 
das komplette erste Byte der I2C-Übertragung, also in den oberen 7 Bit 
die I2C-Adresse und im LSB das R/W-Bit.
Gast #4960036
Lesenswert?
• ▲
▼
Alain F. schrieb:
> Hier die I2C Lib.

Dann guck dir dort mal den Beispiel-Code an. Dort ist die Adresse des 
24C02 als 0xA2 angegeben. Das ist eine 8 Bit Angabe, die wenig mit der 
Adressdefinition nach I2C-Spezifikation (7 Bit) zu tun hat.

Du muss für deinen Funktionsaufruf die im Datenblatt angegebene Adresse 
mit 2 multiplizieren.

Versuch es mal mit
1
i2c_start(0x88 + I2C_WRITE);
OP #4960681
Lesenswert?
• ▲
▼
Geschafft!
1
  // SHT31 I2C address is 0x44 8bit daher als Adresse 0x88 nehmen!!!
2
  unsigned data[6];
3

4
  i2c_init();                                // init I2C interface
5
  i2c_start(SHT31+I2C_WRITE);
6

7
  i2c_write(0x2C);
8
  i2c_write(0x06);
9
  i2c_stop();
10

11
  _delay_ms(300);
12

13
  //i2c_init();                                // init I2C interface
14
  //i2c_start(SHT31+I2C_WRITE);
15
  //i2c_stop();
16

17

18
  i2c_init();
19
  // Read 6 bytes of data
20
  // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
21
  //i2c_rep_start(SHT31+I2C_READ);
22
  i2c_rep_start(SHT31+I2C_READ);
23

24
  data[0]= i2c_readAck();
25
  data[1]= i2c_readAck();  
26
  data[2]= i2c_readAck();
27
  data[3]= i2c_readAck();
28
  data[4]= i2c_readAck();
29
  data[5]= i2c_readNak();  
30
  i2c_stop();
31

32

33

34
  char char_data0[20];
35
  itoa( data[0], char_data0, 10 ); 
36
  
37
  char char_data1[20];
38
  itoa( data[1], char_data1, 10 ); 
39
  
40
  char char_data2[20];
41
  itoa( data[2], char_data2, 10 ); 
42
  
43
  char char_data3[20];
44
  itoa( data[3], char_data3, 10 );
45
  
46
  char char_data4[20];
47
  itoa( data[4], char_data4, 10 );
48
   
49
  char char_data5[20];
50
  itoa( data[5], char_data5, 10 );
51

52

53

54

55

56
  float temp2 = (data[0] * 256) + data[1];
57
  float cTemp2 = -45.0 + (175.0 * temp2 / 65535.0);
58
  float fTemp2 = (cTemp2 * 1.8) + 32.0;
59
  float humidity2 = (100.0 * ((data[3] * 256.0) + data[4])) / 65535.0;
60

61
  char char_cTemp2[20];
62
  itoa( cTemp2, char_cTemp2, 10 ); 
63
  char char_RH2[20];
64
  itoa( humidity2, char_RH2, 10 ); 
65

66
  strcpy(char_cTemp2, char_cTemp2);
67
  strcat(char_cTemp2, " °C");
68
 
69
  strcpy(char_RH2, char_RH2);
70
  strcat(char_RH2, " %RH");
Gast #5014178
Lesenswert?
• ▲
▼
Wolfgang schrieb:
> Dann guck dir dort mal den Beispiel-Code an. Dort ist die Adresse des
> 24C02 als 0xA2 angegeben. Das ist eine 8 Bit Angabe, die wenig mit der
> Adressdefinition nach I2C-Spezifikation (7 Bit) zu tun hat.

Die i2c Adresse sind die ersten 7 bit von den ersten 8 die übertragen 
werden. Das letzte gibt an, ob geschrieben oder gelesen wird.
Wenn die die Adresse in die 8 bit "hineinschreibst", also um 1 bit nach 
links verschiebst entspricht das einer Multiplikation mit 2.

Das kommt jetzt stark auf die verwendete Bibliothek an, ob du die 
Adresse um 1 Bit shiften musst oder nicht.

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.