¿Cómo evitar la mezcla de la tarjeta SD y el SPI W1500 en el Ethernet Shield?

4

En una respuesta Kevin Mark apunta a una solution / reason para el uso del escudo Ethernet juntos con la tarjeta SD. La documentación de dice que tanto la tarjeta SD como el chip Ethernet comparten el bus SPI y que tengo que configurar diferentes pines en ALTA para Dígale a Ethernet Shield que use la tarjeta Ethernet O la tarjeta SD.

¿Cómo sería esa solución?

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?
    
pregunta powtac

3 respuestas

8

En SPI, se utilizan las siguientes conexiones:

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

Hay un SS para cada dispositivo esclavo. MISO , MOSI y SCK se comparten entre todos los dispositivos en el bus.

En su caso, el pin 4 es SS para la interfaz de la tarjeta SD, mientras que el pin 10 es SS para el controlador de Ethernet.

Su código debería tener este aspecto (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
    // ...
}

Debes asegurarte de que 4 y 10 no sean bajos al mismo tiempo porque eso causaría que se envíen los mismos datos a ambos esclavos - BAD.

Su biblioteca probablemente maneja la configuración 4 & 10 bajas y altas 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 utilizar un método para el otro dispositivo. Es posible que la biblioteca maneje casos como este, pero como su error parece ser conocido, obviamente no lo hace bien, en todo caso.

    
respondido por el walrii
3

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

La única referencia que veo al material de los pines 4 y 10 en el código es configurar el pin 10 a ALTO una vez que se inicie.

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.

    
respondido por el Kevin Mark
2

Hay una sugerencia en enlace

Tenga en cuenta que debido a que la tarjeta W5100 y SD comparten el bus SPI, solo uno puede estar activo a la vez. Si está utilizando ambos periféricos en su programa, esto debe ser cuidado por las bibliotecas correspondientes. 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, establezca el pin 4 como salida y escriba un alto para ello. Para el W5100, configure el pin digital 10 como una 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.

    
respondido por el dragonfly

Lea otras preguntas en las etiquetas