I2C mit WiringPi funktioniert nicht

Gast #3194217
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
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 #3194606
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.
Gast #3194849
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
> 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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.