¿Cómo evitar la confusión entre la tarjeta SD y W1500 SPI en Ethernet Shield?

En una respuesta , Kevin Mark señala una solución/razón para el uso del escudo de Ethernet junto con la tarjeta SD. La documentación dice que la tarjeta SD y el chip Ethernet comparten el bus SPI y que tengo que configurar diferentes pines en ALTO para decirle al protector de Ethernet que use Ethernet O la tarjeta SD.

¿Cómo sería una solución así?

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?

Respuestas (3)

En SPI, se utilizan las siguientes conexiones:

  • MISO(Master In Slave Out) - una línea de datos para enviar datos del esclavo al maestro
  • MOSI(Master Out Slave In): una línea de datos para enviar datos del maestro al esclavo
  • SCK(Serial Clock) - un reloj generado por el maestro para registrar los bits en MISOyMOSI
  • SS(Slave Select) - una línea de datos del maestro a un esclavo en particular.

Hay uno SSpara cada dispositivo esclavo. MISO, MOSIy SCKse comparten entre todos los dispositivos del bus.

En su caso, el pin 4 es SSpara la interfaz de la tarjeta SD, mientras que el pin 10 es SSpara el controlador de ethernet.

Su código debería verse así (código no probado):

#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
    // ...
}

Debe asegurarse de que 4 y 10 no sean bajos al mismo tiempo porque eso haría que se enviaran los mismos datos a ambos esclavos: MALO.

Su biblioteca probablemente maneja la configuración 4 y 10 alta y baja en los momentos apropiados. Sin embargo, puede haber métodos que dejen uno de ellos bajo hasta que otro método lo establezca alto. Durante ese período, no debe usar un método para el otro dispositivo. Es posible que la biblioteca maneje casos como este, pero dado que su error parece ser conocido, obviamente no lo hace bien, si es que lo hace.

¡Muchas gracias! ¡Pero todavía me sorprende que en los ejemplos de código oficiales NO haya ninguna pista sobre esto!
Gracias por esta publicación. Después de luchar durante dos horas tratando de que mi escudo Arduino Ethernet oficial accediera a su tarjeta SD cuando estaba montado en un MEGA 2560, hice el digitalWrite (53, ALTO); Y funcionó. ¿Por qué en el mundo no arreglan eso en los ejemplos? De todos modos, gracias de nuevo.

Esta página wiki de adafruit parece tener un ejemplo decente.

La única referencia que veo a los pines 4 y 10 en el código es establecer el pin 10 en ALTO una vez en el inicio.

pinMode(10, OUTPUT);      // set the SS pin as an output (necessary!)
digitalWrite(10, HIGH);   // but turn off the W5100 chip!

Supongo que las bibliotecas de tarjetas Ethernet y SD lo manejan desde allí. Asegúrese de revisar toda la página.

Hay una pista en http://arduino.cc/en/Main/ArduinoEthernetShield

Tenga en cuenta que debido a que el W5100 y la tarjeta SD comparten el bus SPI, solo uno puede estar activo a la vez. Si está utilizando ambos periféricos en su programa, las bibliotecas correspondientes deben encargarse de esto. Sin embargo, si no está utilizando uno de los periféricos en su programa, deberá deseleccionarlo explícitamente. Para hacer esto con la tarjeta SD, configure el pin 4 como salida y escríbale un alto. Para el W5100, configure el pin digital 10 como salida alta.

La respuesta anterior resuelve el problema, pero no hay ejemplos en las bibliotecas estándar de cómo usar ambas funciones para usar Ethernet y SD para el registro de datos como ejemplo.