Mehrere SPI Sensoren an einem Arduino Nano

Hallo, ich stehe aktuell vor dem Problem das ich 3 SPI Module habe die ich gerne an ein Arduino Bord anschließen möchte, im Idealfall an das Arduino Nano, zur not aber auch an jedes Andere Arduino Bord.

Ich habe 1 SD Karten Modul, das auch Fehlerfrei an dem Nano läuft, zusätzlich habe ich noch ein Ethernet Modul und einen Sensor, ich weis das ich auch das Ethernet Shild nehmen könnte wo ein SD modul mit integriert ist, aber aus platzgründen habe ich mich für die einzelmodule entschieden ... ich habe im internet gelesen das SPI grundsätzlich 2 Arten von mehrfach Clienten erlauft, Stern und Reihenschaltung, wobei die Sternschaltung wohl das Optimum ist ...

hat von euch jemand schon mal mehr als ein SPI Modul gleichzeitig an einem Arduino Bord gehabt und kann mir erklären wie ich das zum laufen bringe ?

Hilfe wäre echt klasse

MOSI, MISO und CLK parallel anschließen: http://de.wikipedia.org/wiki/Datei:SPI_three_slaves.svg

Dann braucht du für jedes Gerät eine CS (Chip Select) Leitung. Die jeweilige CS Leitung wird vor dem Datentransfer auf Low geschaltet und danach wieder High.

okay verstanden ... erstmal vielen dank ! wie läuft das den beim empfangen von Daten oder ist das Analog zum Senden ? ich meine bei einem Ethernet Modul, weis ich ja quasi nicht wirklich wann daten ankommen, bei der SD Karte ist das natürlich anders :-)

Bei Ethernet hast du genauso wie bei SD Karten eine Lib die das alles für dich macht. Da sind ja zwischen der SPI Schnittelle und der Ethernet Schnittelle noch mehrere andere Ebenen auf dem Ethernet Controller.

Per Hand geht das Empfangen geht ebenfalls mit SPI.transfer():
http://arduino.cc/en/Reference/SPITransfer
Siehe z.B. die SpiRAMRead8() Funktion hier:

Da werden erst 3 Bytes als Kommando geschickt und danach eines gelesen. Dabei wird halt 0xFF als Dummy-Parameter übergeben.

Aber das ist nur für solche Sachen wie Speicher-Bausteine oder A/D-Wandler. Bei Ethernet ist das alles in Funktionen gekapselt und du brauchst dich um die Details nicht zu kümmern. Da hat man sowas wie client.available() um abzufragen ob Daten da sind.

aber um das empfangen kümmert sich doch die Lib. oder kann ich in diesem fall die lib nicht benutzen und muss das quasi nachcoden?

verstehe, schuldige ich habe deinen letzen satz irgendwie beim erstenmal überlessen ...

wenn ich das also richtig verstehe , wenn client.available() = true ist, schalte ich den SS Pin des Ethernetmoduls um und kann dan die Daten abfragen?

Ja, das hatte ich noch dazugeschrieben :)

Da erübrigt sich allerdings auch die Frage etwas. Das dann nichts direkt mit SPI zu tun. Da gibt es z.B. das: http://arduino.cc/en/Reference/ClientAvailable

Wegen CS: Bei der Standard Ethernet Lib wird der Hardware Pin verwendet. Bei der SD Lib kann man den CS Pin bei SD.begin() angeben und damit einen anderen verwenden: http://arduino.cc/en/Reference/SDbegin

In beiden Fällen wird CS dann auch automatisch geschaltet wenn was übertragen wird.

okay cool, entschuldige bitte die ganzen Fragen aber dieses SPI Thema ist mir noch nicht komplett klar !!!

Vielen dank erstmal für deine Geduld, ich werde das jetzt mal zusammenbauen und schauen ob ich dich richtig verstanden habe:-)