Forum: Mikrocontroller und Digitale Elektronik SPI-Slaves parallel schalten?


von Third E. (third-eye)


Lesenswert?

Hallo,

ich möchte an einem ATMega drei Porterweiterungs-ICs vom Typ MCP23S18 
betreiben (ist ähnlich dem ...S17, nur mit Open Drain-Ausgängen).
Leider habe ich noch nie was mit SPI gemacht.

Wenn ich nur ein IC bräuchte, wäre es mir klar: einfach MOSI, MISO, SCLK 
und Chip Select verbinden.
Aber ich habe aber ja drei ICs. Deshalb stelle ich mir die Frage, wie 
ich das dann am besten mache.
In Wikipedia steht zu SPI, dass es Sternverbindung und Kaskadierung 
gibt.
Ich würde am liebsten die Sternverbindung anwenden. Mit Chip Select (das 
sind dann drei Leitungen zum µC) wähle ich dann das IC aus, mit dem ich 
"reden" will.
Aber darf ich einfach die MISOs der ICs parallel schalten?
Was passiert, wenn ein IC den Pin auf LOW zieht, das andere aber auf 
HIGH?
Das Datenblatt des MCP23S18 schweigt sich dazu leider aus.
Oder ist das ein (Quasi-)Standard bei SPI, dass MISO hochohmig 
geschaltet wird, wenn das IC mit Chip Select nicht "ausgewählt" ist?

Danke.
Third-Eye

von (prx) A. K. (prx)


Lesenswert?

Third Eye schrieb:
> Oder ist das ein (Quasi-)Standard bei SPI, dass MISO hochohmig
> geschaltet wird, wenn das IC mit Chip Select nicht "ausgewählt" ist?

Ja.

Kontrollieren ob die CS Leitung vom Slave einen internen Pullup hat. 
Wenn nicht, dann externer Pullup 10-100K, um beim Reset ein 
unerwünschtes CS zu vermeiden.

: Bearbeitet durch User
von Marc P. (marcvonwindscooting)


Lesenswert?

Vielleicht am Anfang noch ein paar Angstwiderstaende (220R z.B.) 
einbauen, damit der Kurzschluss nicht so gross wird.

von (prx) A. K. (prx)


Lesenswert?

Welcher Kurzschluss?

von Marc P. (marcvonwindscooting)


Lesenswert?

Entweder der:
A. K. schrieb:
> Kontrollieren ob die CS Leitung vom Slave einen internen Pullup hat.
> Wenn nicht, dann externer Pullup 10-100K, um beim Reset ein
> unerwünschtes CS zu vermeiden.

oder der, der entsteht, wenn die Software versehentlich alle drei CS 
aktiviert.

Also bei mir passieren solche Sachen.

EDIT: Jetzt seh ich's erst: Open-Drain. Ja dann kein Problem.
SPI mit Open Drain. Nie gesehen bisher.

: Bearbeitet durch User
von Onkel Dittmeyer (Gast)


Lesenswert?

Die sauberste Methode wäre einen 2:4 Demultiplexer (74xx139) zu 
verwenden, dessen Enable vom Chip-Select der SPI-Schnittstelle gesteuert 
wird. Die zwei Adressbits kann man dann einfach direkt an einen Port des 
μC legen und vor dem Transfer auf so ansteuern, dass der gewünschte 
Slave selektiert wird. Dannen können ganz sicher auf der MISO-Leitung 
keine Ausgänge gegeneinander Kämpfen.

von Third E. (third-eye)


Lesenswert?

Marc P. schrieb:
> EDIT: Jetzt seh ich's erst: Open-Drain. Ja dann kein Problem.
> SPI mit Open Drain. Nie gesehen bisher.
Nein, das Open Drain bezieht sich m.W. nur auf die 16 GPIOs, nicht auf 
die Pins für SPI.

Die Idee mit den "Angstwiderständen" gefällt mir.
Gerade bei der ersten Programmerstellung kommt sowas schon mal vor, dass 
ungewollt Pins geschaltet werden.
Wem Derartiges noch nie passiert ist, der werfe den ersten Stein ;-)

Danke auch mit dem Tipp mit dem Pull-Up!
Im Datenblatt steht tatsächlich nichts davon, dass das IC einen internen 
Pull-Up hätte.
Ist logisch, im Einschaltmoment, und wenn der µC programmiert wird, sind 
die Ausgangspins des µC ja hochohmig geschaltet. Ich weiß allerdings 
nicht, ob ich beim Erstellen der Platine daran gedacht hätte...

Danke.
Third-Eye

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Third Eye schrieb:
> Gerade bei der ersten Programmerstellung kommt sowas schon mal vor, dass
> ungewollt Pins geschaltet werden.
> Wem Derartiges noch nie passiert ist, der werfe den ersten Stein ;-)
Solche Buskonflikte hat man öfter mal. Mir ist aber deswegen noch nie(!) 
irgendein Baustein kaputt gegangen. Aus diesem Grund wurde ich sagen: 
einfach alle Ausgangspins parallel, genau so, wie sich die Ingenieure 
bei Motorola das seinerzeit(tm) ausgedacht haben.

> Gerade bei der ersten Programmerstellung kommt sowas schon mal vor, dass
> ungewollt Pins geschaltet werden.
Wie wäre es, das einfach mal bewusst zu machen und auszuprobieren, ob 
überhaupt irgendwas kaputt geht?

Und auch die Geschichte mit dem Tristate beim Reset wird nur halb so 
heiß gegessen wie sie hier aufgekocht wird...

: Bearbeitet durch Moderator
von Marc P. (marcvonwindscooting)


Lesenswert?

Lothar Miller schrieb:
> Wie wäre es, das einfach mal bewusst zu machen und auszuprobieren, ob
> überhaupt irgendwas kaputt geht?

Gefaellt mir nicht. Denn das Kaputtgehen ist kein binaeres jetzt heil 
und im naechsten Moment kaputt, sondern ein langsames dahinsiechen der 
Endstufe. Ein langsam abfallender parasit"arer Widerstand.

Das braucht sicher eine kleine Weile, aber wer sagt, dass der 
Programmierer das gleich merkt, wenn er so ins Programm vertieft ist und 
genau das passiert, was 'gar nicht moeglich' ist .-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marc P. schrieb:
> Das braucht sicher eine kleine Weile
Es muss länger als zwei Wochen dauern. Denn in dem besagten Fall hatte 
ich die Schaltung für 2 Wochen so stehen. Und üblicherweise werden 
Fehler schneller gefunden...

> Denn das Kaputtgehen ist kein binaeres jetzt heil und im naechsten
> Moment kaputt, sondern ein langsames dahinsiechen der Endstufe.
Woruaf stützt sich dieses Wissen?
"Die Endstufe" ist im Falle einer Push-Pull-Endstufe ein P-Kanal- und 
ein N-Kanal-Mosfet mit Bahnwiderständen im Bereich um 50..100 Ohm. Wenn 
ich jetzt mal den einen Ausgang auf Vcc schalte (dort ist idR. der 
schlechtere P-Kanal-Fet) und den anderen auf GND, dann habe ich 5V und 
einen 150 Ohm-Widerstand. Ergibt zusammen einen Strom von 33mA. Diese 
33mA ergeben dann beim schlechteren P-Kanal-Fet eine Verlustleistung von 
120mW. Diese Leistung kann so ein IC idR. problemlos aufnehmen und/oder 
abführen.

Marc P. schrieb:
> Lothar Miller schrieb:
>> Wie wäre es, das einfach mal bewusst zu machen und auszuprobieren, ob
>> überhaupt irgendwas kaputt geht?
> Gefaellt mir nicht
Ist aber in anderen Bereichen (z.B. Automobilindustrie) ziemlich üblich. 
Da werden dann Gegenstände und Bauteile einfach über Gebühr belastet. 
Und wenn sie dabei nicht kaputt gehen, dann halten sie den Normalbetrieb 
locker aus.

> Das braucht sicher eine kleine Weile, aber wer sagt, dass der
> Programmierer das gleich merkt, wenn er so ins Programm vertieft ist und
> genau das passiert, was 'gar nicht moeglich' ist .-)
Man macht doch in eine Schaltung nicht Widerstände für den Programmierer 
rein. Wenn ich da in die Prototypen zusätzlich 50 Widerstände reinbaue, 
nur dass der Prototyp nicht kaputtgeht wenn der Programmierer nicht 
aufpasst, dann muss eigentlich ich hinterher in der Serie die 
Widerstände drin lassen. Oder eben gleich ein Redesign auflegen, das 
garantiert teurer ist, als so einem unaufmerksamen Softie mal wieder 
einen neuen Baustein aufzulöten...

Fazit: weltweit werden zigmilliardenfach SPI-Slaves einfach so zusammen 
und direkt an uC-Pins geschaltet. Das scheint sich bewährt zu haben. Und 
in den gängigen APP-Notes von Herstellern findet sich üblicherweise auch 
kein Multiplexer oder Serienwiderstand.

von Marc P. (marcvonwindscooting)


Lesenswert?

Lothar Miller schrieb:
> Woruaf stützt sich dieses Wissen?

Auf den Tod diskret aufgebauter MOSFET Leistungs-Endstufen, sowie eines 
MIC4452, ebenfalls Endstufe, die ueberlastet wurde.
Auf die sehr sehr bedauerliche Verstuemmelung eines LPC2124, was 
allerdings eine an den Portpin hinfedernde 12V (>>3.3V = Ueberspannung) 
war und auch nur einen Wimpernschlag Zeit brauchte - also was anderes .
Ausserdem die schmerzlichen Erfahrungen eines fr"uheren Arbeitgebers mit 
dem Zerst"oren von LEDs.
Hast Du deinen geschaendeten IC danach vermessen, ob da noch alles 
innerhalb der Werte des Datenblatts ist?

Du hast aber schon recht. Die Bauteile sind hart im Nehmen. 
SMD-Leistungs-FETs l"oten sich ja angeblich lieber eingenm"achtig aus 
(Selbstverteidigung) als dass sie kaputt gehen. Aber wenn Du Bauteile 
(lokal) heiss genug (>380 Grad) bekommst, dann startest Du deine eigene 
'Umdotierung' per Diffusion. Und da find ich kleine ICs mit schwacher 
thermischer Ankopplung halt viel gef"ardeter.

Lothar Miller schrieb:
> Man macht doch in eine Schaltung nicht Widerstände für den Programmierer
> rein.

Nein tut man in der Masse nicht. Aber der Bastler, der nicht ein 
fertiges Produkt zigtausendfach auf den Markt wirft, sondern eigentlich 
st"andig (gef"ahrliche) neue Sachen aus seinem einzigen board probiert 
schon.
Und h"atte das Drecks-Olimex-Board Angstwiderst"ande gehabt, der LPC2124 
w"urde noch funktionieren!
Und, Lothar, offensichtlich hast Du andere Kollegen als ich. Sonst 
w"urdest Du gerne die Angstwiderstaende in Experimentierboards einbauen 
.-)

von Softwareverwickler (Gast)


Lesenswert?

Wenn du nen kleinen uC nimmst, ist nen externer MUX + pullups für die CS 
Leitungen zu empfehlen. Die größeren uCs haben den MUX schon in der SPI 
Einheit integriert, z.b AVR32. In den Datenleitungen kannst du dir die 
Angstwiderstände dann sparen. Außer du bist noch vorsichtiger für den 
Fall, dass ein Chip hops geht und MISO permanent high/low hält und dann 
die anderen u.U "mit in den Tod reißt".

von Rudolph (Gast)


Lesenswert?

Mein Güte, das sind ja wieder mal Tipps hier, klemm einfach die drei 
Chips parallel auf den SPI mit jeweils eigenen Pins für Chip-Select und 
gut.

Aber einen noch, SS am AVR ist ein EINGANG im Bezug auf den SPI.

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.