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?
En SPI, se utilizan las siguientes conexiones:
MISO
(Master In Slave Out) - una línea de datos para enviar datos del esclavo al maestroMOSI
(Master Out Slave In): una línea de datos para enviar datos del maestro al esclavoSCK
(Serial Clock) - un reloj generado por el maestro para registrar los bits en MISO
yMOSI
SS
(Slave Select) - una línea de datos del maestro a un esclavo en particular.Hay uno SS
para cada dispositivo esclavo. MISO
, MOSI
y SCK
se comparten entre todos los dispositivos del 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 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.
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.
powtac
jim cielo