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?
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
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)
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.
Ach so ja und: Ein Transistor invertiert - je nach Typ. ICh dreh das dann mit einem zweiten Transistor af der Masterseite wieder um. Hohe Datenrate hab ich nicht, 1-10kHz reicht.
Nimm I2C, das kann man auch gut in Software machen. Außerdem kannste da dann auch kaufbare Bauteile mit dranhängen (zb. Tempsensoren) Fertige I2C Bibliothek zb bei http://homepage.hispeed.ch/peterfleury/avr-software.html (die hab ich mal verwendet)
> 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.
Ü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.
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?
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.
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.