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

4

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, Tablero utilizado: 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 como mi maestra y otra como mi 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, ¿tengo que 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 embebidos y estoy totalmente confundido & Llena de estúpidas dudas. Por favor, no te preocupes. ¡Gracias!

    
pregunta PsychedGuy

2 respuestas

4

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

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

  

La interfaz SPI de Arduino Due funciona de manera diferente a cualquier otra placa Arduino. La biblioteca se puede usar en el vencimiento con los mismos métodos disponibles para otras placas Arduino o utilizando los métodos extendidos. Los métodos extendidos aprovechan 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 de selección de esclavos (SS) (pines 4, 10 y 52).

Lo que esto significa es que usted inicializa el SPI con el pin SS que está utilizando:

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 una tecla 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 vencimiento 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 a la configuración que tiene asociada con ese pin SS. Esto permite que un bus tenga múltiples configuraciones diferentes (velocidad, polaridad de reloj, orden de bits, etc.) y alternar entre ellos correctamente sin ninguna intervención manual de su parte.

Puede leer más sobre esta forma de trabajar aquí: enlace

En cuanto a la prueba de su código, cuando necesito probar un puerto SPI, por lo general creo una conexión de bucle invertido (conecto MOSI a MISO) y envío 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.

    
respondido por el Majenko
3

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

Puede usar uno o más LEDs de activación de registros de desplazamiento de entrada en paralelo de entrada en serie para probar la salida SPI: los LED de activación 74hc595 con resistencias de la serie 1k en cada LED funcionan bien. Prefiero que las salidas del registro de cambios estén activas BAJA: eso significa que todas las resistencias LED para hacer el riel de + 5V con LED de cada resistencia a las salidas del registro de cambios.

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

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

La razón específica por la que menciono a dónde van las resistencias para los registros de desplazamiento de entrada y salida de serie es que utilizo redes de resistencia de bus en un paquete SIP de 10 pines. Estos son aptos para tablas de pan (espaciado de pines de 0.1 ") y lo hacen fácil (y limpio y ordenado) para agregar las resistencias necesarias.

Una nota final: debido a que esto es algo que solía hacer muchísimo (¡y aún lo hago!), en realidad inventé varias piezas pequeñas de Veroboard (stripboard) con los componentes en las tablas. Un estilo tiene un interruptor DIP de 8 anchos y amp; La red SIP pull-up, el otro estilo, tiene una barra LED de gráfico de barras de 10 segmentos con red de resistencia SIP pull-up. Todos estos fueron hechos con enchufes de clavija de máquina estilo SIP (una sola fila) que me permiten usar un cable sólido de 24 AWG / cat-5 para pasar de los pequeños módulos a la placa de pruebas.

El uso de estos pequeños módulos hace que las pruebas y la experimentación sean muy fáciles. Las ventajas añadidas son que los componentes de estos pequeños módulos no ocupan espacio en su placa de pruebas, se pueden reutilizar una y otra vez y son amigables con los microcontroladores de 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.

    
respondido por el Dwayne Reid

Lea otras preguntas en las etiquetas