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.