• Hallo,
    Ich wollte gerne SPI über C machen, da man dort die beste Performanz hat. Allerdings habe ich von C nicht viel Ahnung. Habe Tutorials gelesen und die ersten Testspielereien funktionieren auch so weit.
    Ich weiß, dass man SPI über verschiedene Wege in C machen kann auf dem Pi. Ich wollte es gerne über die bcm2835 Bibliothek machen. Wenn ein anderer Weg besser ist, dann könnt ihr mir das sagen. Ich habe folgenden Testcode genommen:
    Quelle: http://www.netzmafia.de/skripten/hardw…/RasPi_SPI.html

    Ich mache das ganze über Geany direkt auf dem Pi, allerdings wird mir beim kompilieren gesagt, dass die Bibliothekt nicht gefunden werden kann, also bcm.
    Könnt ihr mir Ratschläge geben und helfen, was ich falsch mache ?

    Mit freundlichen Grüßen :)

    Einmal editiert, zuletzt von Dudeplayz (25. Januar 2017 um 02:18)

  • Gegen C ist ja nichts einzuwenden -aber ich bezweifele, das die bcm Bibliothek da viel bringt. Wenn du stattdessen die Standard SPIDEV IOCH Aufrufe benutzt, ist das nicht weniger schnell. Vor allem macht der kernel das für dich im Interrupt. Das * sollte * etwas Resourcen schonender sein. Wie das geht ist auch bei der Netzmafia beschrieben.

    Warum glaubst du das reicht nicht ?


  • Gegen C ist ja nichts einzuwenden -aber ich bezweifele, das die bcm Bibliothek da viel bringt. Wenn du stattdessen die Standard SPIDEV IOCH Aufrufe benutzt, ist das nicht weniger schnell. Vor allem macht der kernel das für dich im Interrupt. Das * sollte * etwas Resourcen schonender sein. Wie das geht ist auch bei der Netzmafia beschrieben.

    Warum glaubst du das reicht nicht ?

    Ich denke nicht, dass es nicht reicht. Nur ich habe mich eben für C entschieden, da es in SPI Tests wohl die beste Perfomanz hat. Ich möchte Daten auf einen Arduino übertragen und das muss sehr häufig geschehen, da ich darüber einen LED Cube updaten möchte, deshalb will ich die beste Geschwindigkeit rausholen um ausreichend Zeit für Berechnungen und Co. zu haben. Ich werde es mal probieren, aber wo liegt denn mein Fehler, dass die bcm Bib nicht gefunden wird ?

  • Ich will dir C nicht ausreden. Nur die lib ist eher verpönt. Un d wenn du C benutzen willst, musst du libraries die du verwendest auch hinzu linken. keine Ahnung, wie das in Geany geht-aber normalerweise mit "-lbcm2835"

  • Ok danke habe es jetzt ohne die Bib gemacht. Habe sie eigtl auch beim Kompiler angegeben naja.

    Ich habe jetzt das Problem, dass ich immer eine Fehlermeldung bekomme. Ich habe den Code kopiert und nun bekomme ich beim ausfuehren einen Fehler.

    Hier nochmal der Code:

    Und hier der Fehler:

    Da ich noch nicht wirklich viel Erfahrung mit C habe, waere es gut zu wissen, was nicht stimmt.

  • Moin Dudeplayz,
    es interessiert wahrscheinlich nicht nur mich..

    Was hat den gefehlt in deinem Beispiel??

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.


  • Moin Dudeplayz,
    es interessiert wahrscheinlich nicht nur mich..

    Was hat den gefehlt in deinem Beispiel??

    Gruss Bernd

    Also wenn man sich mal die Datei /usr/include/linux/spi/spidev.h ansieht und sich die Struktur des spi ansieht, dann sieht man das mir 3 Einträge gefehlt haben. Im folgenden Code die letzten 3. Man muss ungenutzte Werte mit 0 belegen, auch wenn man sie nicht braucht, dass hat mir einfach noch im Endeffekt gefehlt.

    Also vollständig muss der Teil des spi so aussehen:

    Code
    spi.tx_buf = (unsigned long)&buffer;[/size][/color]  spi.rx_buf = (unsigned long)&buffer;  spi.len = 1;  spi.speed_hz = 0;  spi.delay_usecs = 0;  spi.bits_per_word = 0;  spi.cs_change = 0;  spi.tx_nbits=0;  spi.rx_nbits=0;  spi.pad=0;

    [/size][/color]

    In meinem Beispiel (also fehlerhaft) sah das dann nur so aus:

    Code
    spi[i].tx_buf        = (unsigned long)(data + i); // transmit from "data"spi[i].rx_buf        = (unsigned long)(data + i); // receive into "data"spi[i].len           = sizeof(*(data + i));spi[i].delay_usecs   = 0;spi[i].speed_hz      = speed;spi[i].bits_per_word = bits;spi[i].cs_change     = 0;

    Vom Array natürlich nicht irritieren lassen, ist dann eben für mehrere Werte :) Und die zugewiesenen Werte dann eben je nachdem, wie man sie gerne hätte ;)
    Hoffe ich kann jmd. mit dem selben Problem helfen :)

    Einmal editiert, zuletzt von Dudeplayz (25. Januar 2017 um 02:17)

Jetzt mitmachen!

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