I2C DS1631 nur NACK

Gast #4002534
Lesenswert?

Hallo,

ich versuche derzeit mit dem openPicus Flyport Wifi B [1] den 
I2C-Temperatur Sensor DS1631 [2] (Nachfolger des DS1621) auszulesen. Das 
klappt aber leider nicht so wie gewünscht.

Das ganze sieht folgendermaßen aus:
SCL des Sensors an p1(SCL) des FlyPort Moduls.
SDA des Sensors an p3(SDA) des Flyport Moduls.
Läuft mit 5V und je einem 4K7 Ohm Pullup an den Leitungen.

Da ich bei jedem Command immer ein NACK als Antwort bekomme und msb, 
sowie lsb des Temperaturregisters immer FFh sind, denke ich an meinem 
Code stimmt was nicht.
Die einzelnen Funktionen sind auf der Seite von [3] genauer erläutert.
1
#include <stdio.h>
2

3
#include "taskFlyport.h"
4

5
void FlyportTask()
6
{
7
char buf[30];
8
UCHAR8 msb,lsb;
9

10
// Flyport connects to default network
11
WFConnect(WF_DEFAULT);
12
while(WFGetStat() != CONNECTED);
13
vTaskDelay(25);
14
UARTWrite(1,"Flyport Wi-fi connected...hello world!\r\n");
15

16
I2CInit(LOW_SPEED);
17

18

19

20
while(1)
21
{
22
  I2CStart();
23
  if(!I2CWrite(0x90)) //device adress
24
   UARTWrite(1, "NACK 0x90\n");
25
  if(!I2CWrite(0x51))
26
   UARTWrite(1, "NACK 0x51\n"); //start temperature convert
27
  I2CStop();
28
 
29
  I2CStart();
30
  if(!I2CWrite(0x90))
31
   UARTWrite(1, "NACK 0x902\n");
32
  if(!I2CWrite(0xAA)) //read temperature registers
33
   UARTWrite(1, "NACK 0xAA\n");
34
  I2CRestart();
35
  if(!I2CWrite(0x91))
36
   UARTWrite(1, "NACK 0x91\n");
37
  msb = I2CRead(0);
38
  lsb = I2CRead(1);
39
  I2CStop();
40
 
41
  sprintf(buf, "%02x\n%02x\n\n", msb, lsb);
42
  UARTWrite(1, buf);
43
  DelayMs(1000);
44
}
45
}

[1] http://wiki.openpicus.com/index.php/Flyport_WiFi_b
[2] http://datasheets.maximintegrated.com/en/ds/DS1631-DS1731.pdf
[3] http://wiki.openpicus.com/index.php/I2C_Functions
Gast #4005865
Lesenswert?

Schande über mein Haupt und Schande über meinen IT-Lehrer, der sich ja 
100% sicher war, dass A0, A1, A2 auf der Platine auf GND liegen (was 
sich nach Abfahren der Leitungen als falsch herausstellte...)

Adresse ist daher nicht 0x90 sondern 0x9E (ohne shift @jar).

Danke dennoch für die Hilfe.

Hier der Code der funktioniert:
1
#include <stdio.h>
2

3
#include "taskFlyport.h"
4

5
#define DEVICE_ADRESS 0x9E
6

7
void FlyportTask()
8
{
9
char buf[30];
10
UCHAR8 msb,lsb;
11

12
// Flyport connects to default network
13
WFConnect(WF_DEFAULT);
14
while(WFGetStat() != CONNECTED);
15
vTaskDelay(25);
16
UARTWrite(1,"Flyport Wi-fi connected...hello world!\r\n");
17

18
I2CInit(LOW_SPEED);
19

20
while(1)
21
{
22
  
23
  
24
  I2CStart();
25
  if(!I2CWrite(DEVICE_ADRESS)) //device adress
26
   UARTWrite(1, "NACK 0x9E\n");
27
  if(!I2CWrite(0x51))
28
   UARTWrite(1, "NACK 0x51\n"); //start temperature convert
29
  I2CStop();
30
 
31
  I2CStart();
32
  if(!I2CWrite(DEVICE_ADRESS))
33
   UARTWrite(1, "NACK 0x902\n");
34
  if(!I2CWrite(0xAA)) //read temperature registers
35
   UARTWrite(1, "NACK 0xAA\n");
36
  I2CRestart();
37
  if(!I2CWrite(DEVICE_ADRESS + 1))
38
   UARTWrite(1, "NACK 0x91\n");
39
  msb = I2CRead(0);
40
  lsb = I2CRead(1);
41
  I2CStop();
42
  
43
  BYTE Th=msb, Tl=lsb;
44
 
45
  if(Th>=0x80) //if sign bit is set, then temp is negative
46
 Th = Th - 256;
47
 int T_dec=(10*(100*(Tl/16)))/16; // decimal part of the T°
48
  
49

50
 if(T_dec < 10)
51
  sprintf(buf, "Temperatur: %d.0%d\n", (int)Th, T_dec)
52
 else if(T_dec < 100)
53
  sprintf(buf, "Temperatur: %d.00%d\n", (int)Th, T_dec);
54
else 
55
  sprintf(buf, "Temperatur: %d.%d\n", (int)Th, T_dec);
56
  
57
  UARTWrite(1, buf);
58
  DelayMs(2000);
59
}
60
}

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