SPI mit wiring Pi in C

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo an alle,

    ich bin mal wieder am basteln und steh vor einem kleinem Problem.

    Ich bin mir sicher, dass es irgendwo im Forum steht aber ich finde nichts.

    Ich möchte folgendes tun:

    Ich möchte einen A/D-Wandler über die SPI Schnittstelle vom Raspberry Pi auslesen.

    Zum Auslesen benutze ich wiringPi. Ich möchte nur lesen.

    Die Einstellungen in der Blacklist und in den Modulen habe ich vorgenommen.

    Mein Code sieht so aus:

    #include <stdio.h>
    #include <wiringPi.h>
    #include <wiringPiSPI.h>

    int channel =0;
    int speed= 1000000;
    int daten=0;
    wiringPiSPISetup(channel,speed);
    daten=wiringPiSPIDataRW(channel,0,32);

    der Code macht keinen Fehler, aber ich bekomm auch keine Aktivität auf dem Bus hin.

    Kann mir einer bitte helfen?

    Vielen Dank

    Grüße Xeriox

    <--Heute ist ein guter Tag zum basteln-->

  • Hallo Xeriox,

    komisch, wenn ich inder Suchfunktion dieses Forums

    Code
    SPI wiring Pi C

    eingebe, kommen ganz viele Code-Beispiele -und auch Grundlagen zu SPI.

    Wenn Du Dich da ein wenig einliest, dann kommst Du früher oder später zu dem hier:

    http://www.airspayce.com/mikem/bcm2835/spi_8c-example.html

    Und? Funzt es nun?

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (11. November 2014 um 13:33)

  • Hi Xeriox,


    ...
    der Code macht keinen Fehler, aber ich bekomm auch keine Aktivität auf dem Bus hin.
    ...


    manchmal kann es hilfreich sein, auch die Anleitungen/Beispiele für die benutzte Lib durchzulesen ...
    Ich mach zwar nix mehr mit der wiringpi aber imho fehlt da was -> click <-

    cu,
    -ds-

  • Hallo Xeriox,

    nachdem ich Dreamshaders Link ( :danke_ATDE: ) gelesen habe, stiess ich auf Folgendes

    Zitat


    •int wiringPiSPISetup (int channel, int speed) ;
    This is the way to initialise a channel (The Pi has 2 channels; 0 and 1). The speed parameter is an integer in the range 500,000 through 32,000,000 and represents the SPI clock speed in Hz.

    The returned value is the Linux file-descriptor for the device, or -1 on error. If an error has happened, you may use the standard errno global variable to see why.

    •int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;

    Dein Code:

    Code
    daten=wiringPiSPIDataRW(channel,0,32);

    hat einen unsigned char *data (also Grösse eines Datenpuffers) von 0 Byte.

    Frage: WO (Speicherzelle, Variable) soll wiringPiSPIDataRW Daten auslesen und ablegen, wenn Du nichts anbietest?

    Du musst ein Array definierter Grösse anlegen und entsprechend übergeben...

    Ich kann Dein Programm gut verstehen: Keine Fehler im Code - aber passiert nichts...

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (11. November 2014 um 14:53)

  • Vielen Dank für eure Antworten, ich bin noch an Doku lesen.

    Werde den fertigen Code dann mal posten.

    Wenn ich nicht weiter komme melde ich mich nochmal.

    Viele Grüße

    Xeriox

    <--Heute ist ein guter Tag zum basteln-->

  • Nagut ich habe gerade voll den Hänger.

    Ich glaube es scheitert bei mir an folgender Stelle:

    wiringPiSPIDataRW(0,buf,32);

    ich versteh diesen Code noch nicht so richtig.

    Ich möchte einen Datensatz von 32 Bit Länge lesen. so wie ich es jetzt verstanden habe wird der Inhalt des Datensatzes in unsigned char buf geschrieben. Char hat die Größe von 1 Byte.

    Brauch ich dann ein Array mit 4 Elementen?

    Oder habe ich noch einen Denkfehler?

    <--Heute ist ein guter Tag zum basteln-->

  • Wie hast du dein Problem gelöst könntest du mal den ganzen Code posten.
    Weil ich sitze grade an der Aufgabe und habe da enorme Probleme.
    Soll einen A/D Wandler über SPI mit dem PI kommunizieren lassen.

    Vielen Dank im voraus und Grüße


  • Da ist eine Beschreibung und Code fuer einen AD-Wandler am SPI

    Hey Tell,
    danke für die schnelle Antwort das Programm scheint ziemlich gut zu sein.
    Ein paar Fragen habe ich dennoch.
    Wie sieht die Ausgabe aus? Sprich wo wird es ausgegeben?
    Da ich in Netbeans Programmiere und dann auf den PI compiliere weiß ich nicht genau wie er das in dem Fall macht.
    Bei meinem Programm habe ich die Spannungswerte in einer .txt Datei gespeichert und habe diese dann auf dem PI geöffnet.

  • Da gibt's ja nicht so viele Moeglichkeiten. In dem Code den du selbst als deinen hier vorgestellt hast benutzt du doch fprintf - und ploetzlich verstehst du das nicht mehr?


  • Da gibt's ja nicht so viele Moeglichkeiten. In dem Code den du selbst als deinen hier vorgestellt hast benutzt du doch fprintf - und ploetzlich verstehst du das nicht mehr?

    Ich habe den Code von meiner Vorgängerin übernommen. Deswegen habe ich auch die Probleme ansonsten hätte ich diese nicht.

  • Ah, mein Fehler - wenn du schreibst "Mein erstes Programm" gehe ich davon aus, dass es sich um *dein* Programm handelt. Nicht um das von jemand anderem, das du auch nicht verstehst.

    Wenn du mit dem Programmieren auf dem Kriegsfuss stehst wuerde ich dir eher zu Python und dem Modul spidev raten, da du dort viel leichter ans Ziel kommst. Ansonsten gibt das von Tell gezeigte Programm die Daten einfach auf der Standardausgabe aus, du kannst die also einfach umleiten in der Shell, oder in das Programm deiner Vorgaengerin schauen & dir abgucken, wie sie stattdessen fprintf benutzt, und das dann anpassen.


  • Ah, mein Fehler - wenn du schreibst "Mein erstes Programm" gehe ich davon aus, dass es sich um *dein* Programm handelt. Nicht um das von jemand anderem, das du auch nicht verstehst.

    Wenn du mit dem Programmieren auf dem Kriegsfuss stehst wuerde ich dir eher zu Python und dem Modul spidev raten, da du dort viel leichter ans Ziel kommst. Ansonsten gibt das von Tell gezeigte Programm die Daten einfach auf der Standardausgabe aus, du kannst die also einfach umleiten in der Shell, oder in das Programm deiner Vorgaengerin schauen & dir abgucken, wie sie stattdessen fprintf benutzt, und das dann anpassen.

    Ich verstehe ihr Programm.
    Bezüglich der Ausgabe des anderen Programms. Ich programmiere in NetBeans compiliere dann auf den PI und über Putty führe ich die gesamten Datein aus. Meine Verbindung wird durch LAN hergestellt. Und über Putty greife ich auf den Pi zu.
    Wo gebe ich das aus dann ? In NetBeans oder auf dem Putty?


    In dem Program meiner Vorgängerin hat sie die Flanken per Hand gesetzt. Meine Aufgabe ist es dies durch Funktionen aus einer Librarie zu tun. So dass ich keine Probleme mit der Delay Time habe und keine Einbrüche in der Messung von Spannungen.

    Da Sie sich da doch ziemlich gut auskennen, können Sie mir vielleicht dies bezüglich weiter helfen.

    Vielen Dank im voraus und mit freundlichen Grüßen
    Edis :)
    Automatisch zusammengefügt:
    Bezüglich der Programmierung, im Rahmen meines Studiums habe ich die Grundlagen der C Programmierung kennen gelernt und deswegen diese Sprache gewählt bzw weitergeführt.

    Einmal editiert, zuletzt von CaptainsTea (21. Juli 2016 um 17:35)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!