Estoy tratando sin éxito de hacer dos Arduinos hablar a través del SPI.
Me encontré con este gran tutorial. El SPI Maestro de enviar una cadena constante cada segundo para el SPI Esclavo, que reenvía a la USART para la depuración propósito. El problema es que no se imprime nada en el Monitor Serial de Arduino.
El SPI Maestro está conectado en un segundo ordenador, y también se envía la cadena de USART. La cadena llega a la computadora.
He probado todos los Arduinos pines que yo uso y que están trabajando (en ambos Arduinos).
Mi configuración
- Arduino Leonardo: SPI Master
Seeeduino: SPI Esclavo
Leonardo___Seeeduino
(10) SS--------->(10) SS
(11) MOSI------->(11) MOSI
(12) DE MISO<-------(12) MISO
(13) SCLK------->(13) SCLK
El código utilizado en el SPI MAESTRO:
#include <SPI.h>
void setup (void)
{
Serial.begin(115200);
digitalWrite(SS, HIGH);
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop (void)
{
char c;
// enable Slave Select
digitalWrite(SS, LOW); // SS is pin 10
// send test string
for (const char * p = "Hello, world!\n" ; c = *p; p++) {
SPI.transfer (c);
Serial.print(c);
}
// disable Slave Select
digitalWrite(SS, HIGH);
delay (1000);
}
Y el código utilizado en el SPI ESCLAVO:
#include <SPI.h>
char buf [100];
volatile byte pos;
volatile boolean process_it;
void setup (void)
{
Serial.begin (115200);
// have to send on master in, *slave out*
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode
SPCR |= _BV(SPE);
// get ready for an interrupt
pos = 0; // buffer empty
process_it = false;
// now turn on interrupts
SPI.attachInterrupt();
}
// SPI interrupt routine
ISR (SPI_STC_vect)
{
byte c = SPDR; // grab byte from SPI Data Register
if (pos < sizeof buf)
{
buf [pos++] = c;
if (c == '\n')
process_it = true;
}
}
void loop (void)
{
if (process_it)
{
buf [pos] = 0;
Serial.println (buf);
pos = 0;
process_it = false;
}
}
Hay algo mal en este proyecto? ¿Cómo puedo hacer que funcione?