[Python] Raspberry Pi im Slave Modus

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Tag liebe Forenfreunde,

    ich beschäftige mich gerade mit der SPI Schnittstelle des Raspberry Pi. Ich möchte von einem Mikrocontroller ( über einen ADC ) Werte zum Raspberry Pi schicken und sie dort auslesen. Dabei soll der Mikrocontroller als Master und der Pi als Slave fungieren. Jedoch habe ich bei allen Dokumentationen im Netz nur Beispiele zum Raspberry als Master gefunden. Ich habe schon einen kleinen Code geschrieben, wobei ich hier auch nicht weiß wie ich das Chip-Select unterbringen kann, da dieses ja nur vom Master gesendet werden kann (deshalb als input). Das ganze ist noch etwas Neuland für mich, also verzeiht etwaige banalen/dummen Kommentare meinerseits.


    Hier ist noch eine Datenbankfunktion drin aber die ergänze ich wenn ich weiter bin.


    Ich hoffe ihr könnt mir weiterhelfen :huh:

    Liebe Grüße

    Neolinga

  • Guten Abend kobold254,

    vielen Dank für deine Rückmeldung. Ja das hatte ich mir schon gedacht, bzw. es war auch mein Plan das ganze eher Softwareseitig zu lösen. Zur theoretischen Umsetzung hatte ich mir folgendes überlegt:

    Da müsste ich ja die SCLK des Masters (des ADCs) auf einen Interruptpin legen und bei jedem Flankenwechsel (tief zu hoch) nach dem Auslesen das ganze um ein bit verschieben oder? Und dann jeden Wert in einen Array speichern.

    Die Geschwindigkeit ist für mich eher zweitrangig, da die Messung maximal alle 5s stattfinden soll. Nur habe ich von der Umsetzung in ein Python Programm nicht so viel Ahnung. Meinst du du könntest mich dabei etwas unterstützen? Das einkommende Signal des ADCs ist 8-Bit lang.

    Liebe Grüße

    Neolinga

  • Hi,
    warum nimmst Du nicht einen GPIO des RPi als "externen Interrupt", der vom µController gesetzt wird?
    Anschliessend kannst Du per SPI den µController als Slave ansprechen und Dir die Daten holen. Falls der µC auch keinen Slave-Modus unterstützt, dann evtl. als IIC-Slave oder über rs232 ...

    Für IIC hatte ich das -> hier <- mal beschrieben ...

    cu,
    -ds-

  • Guten Abend Dreamshader :) ,
    ja er sollte auch als "externer" Interrupt fungieren, der bei jeder steigenden Flanke der Clock vom ADC das lesende bit am MOSI - Eingang ausliest und weiterschiebt (8mal). Ich würde es gerne über die Softwareseitigen SPI Variante lösen. Der ADC MUSS die Daten im SPI-Master-Modus verschicken. Ich hoffe das lässt sich umsetzen. Wie ich meine Interrupts gestalte hab ich >>hier<< von meigrafd einen guten Ansatz gefunden. Wie ich das ganze in python jedoch auslese weiß ich nicht so genau :huh: . Ich hoffe ihr könnt mir trotzdem helfen.

    Liebe Grüße

    Neolinga

  • Ja hey Neolinga,
    abend ist jetzt nett :) ...


    ... das lesende bit am MOSI - Eingang ausliest und weiterschiebt (8mal).
    ...


    das wird aus zwei Gründen über SPI wohl so nicht funktionieren.
    Erstens ist MOSI aus Sicht des RPi kein Eingang und zweitens muss auf den SPI-Bus meines Wissens zuerst geschrieben werden, bevor etwas gelesen werden kann. Da das Ganze über die Devices /dev/spi* läuft, wirst Du Dich wohl von SPI verabschieden müssen ...
    Was ich mir vorstellen könnte, dass Du MOSI des ADC auf einen GPIO legst, ebenso wie SCK und CS. Damit hättest Du drei Pins des RPi, die Du entsprechend handeln müsstest.
    Zuerst wird wohl CS gesetzt, auf das Du reagieren musst, um dann per SCK die Bits zu holen.
    Ist das evtl. auch so von Dir angedacht gewesen?
    Spicken würde ich da mal im SPI-Treiber. Der ist zwar in C, sollte aber prinzipielle Informationen über den Ablauf des Protokolls liefern.
    In Sachen Python muss ich allerdings passen ... wobei ich auch ziemliche Zweifel daran habe, dass das in Python schnell genug und sauber zu lösen ist.

    cu,
    -ds-

  • also ne quick n dirty Lösung mal schnell zusammengefasst:
    Interrupt verwenden um den CS zu erkennen.
    Dann im Interrupt auf fallende Flanke des CLK pollen, bei fallender Flanke ein Bit vom Datenpin übernehmen.
    Mit der Lösung wirst du Takte bis max. im kHz Bereich erfassen können.
    Außerdem könnte es passieren, dass die Interrupterkennung zu langsam ist, so dass du Daten verlierst...
    Müsstest du mal ausprobieren ;)
    Bessere Perfomance wird mit C erreicht, eine verbesserte Lösung würde mit mehreren Interrupts statt Polling arbeiten, also z.B. CS Interrupt kommt, Flag setzen, anderen Interrupt für CLK freigeben, Daten einlesen, Flag zurücksetzen

    lg kobold254

  • So, nach den kulinarisch reichhaltigen Feiertagen melde ich mich wieder mit einer versuchten Umsetzung des Beschriebenen. Datenbankfunktion ist noch ausgeklammert und die Bitlänge noch variierbar. ich habe mich die Tage über mit Bücher wälzen etc. beschäftigt und versucht das Programm über die CS und CLK Interrupts aufzubauen.
    Da ich mir bei der ganzen Sache jedoch SEHR unsicher bin, hoffe ich auf etwas Unterstützung beim Coding. Eine Fertiglösung für mein Problem gibt es nach langer Googelei leider nicht, und auch hier im Forum hab zu dem Thema nicht so viel gefunden.
    Aber hier erstmal der Code:

    Wenn ich Unsinn schreibe lasst es mich wissen. Bleibt dabei jedoch bitte konstruktiv.


    Liebe Grüße

    Neolinga

    Einmal editiert, zuletzt von RapidDawn12618 (27. Dezember 2014 um 23:52)

  • Ja hey, ...
    das sieht ja schon mal ganz gut aus ... irgendwie ;) ...
    Leider kann ich zu Python nicht viel sagen, aber ...

    ich hab' -> hier <- mal was rausgefischt. Ist zwar in C, aber kann vielleicht zum Abgleich ganz hilfreich sein.

    Ach ja: und ein Link auf das Datenblatt von dem Teil wäre ganz hilfreich ... da sollte alles drin stehen.

    cheer,
    -ds-

  • Danke dreamshader :)

    werd ich mal versuchen Ähnlichkeiten zu finden :D

    vielleicht kann sich jedoch zur Sicherheit jemand, der so ungefähr versteht was ich will, und sich mit Python auskennt nochmal einen Blick drauf werfen.

    Liebe Grüße

    Neolinga

  • Also ich habe den Code mal angeschaut (jedoch nicht getestet).
    Folgende Sachen sind mir aufgefallen:
    -Bouncetime raus, der AD-Wandler prellt in der Regel nicht ;)
    -die Variable freigabe existiert in deinem Kontext nur lokal, diese müsste global sein (oder das Problem anders lösen, bitte die Diskussionen über globale Variablen in Python unterlassen...)
    -adcChannel existiert im Kontext nicht
    -das mit der Bitposition 7 versteht ich nicht?!

    Zitat


    # Senden der Bitkombination (Es finden nur 8 Bits Beruecksichtigung)
    for i in range(8):
    if (sendcmd & 0x100): # (Bit an Position 7 prüfen. Zählung beginnt bei 0)


    Ich sehe da Bit 9 bzw. 8 ?!?
    Außerdem: Wenn du Daten senden willst, musst du da nicht CS und CLK auch ansteuern?

    Ich kann mich nur anschließen, ein Datenblatt wäre echt gut ;)

    lg kobold254

  • So, guten Abend,

    ich habe in den letzten Tagen wieder die Zeit gefunden daran zu basteln und den Code verfeinert. Das Datenblatt bzw. das Pad ist im oberen Post (ich hoffe danach wurde gesucht).

    Das Programm setzt am Anfang ein High Signal zum Zeichen: Ich möchte Daten haben
    Bei jedem Interrupt der MasterClock soll der Wert gelesen werden, und in die adcvalue gespeichert werden, als binärwert. Nach 16 Durchläufen von InterruptCL soll der Wert ausgegeben werden. So langsam weiß ich nicht mehr weiter. Ich hoffe mir kann einer helfen.

    Liebe Grüße

    Neolinga

    Einmal editiert, zuletzt von RapidDawn12618 (2. Januar 2015 um 18:02)

  • Guten Abend,

    Entschuldigung für die erneute Anfrage, aber hat jemand von euch schonmal von einem
    SPI BSC Slave Modus des Raspberry gehört? Finde den Begriff zwar des öfteren, aber kann keinerlei Dokumentation, bzw. Beispielanwendungen finden.

    Wäre echt nett, ich finde darüber echt nichts.

    Liebe Grüße

    Neolinga


  • hat jemand von euch schonmal von einem
    SPI BSC Slave Modus des Raspberry gehört?
    Neolinga

    die Registerbeschreibung vom BCM2835
    http://www.raspberrypi.org/wp-content/upl…Peripherals.pdf
    hat auf Seite 165 das Bit innerhalb des ControlRegisters CR, das über Master oder Slave entscheidet. Daher halte ich die oft gelesene Aussage, der Raspi hätte die nötige Hardware nicht, einfach für falsch.
    Könnte nicht jemand von den Experten mal den "Software-Hebel" bauen, mit dem sich das Master/Slave-Bit umlegen lässt?

    Einmal editiert, zuletzt von tomasherrmann (8. Februar 2015 um 23:16)

  • die Registerbeschreibung vom BCM2835
    http://www.raspberrypi.org/wp-content/upl…Peripherals.pdf
    hat auf Seite 165 das Bit innerhalb des ControlRegisters CR, das über Master oder Slave entscheidet. Daher halte ich die oft gelesene Aussage, der Raspi hätte die nötige Hardware nicht, einfach für falsch.
    Könnte nicht jemand von den Experten mal den "Software-Hebel" bauen, mit dem sich das Master/Slave-Bit umlegen lässt?

    hast du schon eine lösung for spi slave implementierung finden?

    Ich suche seit ein monat aber kann nicht ein example finden :(

  • hast du schon eine lösung for spi slave implementierung finden?

    Ich suche seit ein monat aber kann nicht ein example finden :(

    Das Problem hierbei ist, dass dieses Interface auf GPIO18-22 liegt, beim RasPi diese Pins aber nicht beschaltet sind (d. h. nicht auf eine der Stiftleisten geführt)
    und zu allem Überfluss noch dazu unter dem Chip liegen - eine Verwendung ist daher leider nicht möglich.

    Grüße, Norbert

Jetzt mitmachen!

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