¿Cómo probar si mi programa de comunicación SPI está funcionando correctamente?

He desarrollado un código simple para aprender sobre SPI en Arduino Due. El código se está compilando correctamente y ahora me gustaría aprender el siguiente paso sobre cómo probar el código con la placa y hacer que el maestro se comunique con el esclavo. Aquí está el código:

#include"SPI.h"
 int mosi = 75;          //assigning variables to pins
 int sck = 76;
 int ss = 10;
 int miso = 74;

void setup()
 {
   pinMode(mosi,OUTPUT);     //Configuring pins as input and output
   pinMode(sck,OUTPUT);
   pinMode(ss,OUTPUT);
   pinMode(miso,INPUT);
   SPI.begin(10);                   // waking up SPI bus
   SPI.setDataMode(10,SPI_MODE_0);  //setting mode for clk phase & pol
   SPI.setBitOrder(10, MSBFIRST);   // setting bit order for transfer
   SPI.setClockDivider(10,42);     //setting clock to 2 MHz
   digitalWrite(10,HIGH);     //keeping slave device unactive
 }
void set_value(int value);
 {
   digitalWrite(10,LOW);      //activate slave select line
   SPI.transfer(0);           
   SPI.transfer(value);    // transfer values from 0 to 255
   digitalWrite(10,HIGH);   //deactivate slave line after transfer
 }
void loop()
 {
   for(int i=0 ; i<256 ;i++)     //values to transfer
    {
      set_value(i);             //call function to transfer values
      delay(100);
    }
  }

IDE utilizado: Arduino, Placa utilizada: Arduino Due

Tengo algunas dudas con respecto a este código:

1) ¿Cómo probar este código con mi borad para comprobar si funciona correctamente?

2) ¿Por qué no se usan los pines mosi, sck y ss en ninguna parte del código, mientras que todas las operaciones/funciones se realizan con respecto a la línea esclava ss = 10? ¿El módulo SPI se encarga automáticamente de la transmisión y recepción de datos a través de MOSI y MISO?

3) ¿Cuáles son las posibles conexiones de hardware si estoy usando una placa debida como maestra y otra placa debida como esclava?

4) ¿Debo volcar este código en el maestro y en el esclavo para que funcione? O como el maestro tiene que transmitir y recibir datos de la placa esclava, ¿necesito hacer algunos cambios en este código?

5) Si me estoy perdiendo algo o alguna dirección con respecto a esto sería útil. Soy novato en sistemas integrados y estoy totalmente confundido y lleno de dudas estúpidas. Por favor, no te preocupes. ¡Gracias!

Puede considerar dividir sus preguntas para que encajen mejor en el formato de preguntas y respuestas de StackExchange.
Las preguntas de varias partes de la OMI están bien si están estrechamente acopladas.
No necesita alternar manualmente el pin CS o configurar los pines SPI, esto ya está hecho en la biblioteca SPI. La biblioteca SPI se encuentra en la carpeta de bibliotecas de su directorio de instalación de Arduino. Abra los archivos C++ y eche un vistazo al código, creo que obtendrá una mejor comprensión del funcionamiento interno. También es bueno descargar la hoja de datos del MCU de Due y echar un vistazo a la sección SPI. Recuerde, Arduino es solo el compilador avr-gcc con algunas bibliotecas básicas de c ++ y un IDE basado en el procesamiento.
@geometrikal: De hecho, estoy enfrentando algunos problemas al usar la función spi.transfer ya que no está realizando su tarea. Entonces, como dijiste, comencé a escanear las bibliotecas en el directorio de instalación. El archivo spi c++ solo está disponible en la carpeta de la biblioteca WiFi. Revisé las utilidades en la carpeta WiFi y encontré el archivo C ++ spi_drv, sin embargo, en este archivo, busqué y no pude ver ningún código de función spi.transfer(), aunque lo han usado. Entonces, solo quería saber si has venido a través de él en algún momento cuando escanea a través del código spi. Si es así, por favor directo. Gracias.
No quiero publicar otra pregunta preguntando si alguien se ha encontrado con esta función en las bibliotecas de arduino, ya que sería una tontería. Entonces, cualquier ayuda en resumen sería apreciada.
Finalmente encontré la función spi.(). Estaba presente en la carpeta de hardware en el directorio de arduino

Respuestas (2)

Arduino DUE utiliza una metodología ligeramente diferente para SPI en comparación con el resto de las placas Arduino. Maneja la operación de la línea SS por usted, para que usted no tenga que hacerlo.

Si bien puede usar el método de software manual, es mejor usar las instalaciones de hardware donde estén disponibles.

La interfaz SPI de Arduino Due funciona de manera diferente a cualquier otra placa Arduino. La biblioteca se puede usar en Due con los mismos métodos disponibles para otras placas Arduino o usando los métodos extendidos. Los métodos extendidos explotan el hardware SAM3X y permiten algunas características interesantes como:

  • manejo automático de la selección de esclavos del dispositivo.
  • manejo automático de diferentes configuraciones de dispositivos (velocidad de reloj, modo de datos, etc.) para que cada dispositivo pueda tener su propia configuración seleccionada automáticamente.

Arduino Due tiene tres pines expuestos para las líneas Slave Select (SS) de los dispositivos (pines 4, 10 y 52).

Lo que esto significa es que inicializas el SPI con el pin SS que estás usando:

SPI.begin(10);

Luego, envía y recibe utilizando las versiones de "continuación" de la función de transferencia SPI:

SPI.transfer(10, 0, SPI_CONTINUE);
SPI.transfer(10, value);

El primer parámetro es el pin SS (se usa como clave para conectar la función a la instancia SPI correcta), el segundo es el valor a transferir y el tercero le dice a SPI que no levante el pin SS después de la transferencia.

El SPI en el Due es un solo bus SPI con múltiples pines SS de hardware. La configuración del bus está adjunta a ese pin SS, por lo que cuando activa un pin SS, configura automáticamente el bus con los ajustes que ha asociado con ese pin SS. Esto permite que un bus tenga múltiples configuraciones diferentes (velocidad, polaridad de reloj, orden de bits, etc.) y cambie entre ellas correctamente sin ninguna intervención manual de su parte.

Puede leer más sobre esta forma de trabajar aquí: http://arduino.cc/en/Reference/DueExtendedSPI

En cuanto a probar su código, cuando necesito probar un puerto SPI, generalmente creo una conexión de bucle invertido (conectar MOSI a MISO) y enviar valores aleatorios a través de él, recibiendo lo que se envía. El valor enviado y el valor recibido deben coincidir si el SPI funciona correctamente.

Lo siento si esto no está relacionado. Digamos que si tiene 2 esclavos, uno en el pin 10 y otro en el pin 4, ¿llama a SPI.begin (10) o SPI.begin (4) antes de enviar datos a cada esclavo?

La forma más fácil de ver si su código SPI está funcionando es conectar su controlador a registros de desplazamiento externos y averiguarlo.

Puede usar uno o más registros de desplazamiento de entrada en serie y salida en paralelo que controlen los LED para probar la salida SPI: los LED de control 74hc595 con resistencias en serie de 1k en cada LED funcionan bien. Prefiero que las salidas del registro de desplazamiento estén activas en BAJO, lo que significa que todas las resistencias de LED hacen el riel de +5 V con LED de cada resistencia a las salidas del registro de desplazamiento.

Puede usar uno o más registros de desplazamiento de salida en serie de entrada paralela con interruptores DIP para probar la entrada SPI: 4021 con resistencias pull-up de 10k más un interruptor DIP a tierra para cada una de las entradas.

Una prueba rápida es escribir un código que simplemente haga eco de las entradas del interruptor DIP en los LED.

La razón específica por la que menciono dónde van las resistencias para los registros de desplazamiento de entrada y salida en serie es que utilizo redes de resistencias de bus en un paquete SIP de 10 pines. Estos son compatibles con la placa de pruebas (separación de pines de 0,1") y hacen que sea fácil (y limpio y ordenado) agregar las resistencias necesarias.

Una nota final: debido a que esto es algo que solía hacer muchísimo (¡y todavía lo hago!), en realidad hice varias piezas pequeñas de Veroboard (stripboard) con los componentes de las placas. Un estilo tiene un interruptor DIP de 8 anchos y una red SIP desplegable, el otro estilo tiene una barra LED de gráfico de barras de 10 segmentos con una red de resistencia SIP desplegable. Todos estos se hicieron con enchufes de pines de máquina estilo SIP (una sola fila) que me permiten usar cable sólido de teléfono / cat-5 de 24 AWG para ir desde los pequeños módulos hasta la placa de pruebas.

El uso de estos pequeños módulos hace que probar y experimentar sea muy fácil. Las ventajas añadidas son que los componentes de estos pequeños módulos no ocupan espacio en su protoboard, se pueden reutilizar una y otra vez y son amigables con los microcontroladores a nivel de placa como Arduino u otros controladores de placa única. .

Primero hice mis pequeños módulos como este hace varias décadas y todavía los uso hoy.