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.
:
Bearbeitet durch User
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.