Problemas tension con spi

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.

¿Puedes mostrar tus conexiones entre los Arduinos?

digitalWrite(9, HIGH); // Asegura que el esclavo está desactivado

¿A qué está conectado el pin 9 del maestro?
¿Si con HIGH te aseguras que el esclavo está desactivado, por qué no lo pones luego en LOW para activarlo?

En el código del esclavo las variables receivedData, byteCounter y recibido no están declaradas.
Usar operaciones del puerto serie dentro de una rutina de servicio de interrupción es una pésima idea.

Buenas, me respondo a mi mismo.
He conseguido encontrar el fallo. En el esclavo, metía la instrucción de código
SPI.begin();
Se ve que en el esclavo no es necesario añadir esa linea de código, ya qu eha sido quitarla y funcionar todo perfectamente.
No se si SPI.begin() configura el pin 10 de alguna manera en particular, pero parece que era el origen de los problemas.
Gracias a todos.

Si, claramente lo hace actuar como Maestro SPI y debe ser esclavo o sea debe ser obediente a lo que el arduino Maestro le solicite y cuando no, quedar inactivo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.