mehrere MISOs zusammenschalten

Gast #1465878
Lesenswert?

Ich plane einen SPI-Bus mit vielen Slaves (Attinys). Sie sind 
adressiert, d.h. immer nur einer kann antworten. Die Anzahl der Slaves 
ist unbestimmt. Ich möchte an allen die Leitungen gleich Leitungen 
anschließen (MOSI,MISO,Clock,CS).

Damit die MISOs nicht aufeinandertreiben, wollte ich es so machen:

Die MISO-Leitung am Master hat einen 1k pullup-Widerstand. An die MISO 
von den Slaves schalte ich einen Transistor, der diese Leitung auf L 
zieht, wenn MISO = L ist, ansonsten hochohmig. weil immer nur ein 
adressierter Chip antworten kann, gibt es keine Konkurrenz. (Es gibt ein 
Protokoll für die Übertragung)

Was meint Ihr - funktioniert das? Hat das jemand schonmal so gemacht?
#1465884
Lesenswert?

Und wie willst du das mit dem Chip Select machen? Für jeden Slave ne 
eigene CS-Leitung?
Schau dir mal I²C oder RS485 an, das ist her für das geeignet, was du 
machen willst. SPI ist eher für die Verbidung von Chips auf einer 
platine oder einem Gerät gedacht, nicht als weitgehender BUS
Gast #1465940
Lesenswert?

Hallo,

der Transistor ist bei hohen Datenraten unter Umständen schon zu 
langsam.
Es sei denn Du nimmst einen schnellen Schalttransistor (2N2222A)
und Vorsicht: ein Transistor invertiert!!!!

Da du ja eh einen Demultiplexer (74HC138) für die Chip-Select Leitungen 
brauchst, würde ich mit dem gleichen Signal die Ausgangsleitungen auf 
einen Tri-State Buffer z.b. 74HC125 geben. (4*Tri-State Buffer)

In einfachen Fällen reicht vielleicht auch ein analoger Multiplexer 
74HC4051 (8 zu 1 Multiplexer / Demultiplexer)
Gast #1465941
Lesenswert?

nein, alle Chips sollen das gleiche Chip Select Signal bekommen. Also 
alle werden gleichzeitig "aktiviert".

Für RS485 brauchte ich ne UART, die hat der Tiny13 nicht, oder? Außerdem 
nen extra Quarz..

ICh glaube I2C hat er auch nicht.. mal sehen.
Moderator (Firma: Titel) Persönliche Seite #1465981
Lesenswert?

> Schau dir mal I²C ... an, das ist her für das geeignet, was du
> machen willst. SPI ist eher für die Verbidung von Chips auf einer
> platine oder einem Gerät gedacht
I²C aka. IIC heißt im Originaltext Inter-IC Bus, und war/ist dafür 
gedacht, innerhalb eines überschaubaren Geräts (Videorecorder, 
Fernseher, Autoradio...) informatinen zum Gerätestatus auszutauschen. 
Insofern ist gerade I2C nur für lokale Kommunikation gedacht. 
Insbesondere die Terminierung wird bei vielen Teilnehmern und langen 
Leitungen schwierig.

> Ich möchte an allen die Leitungen gleich Leitungen
> anschließen (MOSI,MISO,Clock,CS).
Dann häng doch einfach in jedem Device den MISO an den nächsten MOSI, 
und du bekommst einelange Kette.
1
  Master    
2
   MOSI--------------------------------------------------------.     
3
                                                               |
4
              Slave1         Slave2           Slave3           |
5
   MISO --- MISO  MOSI ---- MISO   MOSI ---- MISO   MOSI ------'
6
            CLK   SS         CLK    SS        CLK   SS
7
             |    |            |    |          |    |
8
   SCLK  ----o----)------------o----)----------'    |
9
    SS   ---------o-----------------o---------------'
10
   CS
Um festzustellen, wieviele Teilnehmer in der Kette sind, schiebst du am 
Anfang einfach mal durch alle ein Bitmuster durch, und schaust, wann das 
wieder beim Master ankommt.
Gast #1465997
Lesenswert?

Über dieses "daisy chain" habe ich gelesen. Ich möchte aber gerne 
Flachbandkabel und Schneidklemmverbinder benutzen, da macht sich das 
nicht gut. Aber das mit dem durchzählen, wann das Bitmuster zurückkommt, 
ist eine gute Idee.

Lothar, weißt Du auch was über die Terminierung? siehe:

Beitrag "SPI kombinieren und entstören"

Statt Prüfsumme hab ich gerade überegt - ich übertrage einfach mehrfach 
und gucke ob alle Bytes gleich sind. Ist ja unwahrscheinlich daß sich 
eine EMV-Einstreuung immer auf das gleiche bit setzt.
Persönliche Seite #1466014
Lesenswert?

zur Verdrahtung bei SPI habe ich auch noch eine Frage, ob das so geht, 
wie ich es mir vorstelle:

MOSI, MISO und SCK wird 1:1 vom ATMEGA zu den Slaves verbunden, da ich 
in der Summe 8 Slaves habe, gebe ich die CS-Leitung und je eine 
Selectleitung pro Slave auf ein NOR-Gatter. Da ich die Slaves ja mit 
einer 0 auf CS aktiviere, ist die CS-Leitung zum Slave dann auf 0, wenn 
CS vom Master und die Selectleitung zugleich auf 0 sind. Zwar brauche 
ich 8 Portausgänge + die CS-Leitung am µC und 2 4fach-NOR, aber ich bin 
nicht aufs Sparen an Portleitungen und Platz angewiesen. Jetzt die Frage 
an euch: geht das so?
Gast #1466020
Lesenswert?

kannst Du alles sparen. Einfach je Chip einen Ausgang als CS benutzen 
und im Programm vor / nach der Übertragung schalten. Die CS kann ein 
Ausgang davon sein. Festgelegt ist die nu im Slave-Betrieb.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren