Haciendo que dos Arduinos hablen sobre SPI

5

Intento sin éxito hacer que dos Arduinos hablen usando SPI.

Encontré este gran tutorial . El maestro SPI envía una cadena constante cada segundo al esclavo SPI, que se reenvía al USART para fines de depuración. El problema es que no se imprime nada en el Monitor Serial de Arduino.

El SPI Master está conectado en una segunda computadora y también envía la cadena a USART. La cadena llega a la computadora.

Probé todos los pines de Arduinos que uso y están funcionando (en ambos Arduinos).

Mi configuración

  • Arduino Leonardo: SPI Master
  • Seeeduino: SPI Slave

    Leonardo

pregunta borges

4 respuestas

6

El problema está con el Arduino Leonardo. Según el sitio web oficial de Arduino Leonardo :

  

SPI: en el encabezado de ICSP. Estos pines soportan la comunicación SPI usando   La biblioteca SPI. Tenga en cuenta que los pines SPI no están conectados a ninguno de   los pines de E / S digitales tal como están en el Uno, solo están disponibles   en el conector ICSP. Esto significa que si tienes un escudo que usa   SPI, pero NO tiene un conector ICSP de 6 pines que se conecta a la   El encabezado ICSP de 6 pines de Leonardo, el escudo no funcionará.

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

    
respondido por el borges
7

Eché un vistazo rápido a la biblioteca SPI de Arduino y no pude encontrar la función attachInterrupt (). Supongo que está utilizando una biblioteca extendida de algún tipo y supongo que funciona, aunque me gustaría ver cómo se implementa debajo.

Un par de cosas que vi:

  1. Esto compila? if (pos < sizeof buf) - probablemente necesita ser if (pos < sizeof(buf))
  2. En el código de muestra en el foro, él tiene una línea clave aquí que te falta en tu código de esclavo:

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

Sin esto, su interrupción de recepción probablemente no se disparará. Tampoco veo dónde se habilitan las interrupciones globales, aunque no tengo idea si Arduino se encarga de eso por ti bajo el capó. Tampoco me he molestado en buscar lo que significa cualquiera de esos registros, estoy haciendo todo lo posible por recordar los registros SPI de AVR.

    
respondido por el Jon L
0

O intente configurar su velocidad en baudios en la pantalla de depuración de serie de Arduino a 115200.

En el ejemplo de SPI Slave, desde la publicación del blog de Nick Gammon que vinculaste, la velocidad de transmisión se establece en 115200 en la línea 13 del ejemplo de Slave. Cambie la configuración de velocidad en baudios en el entorno de depuración de Arduino (mirando el mensaje Hello World!), Y se mostrará correctamente.

Alternativamente, puede cambiar la declaración Serial.Begin () a 9600, pero luego demorará la velocidad de la pantalla de mensajes (depuración) y posiblemente ralentizará el Arduino.

    
respondido por el Jared
0

Tienes que cruzar sobre tus cables. 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

    
respondido por el Paul

Lea otras preguntas en las etiquetas