Erstmalig SPI einsetzen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich versuche erstmalig SPI zu verwenden. Leider tut sich bei mir absolut gar nichts, so dass ich einfach nicht sagen kann, ob die Schaltung/Platine fehlerhaft ist, oder ob ich schon bei der Software Fehler mache.

    Ich habe jetzt einfach mal zu Beginn das Script von Erik Bartmann verwendet und angepasst:

    Wenn ich dieses Script starte, passiert gar nichts.
    Ist der letzte sendSPI-Befehl denn korrekt? Ich möchte hier einfach den Pin5 (GPB4) einschalten und von hier über einen ULN2803 ein 5V-Relais schalten.

    Wie kann ich denn schon vorweg "testen", ob alle notwendigen Module geladen sind usw..? Vielleicht liegt das Problem ja ganz woanders.

    Bei I2C-Schnittstellen kann ich ja mit i2cdetect anzeigen lassen, welche ICs angesprochen werden können. Gibt es vergleichbares bei SPI?

  • Habe in der Blacklist i2c rausgenommen und dafür spi reingenommen...

    Code
    ls /dev/spidev*


    ergibt: /dev/spidev0.0 /dev/spidev0.1

    Wenn ich dann dieses Testscript versuche

    Python
    #!/usr/bin/python
    import spidev
    import time
    spi = spidev.SpiDev()
    spi.open(0,0)
    while True:
       resp = spi.xfer2([0x00])
       print resp[0]
       time.sleep(1)

    erhalte ich nur "0" als Ausgabe.

    Habe zwar gesehen, dass GPIO 9 und 10 vertauscht waren. Aber das behebt dennoch nicht das Problem. :(

    Code
    gpio readall


    Mit dem Script aus dem ersten Post werden zumindest
    GPIO 27 auf HIGH
    MOSI auf HIGH
    MISO auf LOW
    SCLK auf LOW

    gesetzt. Das müsste ja alles so stimmen. Ich weiß nicht wie ich nun weiter nach dem Fehler suchen soll...

    Stimmt denn "sendSPI(SPI_SLAVE_ADDR, SPI_GPIOB, 0x10)" für Pin5 (GPB4)?

  • ja sie lebt noch, sie lebt noch.....


    was machen die anderen Projekte ? man liest gar nix mehr

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ja hey,
    sorry ... ich hab' absolut keinen Plan was Python betrifft, aber vielleicht bringts ja trotzdem was.


    Habe in der Blacklist i2c rausgenommen und dafür spi reingenommen...

    Äh ... blacklist heisst: diese Module nicht laden. spi reingenommen heisst für mich SPI geblacklistet (blödes Wort ... egal).

    Die /etc/modprobe.d/raspi-blacklist.conf sollte in etwa so aussehen (zumindest was spi betrifft):

    Code
    # blacklist spi and i2c by default (many users don't need them)
    #blacklist spi-bcm2708
    #blacklist i2c-bcm2708
    Code
    ls /dev/spidev*


    ergibt: /dev/spidev0.0 /dev/spidev0.1

    Ob die Gerätedatei nicht evtl. trotzdem angelegt wird, vermag ich jetzt nicht mit Sicherheit zu sagen.
    Hast Du denn die zugehörigen Module geladen:

    Code
    $ sudo modprobe spi_bcm2708
    $ sudo modprobe spidev


    Wenn ich dann dieses Testscript versuche

    Hmm ... was sollte es denn ausgeben? Das lauert doch wohl lediglich am ersten SPI-Bus.


    Stimmt denn "sendSPI(SPI_SLAVE_ADDR, SPI_GPIOB, 0x10)" für Pin5 (GPB4)?

    Da muss ich passen ...

    Huhu ... dbv ... smiley_emoticons_winken3.gif

    cu,
    -ds-

  • jar: Klar :) Die anderen Projekte funktionieren hervorragend - eigentlich habe ich überall eine Rückmeldung gegeben. Wenn doch irgendwo was fehlt, dann ohne jede Absicht.
    Jetzt versuche ich die Projekte zusammenzufassen. Habe das Ganze auf eine Platine gepackt. Die Herstellung/Versand der Platine hat 4 Wochen gedauert (OSH) und noch ein paar Teile habe gefehlt. Deshalb jetzt der zeitliche Versatz.

    Ich schreibe auch gerade an einer Projektbeschreibung - zum Nachbasteln. Nur macht es keinen Sinn, wenn es ja gar nicht funktioniert.

    dreamshader: Vielen Dank für deinen Beitrag. Leider bringt mich das nicht weiter. Ja, mit der Blacklist ist blöd formuliert; ist aber richtig.
    Bei dem letzten sendSPI: Es wird die GPB angesprochen. Die einzelnen Pins dann über 8 Bit. Da ich den 5. haben will, lande ich nach meinem Verständnis bei 0x10. Weiß aber nicht ganz sicher, ob das stimmt.

    Leider bekomme ich den MCP23S17 immer noch nicht ans Laufen... Ich könnte heulen... nach so viel Arbeit.

    Mir fällt nur noch ein, dass ich ja nicht die GPIOs 7 und 8 für CE0 und CE1 nutze, sondern freie Pins verwende (da ich später sowieso mehr brauche). Aber eigentlich müsste es doch dennoch gehen, oder?

    Einmal editiert, zuletzt von blabla333 (21. Juni 2014 um 22:11)


  • Mir fällt nur noch ein, dass ich ja nicht die GPIOs 7 und 8 für CE0 und CE1 nutze, sondern freie Pins verwende (da ich später sowieso mehr brauche). Aber eigentlich müsste es doch dennoch gehen, oder?

    danke für deine Rückmeldung, kann sein das ich auch was übersehen hatte oder weil einige Threads so zerpflückt waren.

    SPI braucht IMHO die zugehörigen CE0 und CE1 obwohl mir das auch nicht ganz klar ist !

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • ...
    Leider bekomme ich den MCP23S17 immer noch nicht ans Laufen... Ich könnte heulen... nach so viel Arbeit.

    Mir fällt nur noch ein, dass ich ja nicht die GPIOs 7 und 8 für CE0 und CE1 nutze, sondern freie Pins verwende (da ich später sowieso mehr brauche). Aber eigentlich müsste es doch dennoch gehen, oder?

    Na dann kann das ja nicht funktionieren ...
    Wenn ich mir Dein Listing anschaue (als unbedarfte D u m p f-backe in Sachen Python) stellt sich mir die Frage, ob das überhaupt was macht :denker:
    Du hast da zwar eine Sendefunktion ... aber wo bitte wird die aufgerufen :s

    Das mit den Pins CE0 und CE1 ... die werden - in meiner Welt - durchaus als CS verwendet (und zwar i.d.R. automatisch, ohne dass ich sie setzen muss).
    Evtl. ist das in Python auch so ... vielleicht mal in einem anderen SPI Beispiel spicken ????
    Dann wäre Dein Handshake (CS -> low -> senden -> high) überflüssig bzw. sogar falsch ...

    Hm ... und sonst ... tja, wird schon irgendwie ...
    -ds-

    //EDIT: Wo kann ich diese nervige Zensur-Funktion deaktivieren ... das find ich ja dermassen was von lästig ...


  • jar: Klar :) Die anderen Projekte funktionieren hervorragend - eigentlich habe ich überall eine Rückmeldung gegeben.


    22 Threads eröffnet, schau einfach noch mal wo deine Rückmeldung fehlt ;)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Also nach meinen Recherchen sollen freie Pins durchaus möglich sein. Man muss sich nicht auf CE0 oder CE1 beschränken...

    Zur Adressierung: http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf --> Figure 1-5 (Seite 8).
    Hieraus ergibt sich als Opcode 0x40 (alle Adresspins auf GND gezogen) und 0x10 für Pin5 auf 1, sonst alle 0... CS wird vorher auf Low gesetzt und danach auf High.

    Einmal editiert, zuletzt von blabla333 (21. Juni 2014 um 23:57)


  • Also nach meinen Recherchen sollen freie Pins durchaus möglich sein. Man muss sich nicht auf CE0 oder CE1 beschränken...

    Zur Adressierung: http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf --> Figure 1-5 (Seite 8).


    dieser microchip weiss aber nicht wie der PI seine SPI Schnitte bedienen will, du machst das ja mit dem SPI von Seiten PI nicht auf low level Ebene sondern nutzt das Betriebssystem und da kann es andere Abhängigkeiten geben.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (22. Juni 2014 um 00:05)

  • na
    spi.open(0,0)
    while True:
    resp = spi.xfer2([0x00])

    Hochsprache ! das Betriebsystem macht die notwendigen Befehle für dich.....
    Im Gegensatz wäre direkte Prozessoransprache Register setzen, Bitrate, CS im richtigen Timing high und low setzen.

    da du aber die Hochsprache benutzt hast du nicht mehr die Wahl wer CE oder CS ist ! und wann es gesetzt wird.
    und spi.open(0,0) sieht nach CE0 aus

    ist als wenn du bei deiner Köchin Bratkartoffeln bestellst, da hast du die Salzmenge auch nicht in der Hand, willst du die Salzmenge kontrollieren musst du selber die Bratkartoffeln machen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (22. Juni 2014 um 00:28)

  • Ich habe wieder von Grund auf am Steckbrett angefangen und bin erst einmal bei dem eingangs erwähnten Script geblieben:

    Geschaltet wird ein MCP23S17 in Kombination mit einem ULN2803. Der MCP23S17 wird mit 3,3V betrieben; über den ULN2803 wird eine LED mit 5V versorgt. Endlich funktioniert alles.
    Ich habe einen beliebigen GPIO-Pin als CS gewählt. Funktioniert (fast) alles wunderbar mit dem obigen Code.

    Mit diesem Abschluss

    Code
    # Initialisierung de MCP23S17
        sendSPI(SPI_SLAVE_ADDR, SPI_IODIRB, 0x00) # GPPIOB als Ausgaenge programmieren
    
    
        while True:
            time.sleep(1)
            sendSPI(SPI_SLAVE_ADDR, SPI_GPIOB, 0x10)  # einschalten
            time.sleep(1) 
            sendSPI(SPI_SLAVE_ADDR, SPI_GPIOB, 0x00) #ausschalten

    sollte die LED regelmäßig blinken. Allerdings bleibt sie immer wieder hängen. Mal blinkt sie regelmäßig und manchmal bleibt sie ein paar Takte ein- oder ausgeschaltet. Ganz unregelmäßig. Das scheint irgendein Synchronisationsproblem zu sein...

    Einmal editiert, zuletzt von blabla333 (22. Juni 2014 um 19:21)

Jetzt mitmachen!

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