Forum: Mikrocontroller und Digitale Elektronik I2C mit WiringPi funktioniert nicht


von Gefrierbrand (Gast)


Lesenswert?

Hallo!

Ich habe an meinem Raspberry Pi den I2C Bus aktiviert und da einen 
Sensor drangehängt.

Der Zugriff funktioniert mit den Standard-Tools wie i2cget bzw i2cset 
problemlos.

Ich erhalte z.B. so etwas:
1
sudo i2cget -y 1 0x53 0x00
2
0xe5

Wenn ich nun allerdings die WiringPi Bibliothek (http://wiringpi.com/) 
verwende um "schön" in einem C Programm auf den Sensor zuzugreifen, 
erhalte ich immer nur eine -1.

Folgender Code:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <wiringPi.h>
4
#include <wiringPiI2C.h>
5
6
int main ()
7
{
8
  //wiringPiSetupPhys();
9
  printf("SETUP: %i \n", wiringPiI2CSetup(0x53));
10
  printf("READ:  %i \n", wiringPiI2CReadReg8(0x53, 0x00)); //erwartetes Ergebnis: 0xe5 bzw. 229 
11
  printf("WRITE: %i \n", wiringPiI2CWriteReg8(0x53, 0x2D, 0x10));
12
  exit(EXIT_SUCCESS);
13
}

liefert leider das:
1
SETUP: 3
2
READ:  -1
3
WRITE: -1
Ich kann leider keinen Fehler im Code finden. Die Hardware funktioniert 
definitiv. Auf der WiringPi Webseite habe ich mich nun auch schon zu 
tode gesucht.

Hat irgendwer Ideen/Tipps/Hinweise?

von HerrPitillo (Gast)


Lesenswert?

Hallo,
Du hast vergessen das fd zu lesen, ich weiß zwar jetzt nicht genau wofür 
dieses genau gut ist aber du musst dieses auslesen, ungefähr so:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <wiringPi.h>
4
#include <wiringPiI2C.h>
5
6
int main ()
7
{
8
  //wiringPiSetupPhys();
9
  int fd = 0;
10
  fd = wiringPiI2CSetup(0x53);
11
  printf("SETUP: %i \n", fd);
12
  printf("READ:  %i \n", wiringPiI2CReadReg8(fd, 0x53, 0x00)); //erwartetes Ergebnis: 0xe5 bzw. 229 
13
  printf("WRITE: %i \n", wiringPiI2CWriteReg8(fd, 0x53, 0x2D, 0x10));
14
  exit(EXIT_SUCCESS);
15
}

Probier es mal so. Eigentlich sollte es so funktionieren

Gruß HerrPitillo;)

von EFA (Gast)


Lesenswert?

Hast du bedacht dass sich am pi zwischen Rev1 und Rev2 die 
Interfacebezeichnung geändert hat (i2c0 vs. i2c1)?

Kenne wiringpi nicht, kann sein dass das da schon berücksichtigt wird.

von Gefrierbrand (Gast)


Lesenswert?

HerrPitillo schrieb:
> Hallo,
> Du hast vergessen das fd zu lesen, ich weiß zwar jetzt nicht genau wofür
> dieses genau gut ist aber du musst dieses auslesen, ungefähr so:#include 
<stdio.h>
> #include <stdlib.h>
> #include <wiringPi.h>
> #include <wiringPiI2C.h>
>
> int main ()
> {
>   //wiringPiSetupPhys();
>   int fd = 0;
>   fd = wiringPiI2CSetup(0x53);
>   printf("SETUP: %i \n", fd);
>   printf("READ:  %i \n", wiringPiI2CReadReg8(fd, 0x53, 0x00)); //erwartetes 
Ergebnis: 0xe5 bzw. 229
>   printf("WRITE: %i \n", wiringPiI2CWriteReg8(fd, 0x53, 0x2D, 0x10));
>   exit(EXIT_SUCCESS);
> }
>
> Probier es mal so. Eigentlich sollte es so funktionieren
>
> Gruß HerrPitillo;)


Danke, das hat mich in die Richtige Richtung geführt!

So funktioniert es nun:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <wiringPi.h>
4
#include <wiringPiI2C.h>
5
6
int main ()
7
{
8
  //wiringPiSetupPhys();
9
  int fd = 0;
10
  fd = wiringPiI2CSetup(0x53);
11
  printf("SETUP: %i \n", fd);
12
  printf("READ:  %i \n", wiringPiI2CReadReg8(fd, 0x00)); //erwartetes Ergebnis: 0xe5 bzw. 229 
13
  printf("WRITE: %i \n", wiringPiI2CWriteReg8(fd, 0x2D, 0x10));
14
  exit(EXIT_SUCCESS);
15
}

>Hast du bedacht dass sich am pi zwischen Rev1 und Rev2 die
>Interfacebezeichnung geändert hat (i2c0 vs. i2c1)?
>
>Kenne wiringpi nicht, kann sein dass das da schon berücksichtigt wird.

Das wird bereits berücksichtigt.

von Detlef Freckel (Gast)


Lesenswert?

Was ist WiringPi?

von Filedescriptor (Gast)


Lesenswert?

> Du hast vergessen das fd zu lesen, ich weiß zwar jetzt nicht genau wofür
> dieses genau gut ist aber du musst dieses auslesen, ungefähr so:
Wer unter Unix/Linux programmiert und nicht weiss was eine 
Filedescriptor (fd) ist, hat eine riesige Bildungslücke.

http://openbook.galileocomputing.de/linux_unix_programmierung/Kap02-000.htm#RxxKap02000040000AE1F02D100

Das Kapitel in diesem Buch, ein anderes Buch geht natürlich auch, mal 
durch arbeiten sollte ein wenig helfen.

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.