Forum: Mikrocontroller und Digitale Elektronik SPI mit mehreren ICs, Allgemeines zu Ports und Hardware


von Daniel L. (danielschlumpf)


Lesenswert?

Ein Frohes Neues Jahr allerseits!

Mich beschäftigt seit einigen Tagen mein kleines Netzwerk von 
Controllern, die per SPI kommunizieren sollen. Einige Probleme konnte 
ich inzwischen lösen, allerdings treten nun verschiedene Probleme auf, 
wenn sich mehr als zwei Teilnehmer den SPI Bus teilen sollen.

Ohne jetzt auf spezifische Probleme eingehen zu wollen, habe ich einige 
grundlegende Fragen zum SPI-Konzept (ich finde sonst nur bruchweise 
Informationen, oft für Spezialfälle etc.):

HARDWARE:

1) Ich verbinde bei mehreren Geräten einfach die MISO, MOSI und CLK 
Leitungen miteinander, ohne Zusätze - korrekt?. Manchmal werden pull-ups 
empfohlen, ist das sinnvoll?

2) Für Slave Select benutzt der Master normale Outputs, die einfach per 
Kabel an die SS-Inputs der anderen Prozessoren gehen. Alle Outputs sind 
high, bei Übertragungen wird der entpsrechende Pin auf low gesenkt. 
Hiermit habe ich allerdings einige Probleme (ein slave wird warm und die 
spannung an einem anderen output fällt leicht ab, nicht gut), brauche 
ich ggf zusätzliche Widerstände im Netzwerk?

Anders formuliert: Ausgang von IC1 soll den Input von IC2 ansteuern um 
dort einen Interrupt auszulösen, wie sieht die Schaltung aus?

PIN KONFIGURATIONEN:

3) einer meiner Slaves hat nur eine USI Schnittstelle mit Software-SPI. 
Slave Select versuche ich grade selber zu implementieren, wie sehen die 
SPI-Anschlüsse (MISO, MOSI, CLK) aus, wenn der Slave nicht aktiv ist? 
Habe was von Tristate gelesen, aber weiß nicht wie ich das 
implementiere...


Alle weiteren Tipps sind mir ebenfalls herzlich Willkommen, wenn jemand 
anderes mal bei der Suche auf den Thread stößt, freut er sich ;)



Noch kurz zu meinem Setup:

Ein ATTiny2313 mit USI-SPI ist Slave. Ein eDIP240-Display ist ebenfalls 
Slave. Ein ATMega16 ist Master. Später soll noch ein ATMega8 als Slave 
hinzukommen.

Das wäre die einfachste Konfiguration mit nur einem Master, Multi-Master 
sollte bei SPI jedoch auch recht simpel sein, oder?


Vielen Dank schonmal,
Daniel

von Frank K. (fchk)


Lesenswert?

Daniel Luscher schrieb:
> HARDWARE:
>
> 1) Ich verbinde bei mehreren Geräten einfach die MISO, MOSI und CLK
> Leitungen miteinander, ohne Zusätze - korrekt?.

ja. Aufpassen, was wann Input bzw Output ist.

> Manchmal werden pull-ups
> empfohlen, ist das sinnvoll?

Am MISO kannst Du das machen, damit ein definierter Pegel herrscht, wenn 
kein Slave selektiert ist und die Leitung treibt.

>
> 2) Für Slave Select benutzt der Master normale Outputs, die einfach per
> Kabel an die SS-Inputs der anderen Prozessoren gehen. Alle Outputs sind
> high, bei Übertragungen wird der entpsrechende Pin auf low gesenkt.
> Hiermit habe ich allerdings einige Probleme (ein slave wird warm und die
> spannung an einem anderen output fällt leicht ab, nicht gut), brauche
> ich ggf zusätzliche Widerstände im Netzwerk?

Wenn irgendwas warm wird, hast Du ein ernsthaftes Problem, das Du vorher 
lösen solltest.

Von welchen Leitungslängen reden wir hier eigentlich?

> 3) einer meiner Slaves hat nur eine USI Schnittstelle mit Software-SPI.
> Slave Select versuche ich grade selber zu implementieren, wie sehen die
> SPI-Anschlüsse (MISO, MOSI, CLK) aus, wenn der Slave nicht aktiv ist?
> Habe was von Tristate gelesen, aber weiß nicht wie ich das
> implementiere...

Jeder Slave darf seinen MISO nur dann treiben, wenn er selektiert ist, 
d.h SS low. Ansonsten muss er hochohmig sein. Einfachste Maßnahme: HC125 
hinter den MISO des Slaves, OE des HC125 an SS. Da ein HC125 vier Gatter 
hat, kannst Du auch ein Gatter in die CLK Leitung schalten, dann bekommt 
der Slave nur einen Takt, wenn er auch selektiert ist. Das vereinfacht 
vielleicht etwas. Pulldown am Ausgang des betreffenden Gatters einfügen, 
damit CLK sicher unten bleibt, wenn der HC125 sperrt. Wenn Du magst, 
kannst Du das auch bei MOSI machen, das wäre dann ein ESD-Schutz, der 
den Controller schützt, wenn am SPI-Stecker Ungemach reinkommt. Ein 
HC125 ist eben viel billiger als ein Controller.

> Das wäre die einfachste Konfiguration mit nur einem Master, Multi-Master
> sollte bei SPI jedoch auch recht simpel sein, oder?

Bei Multimaster müßtest Du die Richtung (In-Out) der ganzen Signale 
umdrehen und sehr genau Aufpassen, dass immer nur ein Master aktiv ist. 
Das ist nichttrivial und daher nicht empfehlenswert. Für Multimaster 
gibts daher andere Lösungen (485, CAN, in Grenzen I2C).

fchk

von Daniel L. (danielschlumpf)


Lesenswert?

Hallo Frank,

erstmal vielen Dank für die ausführliche Antwort!

>> Manchmal werden pull-ups
>> empfohlen, ist das sinnvoll?
>
> Am MISO kannst Du das machen, damit ein definierter Pegel herrscht, wenn
> kein Slave selektiert ist und die Leitung treibt.

Wäre dann logischerweise nur am Master anzuwenden, wenn ich das richtig 
verstehe. Und auch nur 'der Korrektheit halber', da im Idealfall der Pin 
nicht benutzt wird, wenn kein Slave selektiert ist? Nur zum Verständnis, 
ich werde den pull-up auf jeden Fall ergänzen.


>> 2) [...]
>
> Wenn irgendwas warm wird, hast Du ein ernsthaftes Problem, das Du vorher
> lösen solltest.
>
> Von welchen Leitungslängen reden wir hier eigentlich?

Wenn der Ausgang low ist, liegt der Pin auf Masse... bei aktiviertem 
internem pull-up am Eingang des Empfängers liegt der Eingang dann auf 
low, quasi so als hätte ich einen gedrückten Taster dran. Wenn der 
Ausgang high wird, habe ich quasi positive Spannung am Eingang, während 
ich in der Taster-Analogie de Pin offen liegen habe (zumindest extern, 
intern ist ja der pull-up dran der den pegel hochzieht). Nach der Logik 
müsste ich den internen pull-up des Eingangs deaktivieren, probier ich 
gleich mal vorsichtig. Bin offensichtlich noch Anfänger was die 
elektrotechnischen Hintergründe angeht ;)

Verbunden sind die Prozessoren mittels Flachbandkabel über die Buchsen 
zur ISP-Programmierung. Das Kabel ist maximal 1m lang, mit 4 Buchsen 
über die Länge verteilt... habe gelesen dass 20cm in Ordnung sind, wobei 
die Übertragung über die gesamte Länge bei 2 Teilnehmern bisher 
funktionierte. Ich übertrage allerdings auch sehr langsam (unter 100kHz) 
wegen des Displays. Slave Select geht aktuell über einzelne 10cm Kabel 
in einem Steckboard.


>> 3) [...]
>
> Jeder Slave darf seinen MISO nur dann treiben, wenn er selektiert ist,
> d.h SS low. Ansonsten muss er hochohmig sein. Einfachste Maßnahme: HC125
> hinter den MISO des Slaves, OE des HC125 an SS. Da ein HC125 vier Gatter
> hat, kannst Du auch ein Gatter in die CLK Leitung schalten, dann bekommt
> der Slave nur einen Takt, wenn er auch selektiert ist. Das vereinfacht
> vielleicht etwas. Pulldown am Ausgang des betreffenden Gatters einfügen,
> damit CLK sicher unten bleibt, wenn der HC125 sperrt. Wenn Du magst,
> kannst Du das auch bei MOSI machen, das wäre dann ein ESD-Schutz, der
> den Controller schützt, wenn am SPI-Stecker Ungemach reinkommt. Ein
> HC125 ist eben viel billiger als ein Controller.

Der Tipp ist super, habe gerade das Datenblatt vor mir.. der übernimmt 
ja dann praktisch die SS-Funktionalität bzgl der Port-Zustände und geht 
in TriState, solange SS high ist.

>> Das wäre die einfachste Konfiguration mit nur einem Master, Multi-Master
>> sollte bei SPI jedoch auch recht simpel sein, oder?
>
> Bei Multimaster müßtest Du die Richtung (In-Out) der ganzen Signale
> umdrehen und sehr genau Aufpassen, dass immer nur ein Master aktiv ist.
> Das ist nichttrivial und daher nicht empfehlenswert. Für Multimaster
> gibts daher andere Lösungen (485, CAN, in Grenzen I2C).

CAN gefällt mir, aber das wäre mit Kanonen auf Spatzen geschossen in 
meinem Projekt. Werde dann wohl bei einem Master bleiben... dann könnte 
ich sogar wieder zurück zu I2C, das hatte ich aufgegeben weil ich 
gelesen habe dass Multi Master bei SPI easy wäre... dann würde ich mir 
die Slave-Select Geschichte sparen können und die Verdrahtung wäre 
simpler. Auf Geschwindigkeit kommt's hier nicht an.

Besten Dank, hat mir sehr geholfen!

Daniel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.