In einer Antwort weist Kevin Mark auf eine Lösung/Grund für die Verwendung des Ethernet-Schildes zusammen mit der SD-Karte hin. Die Dokumentation besagt , dass die SD-Karte und der Ethernet-Chip beide den SPI-Bus teilen und dass ich verschiedene Pins auf HIGH setzen muss, um dem Ethernet-Schild mitzuteilen, dass er das Ethernet ODER die SD-Karte verwenden soll.
Wie sähe eine solche Lösung aus?
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
// Now I can use the SD Card?
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
// Now I can use the Ethernet (W5100)?
// Do I have to (re)set 4 to LOW?
// Any possibility to use both at the same time?
// Can I use the Ethernet/SD Card without the setting of pin 4 or 10?
// Why is this missing on the official code examples? Is it really necessary?
In SPI werden die folgenden Verbindungen verwendet:
MISO
(Master In Slave Out) - eine Datenleitung zum Senden von Daten vom Slave zum MasterMOSI
(Master Out Slave In) - eine Datenleitung zum Senden von Daten vom Master zum SlaveSCK
(Serieller Takt) – ein vom Master erzeugter Takt zum Takten der Bits auf MISO
undMOSI
SS
(Slave Select) – eine Datenleitung vom Master zu einem bestimmten Slave.Es gibt einen SS
für jedes Slave-Gerät. MISO
, MOSI
, und SCK
werden von allen Geräten auf dem Bus geteilt.
In Ihrem Fall ist Pin 4 SS
für die SD-Kartenschnittstelle, während Pin 10 SS
für den Ethernet-Controller ist.
Ihr Code sollte in etwa so aussehen (ungetesteter Code):
#define SS_SD_CARD 4
#define SS_ETHERNET 10
void setup() {
// ...
pinMode(SS_SD_CARD, OUTPUT);
pinMode(SS_ETHERNET, OUTPUT);
digitalWrite(SS_SD_CARD, HIGH); // SD Card not active
digitalWrite(SS_ETHERNET, HIGH); // Ethernet not active
// ...
}
void scCardCode() {
// ...
digitalWrite(SS_SD_CARD, LOW); // SD Card ACTIVE
// code that sends to the sd card slave device over SPI
// using SPI.transfer() etc.
digitalWrite(SS_SD_CARD, HIGH); // SD Card not active
// ...
}
void ethernetCode() {
// ...
digitalWrite(SS_ETHERNET, LOW); // Ethernet ACTIVE
// code that sends to the ethernet slave device over SPI
// using SPI.transfer() etc.
digitalWrite(SS_ETHERNET, HIGH); // Ethernet not active
// ...
}
Sie sollten darauf achten, dass 4 und 10 nicht gleichzeitig niedrig sind, da dies dazu führen würde, dass die gleichen Daten an beide Slaves gesendet werden - BAD.
Ihre Bibliothek handhabt wahrscheinlich die Einstellung 4 & 10 niedrig und hoch zu den entsprechenden Zeiten. Es kann jedoch Methoden geben, die einen von ihnen niedrig lassen, bis eine andere Methode ihn hoch setzt. Während dieser Zeit sollten Sie keine Methode für das andere Gerät verwenden. Es ist möglich, dass die Bibliothek solche Fälle behandelt, aber da Ihr Fehler bekannt zu sein scheint, macht sie es offensichtlich nicht gut, wenn überhaupt.
Diese Adafruit-Wiki-Seite scheint ein anständiges Beispiel zu haben.
Der einzige Hinweis, den ich auf die Pins 4 und 10 im Code sehe, ist das einmalige Setzen von Pin 10 auf HIGH bei Init.
pinMode(10, OUTPUT); // set the SS pin as an output (necessary!)
digitalWrite(10, HIGH); // but turn off the W5100 chip!
Ich gehe davon aus, dass die Ethernet- und SD-Kartenbibliotheken es von dort aus handhaben. Schauen Sie sich unbedingt die gesamte Seite an.
Es gibt einen Hinweis auf http://arduino.cc/en/Main/ArduinoEthernetShield
Beachten Sie, dass, da der W5100 und die SD-Karte den SPI-Bus teilen, nur einer gleichzeitig aktiv sein kann. Wenn Sie beide Peripheriegeräte in Ihrem Programm verwenden, sollte dies von den entsprechenden Bibliotheken erledigt werden. Wenn Sie jedoch eines der Peripheriegeräte in Ihrem Programm nicht verwenden, müssen Sie es explizit abwählen. Dazu mit der SD-Karte Pin 4 als Ausgang setzen und ein High darauf schreiben. Stellen Sie für den W5100 den digitalen Pin 10 als High-Ausgang ein.
Die obige Antwort löst das Problem, aber es gibt keine Beispiele in den Standardbibliotheken, wie beide Funktionen verwendet werden können, um Ethernet und SD für die Datenaufzeichnung als Beispiel zu verwenden.
powtac
Jim Himmel