Hat jemand schon mal 2x SPI ausprobiert?

  • Hallo Gemein(d)e ;) ...



    Nach meinem Verständnis kann man doch über GPIO7 und GPIO8 zwischen SPI.1 und SPI.0 umschalten.
    Sehe ich das richtig?
    Hat das schon mal jemand ausprobiert?
    Muss ich zum Umschalten immer einen open() machen, oder reicht es, einmal einen open() auf SPI.1 und einmal auf SPI.0 zu machen, die Descriptoren zu merken und mit den beiden GPIOs zu toggeln?


    cheers,
    -ds-

  • Servus ds,
    hab zwar mit SPI noch nix gemacht (und sollte lieber 's Maul halten), aber rein gefühlsmässig sollte das Togglen mit 2 fd eigentlich klappen, wenn ein Vorgang am jeweils anderen Bus abgeschlossen ist. Die Software kriegt davon ja nix mit, oder?


    Aber vielleicht kommt noch ein Praktiker ... Obwohl man es ja auch schnell ausprobieren könnte ?


    n8ly greez,
    mmi

  • Bei SPI sollte der Entsprechnde Kanal immer erst direkt vor einer Übertraggung aktiviert werden. Ein einmaliges Aktivieren kann zu Fehlern führen.


    Bei CE0 und CE1 handelt es sich quasi um Aktivierungs Leitungen. Wenn auf SPI.0 etwas gemacht werden soll wird CE0 auf 0/GND gesetzt und damit weiss der Chip jetzt kommt auf MOSI etwas für den Chip.


    Ich hatte dfas Problem mal bei einem A/D-Wandler. Ich hatte die CE0-Leitung dauerhaft aktiviert und der Chip lieferte nur unbrauchbare Ergebnisse. Als ich CE0 nur beim Auslesen auf 0 setzte lief alles super.

  • Hi Björn,


    danke für die Antwort.
    Ich bin ja eher in C unterwegs, deshalb meine open()/close() Aufrufe ;)


    Also ein open() am Anfang des Programms auf SPI.0 und einer auf SPI.1
    Schreibe ich auf Kanal 0, dann ziehe ich CE0 auf GND, CE1 auf HIGH und schreibe auf den fd von SPI.0.
    Schreibe ich auf Kanal 1, dann ziehe ich CE1 auf GND, CE0 auf HIGH und schreibe auf den fd von SPI.1.
    Und zum Schluss dann ein close für jeden SPI Kanal.


    Hab' ich das richtig verstanden?


    cheers,
    -ds-

  • Ich glaube du hast es richtig verstanden.


    Ich benutze allerdings wiringPi.


    Was ich jetzt nicht weiß. Ob beim open() von SPI.0 CE0 nicht vielleicht direkt auf LOW gesetzt wird. Per Hand setzt man CE0 eigentlich nicht auf LOW.


    Da wäre die vorgehensweise eher:


    open(SPI0)
    writeData
    close(SPI0)


    open(SPI1)
    writeData
    close(SPI1)


    ...


    PS: So sehen meine Programme aus:

  • Hi Bjoern,


    nun, diesen Mechanismus


    Code
    open(SPI0)
     writeData
     close(SPI0)
     ...
     open(SPI1)
     writeData
     close(SPI1)


    würde ich gerne vermeiden.
    Angenommen der writeData setzt auch CE0 bzw. CE1 richtig, dann ist meine Vorstellung eher so:



    Ich will mir halt den Overhead beim open()/close() sparen und den armen Prozessor nicht allzusehr quälen .
    Ich denke, das muss ich wohl ausprobieren. Ob ich dann wiringPi oder pigpio einsetze oder keins von beiden wird sich zeigen.
    Ich hab' da so eine Idee ... aber das muss warten bis ich die Displays und die Funkstrecken gebacken bekommen habe ;) ...


    Salü,
    -ds-