6 votos

Haciendo dos Arduinos hablar sobre SPI

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

setup

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?

7voto

kender Puntos 18446

Me echó un rápido vistazo en el Arduino SPI de la biblioteca, y no podía encontrar la función attachInterrupt (). Supongo que estás usando una extensa librería de algún tipo, y voy a hacer la suposición de que funciona, aunque me gustaría ver cómo se implementa por debajo.

Un par de cosas que vi:

  1. Esto compila? if (pos < sizeof buf) - que probablemente se necesita para ser if (pos < sizeof(buf))
  2. En el ejemplo de código en el foro, tiene una tecla de línea a la derecha aquí que falta en su esclavo código:

    // turn on interrupts
    SPCR |= _BV(SPIE);
    

Sin esto su interrupción de la recepción probablemente no fuego. Tampoco veo donde global de las interrupciones están habilitadas aunque no tengo idea de si Arduino se encarga de eso por usted bajo el capó. También no he molestado en mirar lo que cualquiera de los registros de decir, estoy haciendo mi mejor esfuerzo para ir por la memoria del AVR del SPI registros.

6voto

DPS Puntos 81

El problema es con el Arduino Leonardo. Según el oficial de Arduino Leonardo página web:

SPI: en el conector ICSP. Estos pines de apoyo a la comunicación SPI utilizando el SPI de la biblioteca. Tenga en cuenta que los pines SPI no está conectado a ninguna de los pines digitales e/S, ya que están en la Onu, Que sólo están disponibles en el conector ICSP. Esto significa que si usted tiene un escudo que utiliza SPI, pero NO tiene una de 6 pines ICSP conector que se conecta a la Leonardo de 6 pines del conector ICSP, el escudo no va a funcionar.

Ahora, los pines SPI se accede sólo a través del conector ICSP.

0voto

user46252 Puntos 1

O prueba a configurar la tasa de baudios en Arduino serial de la pantalla de depuración a 115200.

En el SPI Esclavo ejemplo, de Nick Gammon blog que enlaza establece la velocidad en baudios a 115200 en la línea 13 del Esclavo ejemplo. Cambiar la configuración de velocidad en baudios en el Arduino entorno de depuración ( mirando para el Hola Mundo! mensaje ), y se mostrará correctamente.

Alternativamente, usted puede cambiar el Serial.Begin() instrucción a 9600, pero luego se va a retrasar la velocidad de la pantalla de mensajes (de depuración), y posiblemente la velocidad de la placa Arduino.

-2voto

Paul Puntos 1

Tienes que cruzar sobre tus alambres. De lo contrario, todos solo están hablando en MOSI <-> MOSI y todos solo están escuchando en MISO <-> MISO.

(11) MOSI -------> (11) MISO (12) MISO <------- (12) MOSI

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X