Widerstände für SPI berechnen

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

    ich möchte meinen Arduino mit dem Raspberry Pi Zero W über SPI verbinden. Jedoch weiß ich nicht, wie hoch ich die Widerstände dimensionieren soll, da ja 5V vs. 3,3V. Ich kenn zwar die Uri-Formel, aber wenn ich den Strom nicht weiß, den der SPI verbraucht kann ich auch keinen Widerstand berechnen.

    Wisst ihr, von wieviel mA beim SPI ausgehen kann, bzw. wie groß die Widerstände ungefähr sein sollten?

    Vielen Dank!

  • Du kannst mit Widerständen, so wie du es dir angesichts von R = U/I offenbar vorstellst, keine Spannung reduzieren. Was du benötigst ist eine Pegelwandlung von 5 V auf 3,3 V. Das macht man entweder mit einem Level-Shifter-Modul (für ein paar Cent überall zu haben) oder mit einem Spannungsteiler, also zwei Widerständen im passenden Verhältnis.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Die Widerstände sind falsch rum - so bekommst du nur 1,6 Volt am Ausgang. Du musst die Größen vertauschen.

    Ich würd die Widerstände größer wählen - in der Summe 2000 Ohm oder größer.

    Ansonsten passt das.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Ja, wenn du den Widerstand zu gering wählst fließt relativ viel Strom (bei 300 Ohm 16 mA). Das ist zwar für den Arduino (zumindest für den Atmega328) nicht kritisch, denn er verträgt 40 mA an jedem IO, aber zur Sicherheit sollte man den Strom hier möglichst gering halten. 1-3 mA reichen völlig.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo,

    ich fahre meine SPIs (z. B. MAX7219) ohne irgend was zwischen GPIO und entsprechendem Chip.

    Funktioniert weil die SPI eine Pullup-Schnittstelle ist.

    Das bedeutet die Pullups vom Raspi sorgen für den high-Pegel auf den Leitungen (MOSI, MISO, CLK, CS).

    Die 5V Chips erkennen das auch als high da auch bei 5V TTL meistens bereits ab ca. 2,5V sicher Highpegel gilt.

    Und unter 0,7 als Lowpegel.

    Man muss halt darauf achten dass der Slave selbst keine Pullups gegen 5V hat (Datenblatt lesen), die den GPIO-Pin des Raspberry überlasten würden.

    Nachtrag, das Schaltbild mit den Widerständen wird gar nicht funktionieren, da die 300 Ohm gegen GRD den Pegel fast auf Null ziehen.

    Die Pullups vom Raspberry haben ca. 50 kOhm, da bleiben am Ende noch ca. 20 mV übrig.

    Viele Grüße

    Thotaa

    Einmal editiert, zuletzt von Thotaa (12. April 2019 um 16:59)

  • Thotaa, du siehst das was falsch, was die Pullups angeht, glaube ich.

    Der Pi ist hier als Eingang geschaltet. Die Spannung kommt vom Ausgang des Arduino.

    Liefert der Spannungsteiler 3,3 V liegen die auch am GPIO an. Der Pullup braucht hier gar nicht geschaltet werden. Selbst wenn er aktiv ist, ändert das nichts.

    Liefert der Arduino 0V (GND) wird die Spannung auch bei eingeschaltetem Pullup ohnehin auf GND gezogen.

    Selbst wenn man einen Pulldown schaltet, ändert das nichts.

    In der Gegenrichtung (Pi = Ausgang, Arduino = Eingang ) verbindet man direkt, der Pegel sollte noch genügen.

    Deiner Argumentation zu SPI kann ich zwar folgen, aber wer bestimmt, wer Master und wer Slave ist? Ich kann auf die Schnelle auch keine Quelle finden, die deine Darstellung stützt, dass nur der Pi die beiden Leitungen speist. Wie sagt man dem Arduino, dass er das gefälligst nicht tun soll?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo,

    wenn der Arduino der Master sein soll sollte er mit Pullups beschaltet sein, ob er das von Haus aus mit bringt weiß ich nicht.

    Fakt ist bei SPI darf auch der Master keine stabiles (z. B. 40mA) Highsignal bringen, also immer über Pullups das Signal nur nach GRD ziehen.

    So ist das nun mal definiert, was immer aber der Arduino als Master macht müsst ihr herausfinden, habe keinen.

    So wie ich weiß sind die Pullups beim Raspberry abgeschalten wenn er als Slave definiert wird.

    Viele Grüße

    Thotaa

  • Ein Ausgang (egal ob Arduino oder Pi) kennt doch nur HIGH oder LOW. Bei LOW kann er die Spannung auf GND ziehen, egal wo ggf. ein Pullup sitzt. Bei HIGH liefert er Spannung (wenn es ein Arduino ist, 5 V, was den Eingang am Pi spatzt). Den Strom zu begrenzen wäre ein geringes Problem. Aber um Strom geht es hier nicht, sondern um Spannung.

    Einzig vorstellbar wäre, den Ausgang zwischen INPUT MIT PULLUP und OUTPUT LOW umzuschalten und so das Signal zu erzeugen... aber ist das praktikabel? Meintest du das? Und ist es vielleicht genau das was ein SPI-Treiber macht?

    Nichtsdestotrotz hättest du dann immer noch 5 V auf der Leitung - auch wenn der Pullup bei INPUT HIGH nur wenige mA auf die Leitung gibt. Ein dazu geschalteter zusätzlicher Widerstand, der einen Spannungsteiler bildet, wäre schwer zu berechnen, wenn man den Widerstand des Pullups nicht kennt - und besonders beim Pi gibt es da ja variierende Angaben. Außerdem wäre das dann auch nichts anderes als der externe Spannungsteiler.

    Also, ich kann deiner Ausführung so insgesamt nicht wirklich folgen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Bei HIGH liefert er Spannung (wenn es ein Arduino ist, 5 V, was den Eingang am Pi spatzt).

    Hallo Gnom,

    das ist bei SPI-definition eben nicht so, sonst wären einige meiner Raspis schon lange in den ewigen Jagdgründen.

    Das High-Signal kommt nur über die Pullups, wenn die nicht all zu klein sind verträgt das auch der Raspi-Eingang und zieht die Spannung auf ca. 3,8V (3,3V plus Schutzdiode).

    Viele Grüße

    Thotaa

  • 5V sind 5 V - da kannst du den Pullup so groß machen, wie du willst... Ein Wunder, wenn deine Pis noch leben. Mag sein, dass sie die 5V bei 20 µA überleben. Aber der Sinn der Sache ist es eigentlich nicht. Und hat dann auch nichts mit den Pullups zu tun - da würde es auch ein 50K-Widerstand am Eingang tun.

    Einzige Lösung: Der Sender (Arduino) wechselt zwischen INPUT OHNE PULLUP (hochohmig) und OUTPUT LOW (0 Volt), während der Empfänger (Pi) auf Input mit 3,3 V Pullup geschaltet ist und damit den Pegel auf 3,3 Volt hält und vom Sender runterziehen lässt.

    Andersrum könnte der Pi ganz normal zwischen OUTPUT HIGH/LOW schalten, für den Arduino reicht der Pegel.

    Aber wo würde man das Verhalten der einzelnen Anschlüsse konfigurieren? So bestimmt man, welches Gerät Master und Slave ist, wie arbeitet und welchen Pegel anlegt. Ich kann das immer noch nicht nachvollziehen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Raspi-Eingang und zieht die Spannung auf ca. 3,8V (3,3V plus Schutzdiode).

    ein Raspi hat keine Schutzdioden wie ein Arduino, was im PI ist sind parasitäre Bodydioden der FETs die aber deutlich schwächer sind als im Arduino.

    Was beim "Arduino" AVR klappt ist sogar Speisung über die Ports, aber nicht beim PI, der nimmt recht schnell übel bei Spannungen von 5V.

    Wenn du aber mit Schutzdiode, externe meinst vom GPIO nach VCC 3,3V dann OK, man kann auch dem PI natürlich am GPIO Ableitdiodenhinzufügen.

    Hatte ich ja schon gemacht, Serien R 470 Ohm und BAT42 nach 3,3V

    Atmel Atmega 8 an Raspberry Pi

    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)

  • Da du deine Behauptungen technisch nicht untermauerm kannst, und auch auf meine Fragen und Darstellungen oben nicht eingehst, nehme ich weiterhin an, dass du hier Dinge erzählst, die so nicht sein können. Deine wirren und wenig konkreten Darlegungen von irgendwelchen Pullups und Schutzdioden bringen wenig, wenn du nicht mal sagst, ob du gerade vom Pi oder vom Arduino sprichst und in welcher Weise der eine und der ander das Siganal auf der Leitung bilden.
    Da helfen deine halbherzigen Beleidigungen leider auch nicht.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo,

    mal als erstes das Schaltbild vom Raspi GPIO Pin.


    Bei SPI Betrieb ist der Ausgangstreiber bei High hochohmig somit kann nur über den auf 3,3V geschalteten Pullwiderstand (50kOhm) Strom fließen.

    Bei Low ist der Ausgangstreiber niederohmig zu 0V (GND).

    Die Ausgangstreiber der Slaves sind ebenfalls für High nur hochohmig und für Low niederohmig gegen GND.

    Machts das klarer was da passiert.

    Viele Grüße

    Thoota

  • das mag sein, nach außen hin macht das aber keinen Unterschied und bei zu viel Strom ist das Ding hin (der ganze GPIO-Pin).

    das macht den Unterschied zum Arduino, darüber brauchen wir nicht streiten!

    Deswegen will man den GPIO schützen fummelt man Serien R + Dioden nach, Bild hatte ich ja verlinkt

    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)

Jetzt mitmachen!

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