Forum: Mikrocontroller und Digitale Elektronik 2 Schieberegister am selben SPI Bus


von Johannes R. (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe folgenden Artikel gelesen:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

Ich möchte nun über mehrere Chip-Select Leitungen mehrere 
Schieberegister parallel über den gleichen SPI-Bus verwenden. Bei der 
gezeigten Schaltung für die "Ausgangserweiterung" denke ich sollte es 
keine Probleme geben wenn beim zusätzlichen Schieberegister einfach nur 
eine andere Chip-Select Leitung für RCK verwendet wird.
Wenn gerade der andere Chip ausgewählt ist, werden zwar die Daten in 
beide Schieberegister getaktet, aber nur ein Chip übernimmt die Daten am 
Ende wegen der Flanke bei RCK ins Ausgangsregister.

Wenn zwei Schieberegister für "Eingangserweiterung" gleichzeitig 
verwendet werden funktioniert die gezeigte Schaltung aber glaube ich 
nicht. Müsste man hier nicht den CE (Clock-Enable) Pin des 
Schieberegisters mit dem invertierten Chip-Select Signal verbinden? 
Ansonsten würden egal welche der beiden Register selektiert sind beide 
mit jedem Takt auf den Bus schreiben.

Hat von euch soetwas schon jemand versucht? Ist mein Gedankengang 
korrekt?

PS: Ich möchte die Register NICHT kaskadieren, sondern gezielt über 
Chip-Select auswählen können!

Danke :)

von Frank K. (fchk)


Lesenswert?

Nimm zB einen 74HC238, mit dem Du den SCK auf die einzelnen 
Schieberegister verteilst. Der hat drei Adressleitungen, mit denen Du 
einen von 8 Ausgängen auswählst.

EN1 (6) auf SCK vom AVR
!EN2 (5) und !EN3 (3) auf GND
S1...S3 (1..3) zum Auswählen des jeweiligen Ausgangs
Y0...Y7 (15...9,7) Ausgänge zu SCK des jeweiligen Schieberegisters

fchk

von R. M. (rmax)


Lesenswert?

Hmm - Du schreibst, daß Du die Schieberegister nicht kaskadieren willst, 
die Schaltung, die Du zeigst, macht aber genau das.

Um das ohne kaskadieren hinzubekommen, gibt es mehrere Möglichkeiten:

*  Du nimmst (falls es das gibt (*)) Schieberegister mit 
Tristate-Ausgängen, dann kannst Du die Ausgänge direkt zusammenschalten 
und mit dem Eingang des µC verbinden, solange immer nur einer der 
Ausgänge per entsprechendem Chipselect bzw. Output-Enable aktiviert 
wird.

*  Du Nimmst einen Demultiplexer, um festzulegen, welcher der Ausgänge 
auf den Eingang des µC gelegt werden soll.

*  Du nimmst stattdessen (falls es das gibt) externe, einzeln schaltbare 
Tristate-Puffer.

*  Du nimmst stattdessen jeweils einen Analogschalter.

@fchk: Damit kann man am µC Leitungen sparen, das Problem, daß die 
Ausgänge der Schieberegister gegeneinander arbeiten löst es aber nicht. 
Dazu bräuchte man das Gegenstück zum 74238 mit entsprechend vielen 
Eingängen und einem Ausgang.

*)Edith sagt, es gibt Schieberegister mit seriellen Tristate-Ausgängen, 
z.B. das 74HC589.

: Bearbeitet durch User
von Johannes R. (Gast)


Lesenswert?

R. Max schrieb:
> Hmm - Du schreibst, daß Du die Schieberegister nicht kaskadieren willst,
> die Schaltung, die Du zeigst, macht aber genau das.

Ja sorry das Bild ist aus dem Artikel und für die Eingangserweiterung 
gab es kein sinnvolles Bild wo nicht kaskadiert wird.

R. Max schrieb:
> *  Du nimmst (falls es das gibt (*)) Schieberegister mit
> Tristate-Ausgängen, dann kannst Du die Ausgänge direkt zusammenschalten
> und mit dem Eingang des µC verbinden, solange immer nur einer der
> Ausgänge per entsprechendem Chipselect bzw. Output-Enable aktiviert
> wird.

Ja das ist natürlich das nächste Problem. Da das Schieberegister keinen 
Open-Collector Ausgang hat, kann es zu Kurzschlüssen kommen soblad 2 
Schieberegisterausgänge parallel geschalten sind. Wäre es nicht 
vielleicht am besten, über den Schieberegister einen Transistor/Mosfet 
zu schalten, der den Buszugriff als Open-Collector übernimmt?

von Kai S. (kai1986)


Lesenswert?

Johannes R. schrieb:
> Ich möchte die Register NICHT kaskadieren, sondern gezielt über
> Chip-Select auswählen können!

Hier ist Vorsicht geboten. Schieberegister sind KEINE 
SPI-Bus-Teilnehmer. Sie haben deshalb auch keinen Chip-Select Eingang. 
Die Ansteuerung über den SPI Bus ist nicht wirklich ein Bus, sondern ein 
Behelfsmittel, das für alle Bausteine auf einmal funktioniert.
Das Charakteristische an einem Chip-Select Pin ist, dass wenn der IC 
nicht ausgewählt ist, er alle anderen Eingangssignale ignoriert, genau 
das machen Schieberegister aber NICHT. Wenn du wirklich mehrere einzeln 
ansteuern willst wäre es wohl am zielführendsten, wenn du als Auswahl 
der ICs die Taktleitung SCK aktivierst. Dazu musst du den "SPI-Bus" aber 
in Software machen, da du dann mehrere Taktleitungen, aber nur eine 
Datenleitung hast.

Wieso willst du sie eigentlich nicht einfach kaskadieren?

Gruß Kai

von Frank K. (fchk)


Lesenswert?

R. Max schrieb:

> @fchk: Damit kann man am µC Leitungen sparen, das Problem, daß die
> Ausgänge der Schieberegister gegeneinander arbeiten löst es aber nicht.
> Dazu bräuchte man das Gegenstück zum 74238 mit entsprechend vielen
> Eingängen und einem Ausgang.

Stimmt, das hatte ich glatt übersehen. Kein Problem, ein 74HC151 oder 
ein 74HC251 löst die Aufgabe zur vollen Zufriedenheit.

fchk

von Johannes R. (Gast)


Lesenswert?

Kai S. schrieb:
> Wieso willst du sie eigentlich nicht einfach kaskadieren?

Weil die Schieberegister auf unterschiedlichen Boards sitzen und ich als 
"Backplane" einfach den SPI-Bus mit mehreren Chip-Select Leitungen 
führen wollte.

Aber ich denke, ich werde einfach 3 seperate SPI-Instanzen machen. 
Scheint mir die einfachste (wenn auch nicht so elegante) Möglichkeit zu 
sein, da das Problem scheinbar sonst nicht einfach in den Griff zu 
kriegen ist.

Dem Schieberegister das "horchen" auf SCK abzugewöhnen ginge mit dem CE 
(clock enable) Eingang. Dann könnte man noch einen Tri-State Puffer wie 
weiter oben schon erwähnt als Ausgang verwenden. Aber mir gefällt der 
Gedanke nicht, dass ich wenn ich in der Software einen Fehler habe, die 
Hardware beschädigen kann (wenn nämlich 2 chip-select gleichzeitig aktiv 
sind --> ev. Kurzschluss auf MISO).

von Kai S. (kai1986)


Lesenswert?

Johannes R. schrieb:
> Weil die Schieberegister auf unterschiedlichen Boards sitzen und ich als
> "Backplane" einfach den SPI-Bus mit mehreren Chip-Select Leitungen
> führen wollte.

Es gibt auch Portexpander mit richtigem Busanschluss. Wenn du welche für 
einen I2C Bus nimmst brauchst du noch nichtmal die Chip-Select 
Leitungen.

Gruß Kai

von Frank K. (fchk)


Lesenswert?

Johannes R. schrieb:

> Dem Schieberegister das "horchen" auf SCK abzugewöhnen ginge mit dem CE
> (clock enable) Eingang. Dann könnte man noch einen Tri-State Puffer wie
> weiter oben schon erwähnt als Ausgang verwenden. Aber mir gefällt der
> Gedanke nicht, dass ich wenn ich in der Software einen Fehler habe, die
> Hardware beschädigen kann (wenn nämlich 2 chip-select gleichzeitig aktiv
> sind --> ev. Kurzschluss auf MISO).

Dann erzeuge doch die CE-Signale mit einem HC138. Der gibt auf seinen 
Ausgängen genau einmal ein !CE=Low aus. Idiotensicher sozusagen.

Die Schieberegister haben übrigens kein !CE. Was Du meinst, ist der 
asynchrone Clear-Eingang !MR. Den würde ich nicht verwenden. Aber ein 
HC125 löst auch das. Da sind 4 Gatter drin, mit einem schaltest Du den 
SCL-Eingang, mit einem weiteren den Ausgang, und die anderen beiden 
musst Du nicht unbedingt benutzen. Unbenutzte Eingänge immer auf GND 
oder VCC legen!

fchk

von Peter D. (peda)


Lesenswert?

Johannes R. schrieb:
> Dem Schieberegister das "horchen" auf SCK abzugewöhnen ginge mit dem CE
> (clock enable) Eingang.

Wozu das denn?

Laden und schieben machen alle. Nur einen Multiplexer brauchst Du zur 
Auswahl des gewünschten Ausgangs.

von Johannes R. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Laden und schieben machen alle. Nur einen Multiplexer brauchst Du zur
> Auswahl des gewünschten Ausgangs.

Dann muss aber bei der Verbindung der Platinen untereinander Leitungen 
für jeden Ausgang von jeder Platine vorgesehen werden. Und beim SPI 
Master ist dann der Multiplexer der den korrekten Ausgang auswählt.

von Johannes R. (Gast)


Angehängte Dateien:

Lesenswert?

Also so wie angefügt soll das ganze funktionieren. Leider konnte ich 
nicht wie usprünglich gedacht mehrere SPI Instanzen verwenden, da ich 
die noch für was anderes benötige.

Am SPI-Master habe ich nun einen Multiplexer, wo über 2 Port-Pins der 
Slave ausgewählt wird. Der Multiplexer wird durch die NSS Leitung der 
SPI-Peripherie aktiviert. D.h. in der Software wählt man zuerst über die 
2 "Adress-Port-Pins" den Slave aus, danach verwendet man das SPI-Modul 
wie gehabt.

Dann habe ich bei den Eingangserweiterungen die INH (Clock inhibit) 
Leitung mit dem invertierten SS Signal verbunden --> Clock wird nur 
benutzt, wenn die richtige SS Leitung HIGH ist. Außerdem habe ich einen 
Tri-State-Puffer hinzugefügt, welcher ebenfalls mit der SS Leitung 
aktiviert wird. Dank des Multiplexers beim Master kann es nie passieren, 
dass mehrere Slaves gleichzeitig selektiert werden.

Bei den Ausgängen ist meiner Meinung nach keine zusätzliche Maßnahme zu 
treffen. Der Wert des Schieberegisters wird sowieso nur übernommen, wenn 
die korrekte Flanke beim SS Signal detektiert wird.

Könntet Ihr euch die Schaltung bitte mal kurz ansehen, ob das so 
funktionieren könnte?

Danke :)

von Peter D. (peda)


Lesenswert?

Johannes R. schrieb:
> Dann habe ich bei den Eingangserweiterungen die INH (Clock inhibit)
> Leitung mit dem invertierten SS Signal verbunden --> Clock wird nur
> benutzt, wenn die richtige SS Leitung HIGH ist.

Nochmal, wozu?

von R. M. (rmax)


Lesenswert?

Den Tanz mit den Inhibit-Eingängen an den Eingabe-Registern kannst Du 
Dir meines Erachten sparen, denn solange der entsprechende 
Tristate-Buffer nicht durchgeschaltet ist, stört es nicht, daß jeweils 
alle Register die Daten übernehmen und durchschieben.

Falls Du genügend Portpins frei hast, würde ich auch den Multiplexer 
weglassen und lieber über Längswiderstände verhindern, daß das 
versehentliche Aktivieren mehrerer Eingangsplatinen zu einem Defekt 
führen kann.

Außerdem läßt sich die Wahrscheinlichkeit für so einen Fehler durch 
geeignete Programmierung (alle vier Select-Leitungen auf einen Port 
legen und immer nur mit vordefinierten Bitmasken arbeiten, bei denen 
höchstens eines der vier Bits gesetzt ist) bereits nahezu ausschliessen.

von Johannes R. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Nochmal, wozu?

R. Max schrieb:
> Den Tanz mit den Inhibit-Eingängen an den Eingabe-Registern kannst Du
> Dir meines Erachten sparen, denn solange der entsprechende
> Tristate-Buffer nicht durchgeschaltet ist, stört es nicht, daß jeweils
> alle Register die Daten übernehmen und durchschieben.

Stimmt da habt ihr natürlich recht, das kann man sich sparen...

R. Max schrieb:
> Außerdem läßt sich die Wahrscheinlichkeit für so einen Fehler durch
> geeignete Programmierung (alle vier Select-Leitungen auf einen Port
> legen und immer nur mit vordefinierten Bitmasken arbeiten, bei denen
> höchstens eines der vier Bits gesetzt ist) bereits nahezu ausschliessen.

Das Problem das ich sehe ist beim Einschalten oder beim 
Software-Einspielen etc. Ich finde es sollte einfach Softwaremäßig immer 
unmöglich sein, die Hardware zu zerstören.

R. Max schrieb:
> Falls Du genügend Portpins frei hast, würde ich auch den Multiplexer
> weglassen und lieber über Längswiderstände verhindern, daß das
> versehentliche Aktivieren mehrerer Eingangsplatinen zu einem Defekt
> führen kann.

Dann würde ich bei jedem Schieberegister mit MISO Ausgang einen 
Serienwiderstand von 1k platzieren. Ok?  Beinflusst das die 
Datentransferrate?

von Frank K. (fchk)


Lesenswert?

Hat das eigentlich einen Grund, warum Du keinen MCP23S08 (8 Bit) bzw 
MCP23S17 (16 Bit) nimmst? Das sind echte SPI-Devices, und zwar ziemlich 
flexible. Und sie kosten auch nicht die Welt.

fchk

von Johannes R. (Gast)


Lesenswert?

Frank K. schrieb:
> Hat das eigentlich einen Grund, warum Du keinen MCP23S08 (8 Bit) bzw
> MCP23S17 (16 Bit) nimmst? Das sind echte SPI-Devices, und zwar ziemlich
> flexible. Und sie kosten auch nicht die Welt.

Ich kannte diesen IC nicht, deshalb...
Danke für den Hinweis! Hab mir das Datenblatt angesehen. Der sieht in 
der Tat sehr mächtig aus. Aber was ich nicht gefunden habe, wie wird bei 
diesem IC verhindert, dass ein Kurzschluss auf der MISO Leitung entsteht 
wenn mehrere Devices parallel geschalten sind?
Meine Vermutung ist, dass der Tri-State Ausgang erst nach erhalt der 
gültigen Hardwareadresse aktiviert wird? D.h. solange es keinen IC mit 
der gleichen Adresse am Bus gibt kann nichts passieren?

von Frank K. (fchk)


Lesenswert?

Johannes R. schrieb:

> Meine Vermutung ist, dass der Tri-State Ausgang erst nach erhalt der
> gültigen Hardwareadresse aktiviert wird? D.h. solange es keinen IC mit
> der gleichen Adresse am Bus gibt kann nichts passieren?

Erstens das, und zweitens gibts auch noch die Möglichkeit, die Teile 
über ihre !CS-Leitungen zu adressieren, so wie es bei anderen 
SPI-Devices üblich ist.

fchk

von Johannes R. (Gast)


Lesenswert?

Theoretisch kann natürlich trotzdem der Kurzschluss auftreten, wenn 
nämlich 2 Devices die gleiche Adresse haben und versehentlich beide !CS 
Leitungen auf Low geschalten werden (z.B. wenn kein SPI-Master verbunden 
ist, die Slaves aber miteinander verbunden sind; dann wären alle !CS 
Leitungen low).

Mich würde interessieren, ob das mit dem Serienwiderstand wirklich 
funktioniert wie vorher gepostet wurde? Dann würde ich einfach 
sicherheitshalber bei jedem Slave auf der MISO Leitung einen platzieren 
und schon kann nichts mehr passieren.

von Johannes R. (Gast)


Lesenswert?

Johannes R. schrieb:
> (z.B. wenn kein SPI-Master verbunden
> ist, die Slaves aber miteinander verbunden sind; dann wären alle !CS
> Leitungen low).

Allerdings wird in diesem Fall natürlich keine gültige Adresse gesendet 
wodurch der Treiber nicht aktiviert wird. Also eigentlich kann außer 
durch einen Programmierfehler nichts passieren. Den kann ich aber durch 
die Verwendung des Multiplexers beim SPI Master verhindern.

Trotzdem würde ich es interessant finden, ob das mit dem Widerstand gut 
funktioniert?

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.