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 :)
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
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.
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?
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
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
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).
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
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
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.
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.
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 :)
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?
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.
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?
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
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?
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
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.
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?