Wie vermeidet man eine Verwechslung von SD-Karte und W1500 SPI auf dem Ethernet Shield?

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?

Antworten (3)

In SPI werden die folgenden Verbindungen verwendet:

  • MISO(Master In Slave Out) - eine Datenleitung zum Senden von Daten vom Slave zum Master
  • MOSI(Master Out Slave In) - eine Datenleitung zum Senden von Daten vom Master zum Slave
  • SCK(Serieller Takt) – ein vom Master erzeugter Takt zum Takten der Bits auf MISOundMOSI
  • SS(Slave Select) – eine Datenleitung vom Master zu einem bestimmten Slave.

Es gibt einen SSfür jedes Slave-Gerät. MISO, MOSI, und SCKwerden von allen Geräten auf dem Bus geteilt.

In Ihrem Fall ist Pin 4 SSfür die SD-Kartenschnittstelle, während Pin 10 SSfü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.

Vielen Dank! Aber ich bin immer noch überrascht, dass es in den offiziellen Codebeispielen KEINEN Hinweis darauf gibt!
Danke für diesen Beitrag. Nachdem ich zwei Stunden lang versucht hatte, mein offizielles Arduino-Ethernet-Schild dazu zu bringen, auf seine SD-Karte zuzugreifen, wenn es auf einem MEGA 2560 montiert war, tat ich das digitalWrite (53, HIGH); und es hat funktioniert. Warum in aller Welt beheben sie das nicht in den Beispielen? Auf jeden Fall nochmals vielen Dank.

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.