Buenas, no se si estoy haciendo algo mal o si es algún fallo conocido, pro no he conseguido encontrar ninguna explicación mirando en este foro ni en internet. Os comento lo que me ocurre.
Estoy tratando de comunicar dos arduinos mediente SPI. El codigo del maestro es muy simple,
#include <SPI.h>
const int SS_PIN = 10; // Pin de Slave Select
void setup() {
pinMode(SS_PIN, OUTPUT);
digitalWrite(SS_PIN, HIGH); // Asegura que el esclavo está desactivado
digitalWrite(9, HIGH); // Asegura que el esclavo está desactivado
SPI.setClockDivider(SPI_CLOCK_DIV2);
SPI.begin(); // Inicia SPI
//Serial.begin(9600);
}
void loop() {
long dataToSend = 1234567890; // Valor a enviar
sendLong(dataToSend);
delay(3000);
}
void sendLong(long value) {
digitalWrite(SS_PIN, LOW); // Selecciona el esclavo
for (int i = 0; i < 4; i++) { // Enviar 4 bytes del long
byte byteToSend = (value >> (8 * i)) & 0xFF;
SPI.transfer(byteToSend);
}
delay(1000);
digitalWrite(SS_PIN, HIGH); // Deselecciona el esclavo
//Serial.println("Enviado");
}
El codigo del esclavo también es bastante simple
void setup() {
pinMode(MISO, OUTPUT);
pinMode(10,INPUT);
SPI.begin();
SPCR |= _BV(SPE); // Habilita SPI en modo esclavo
SPI.attachInterrupt(); // Habilita interrupción SPI
Serial.begin(9600);
}
ISR(SPI_STC_vect) { // Interrupción al recibir un byte
byte receivedByte = SPDR; // Leer el dato recibido
receivedData |= ((long)receivedByte << (8 * byteCounter)); // Reconstruir el long
byteCounter++;
Serial.println("Recibido"); // Imprime el long recibido
if (byteCounter >= 4) { // Si ya recibimos los 4 bytes
recibido = true;
byteCounter = 0;
}
}
void loop() {
if (recibido==true){
Serial.println(receivedData); // Imprime el long recibido
recibido = false;
}
}
Como el esclavo no se enteraba de la comunicación, he medido con un osciloscopio la tensión del pin 10, y es muy curioso, cuando la pone le maestro en alto tiene 5 voltios, pero cuando la pone en bajo, tan solo baja hasta los 2.5V.
Haciendo pruebas, he llegado a dejar el esclavo simplemente con el pin 10 como entrada, y la tension va de 0 a 5 V, pero si le añado la linea de codigo SPI.begin() la tension pasa a variar entre 5 y 2.5V
He probado en diferentes arduinos (nanos, unos, originales, chinos) y siempre llego al mismo resultado. He puesto resistencias de 10K como pull down, como push up, y no varia nada.
Alimento un arduino desde el otro mediante los pines 0 y 5V.
¿Alguna idea de que esta ocurriendo?¿Hay algo que estoy pasando por alto?
Muchas gracias de antemano.