Forum: Mikrocontroller und Digitale Elektronik I2C DS1631 nur NACK


von Nil (nilsnilss)


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

: Bearbeitet durch User
von NSA (Gast)


Lesenswert?

Push

von Oliver S. (oliverso)


Lesenswert?

Pop...

Der sichtbare Code sieht unauffällig aus. Ergo liegt das Problem 
woanders. Wenn schon auf die Adresse ein Nack kommt, stimmt entweder die 
Adresse nicht, oder es ist was grundsätzlich verkehrt.

Oliver

von Nil (nilsnilss)


Lesenswert?

Alles klar, dann werd ichs mal mit einem Atmega32 versuchen und schauen 
was dabei rauskommt.
Dann kann ich den Fehler zumindest auch bei der Verkabelung oder dem 
Temperatursensor ausschließen.

von Joachim B. (jar)


Lesenswert?

Nils Friess schrieb:
> I2CStart();
>   if(!I2CWrite(0x90)) //device adress
>    UARTWrite(1, "NACK 0x90\n");

setze mal in write

!I2CWrite(0x90>>1)

ein.

Versuch macht kluch

von (prx) A. K. (prx)


Lesenswert?

Wie sind A0,A1,A2 beschaltet?

von Nil (nilsnilss)


Lesenswert?

A0, A1, A2 alle gegen GND. Das mit dem Shift werde ich probieren.

von (prx) A. K. (prx)


Lesenswert?

Die Doku-Seite vom Flyport zeigt I2CxxxxReg/Multi Funktionen die direkt 
auf den DS1631 passen sollten. Desssen Command Byte entspricht dann der 
Registeradresse der Flyport-Funktionen. Dort dürfte das mit der 7-Bit 
Adresse dann auch zutreffen, also 0x48 statt 0x90.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Nils Friess schrieb:
> Das mit dem Shift werde ich probieren.

melde mal rück bitte

von Nil (nilsnilss)


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
}

: Bearbeitet durch User
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.