Mehrfachsendung von Data durch Bus

  • Hi,

    ich mill an meinen Raspi zwei AD-Wanlder anschließen, nennen wir sie AD1 und AD2. Die beiden ADx sind mittels SPI (miso, mosi, ssclock) verbunden und AD1 hängt an CE0, AD2 an CE1.

    Ich will den Spannungswert von AD1 alle 0,05 Sekunden erfassen, denn Wert von AD2 aber nur auf Anforderung.

    Damit das also mit den alle 0,05 Sekunden klappt, kann ich die erste Routine entweder in einen separaten Thread stellen, der eine Pause von 50ms (abzüglich benötigte Taktzeit für den Prozess) hat oder eben die Timer-Funktion benutzen (die den Prozess wahrscheinlich auch automatisch in einen eigenen Thread setzt).

    Dann habe ich eine Oberfläche mit einem Knopf. Immer, wenn ich auf den Knopf drücke, soll der Wert von AD2 erfasst werden. Also wird eventbasiert immer einmal die Funktion zum Holen des Messwerts AD2 geholt.

    Das funktioniert alles einzeln wunderbar mit den Funktionen xfer und xfer2 von import spidev.

    Jetzt sagen wir einfach mal, AD1 ist 24bit breit, AD2 ist 12bit breit.

    Alle 50ms werden also 24bit übertragen. Genau dann wird das Event ausgelöst, um von AD2 die Daten zu holen.

    Was passiert nun im Raspberry Pi?

    Idealfall: Die Threads AD1 und AD2 werden vom Betriebssystem hintereinander ausgeführt. Dann kommt es zu keiner Kollision.
    Pechfall: Es wird nur ein Teil von Thread AD1 ausgeführt, dann kommt Thread AD2 kurz dazwischen, dann wird Thread AD1 zum Ende gebracht.
    Oder noch fataler: Thread AD1 ruft die Daten ohne Pause ab. Dann ist CE0 ständig auf Null, also der Kanal belegt, und Thread AD2 kommt überhaupt nicht zum Zug.

    Oder sagen wir mal, AD1 wäre ein Schieberegister mit 200bit Breite. Dann würde der Thread zum Auslesen der 200bit schon etwas Zeit in Anspruch nehmen. Könnte es da dann auch passieren, dass der Thread zum Auslesen von AD2 nicht dazwischenfunkt?

    Sorgt die SPI-Schnittstelle mit den Funktionen spi.xfer bzw. spi.xfer2 schon selber dafür, dass zwei parallele Aufrufe vermieden werden bzw. es zu keiner Unterbrechung eines Leseprozesses kommt und die Prozesse dann hintereinander ablaufen - oder muss ich selber in meinem Programm dafür sorgen, dass es keine Konflikte gibt?

    Einmal editiert, zuletzt von Helpneeder (8. August 2014 um 17:57)

  • Kenn ich (noch) nicht. Evtl. solltest Du im Code unterbinden dass die automatische Abfrage stattfindet, wenn die manuelle läuft und die manuelle warten lassen, bis die automatische fertig ist. Ob das die Bibliothek hergibt kann ich aber nicht sagen. Da das ganze Objektorientiert läuft sollten sich beide Objekte grundsätzlich nicht behindern.

  • Also ich kann jetzt nicht garantieren, dass sich die beiden nicht in die Quere kommen, ich würde aber mal davon ausgehen.
    Es gibt einige Displays, die über SPI gefüttert werden. Dabei ist sicher ganz schön was los auf dem Bus.
    Wenn Deine Bedenken zutreffen, dann dürfte in o.g. Fall kein weiteres Gerät mit SPI betrieben werden.
    Ich kann mich aber jetzt nicht erinnern, so was irgendwo mal gelesen zu haben ... und gerade bei Displays habe ich in den letzten Monaten einiges durchgeackert.
    Ich fürchte, um da eine 100%ige Aussage zu bekommen, wirst Du um unfangreiche Recherchen nicht herum kommen.
    Ich würde es einfach drauf ankommen lassen.

    cheers,
    -ds-

Jetzt mitmachen!

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