I2C mit WiringPi funktioniert nicht

Gast #3194217
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?
Gast #3194246
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;)
Gast #3194849
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.
Gast #3194920
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.

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.