martes, 25 de junio de 2013

Uso de la comunicación SPI en el ARDUINO

El uso del SPI en Arduino , es relativamente sencillo. Vamos a realizar el código que nos permita enviar dos bytes uno con 0x33 y el otro con 0xF0. También veremos como configurar la velocidad del SPI.


En un primer paso importamos la librería del SPI con #include <SPI.h> . En el setup hay que iniciar y configurar el SPI , con SPI.begin() ademas hay que definir el pin SS como salida.



Finalmente mediante la función SPI.transfer enviamos el byte que queremos. Este es el código resultante:




Para realizar las conexiones  al osciloscopio o a otro chip lo mejor es usar las conexiones del ICSP ya que estas son iguales para todas las placas. En la pagina de Arduino podemos encontrar las siguientes tablas de conexión.



El resultado en el osciloscopio son los dos bytes enviados de forma secuencial.

Azul MOSI, Rojo SCLK.

En este ejemplo se ha configurado el bus para funcionar a la velocidad por defecto es decir 4Mhz pero esto puede ser un problema. Como se ve en las gráficas anteriores los bits llegan con oscilaciones que si bien en casi todos los casos no darán errores, es posible que falle en alguna ocasión. Para distancias cortas la tasa de error no es muy elevada y se puede trabajar perfectamente, pero podemos ver que si vamos elevando la distancia y si entran en juego otros componentes u otras señales es posible que los errores aumenten. Por ello es bueno bajar la velocidad para que el bit se estabilice y el transitorio sea despreciable. La velocidad por defecto usa el divisor por 4. 
Para ello usaremos la instrucción SPI.setClockDivider(divider) donde este puede tener los siguientes valores: 
  • SPI_CLOCK_DIV2
  • SPI_CLOCK_DIV4
  • SPI_CLOCK_DIV8 
  • SPI_CLOCK_DIV16
  • SPI_CLOCK_DIV32
  • SPI_CLOCK_DIV64
  • SPI_CLOCK_DIV128

Esto nos da la opción de dividir la velocidad del reloj del SPI. Por ejemplo probaremos con divisor de 16 y divisor de 128. 
Se puede ver que la señal cada vez es más cuadrada y sin sobresaltos. En realidad las oscilaciones son  las mismas ya que esto es producto del flanco de subida de la señal, lo que pasa es que ahora el tiempo de oscilación de la señal es despreciable frente al tiempo del bit. Eso implica que en el momento de leer el bit hay más posibilidades de que la señal sea estables y tomemos el valor correcto. 

Divisor de 16


Divisor de 128

Como podemos apreciar perdemos velocidad ya que en el caso por defecto con divisor 4 cada bit dura 250 ns es decir 4 Mhz. Pero en el de 16 el bit ya pasa a durar 1ms por lo que nos encontramos con una frecuencia de 1Mhz. Y finalmente en la de 128 el bit dura 8 ms por lo que la frecuencia es de 125 KHz. También se puede probar con el caso opuesto de aumentar la velocidad, poniendo el divisor por 2 donde veremos que la calidad disminuye muchísimo. 
Divisor por 2. Velocidad 8 Mhz.

La última parte a tratar en este tutorial sobre SPI es la lectura. Para realizar la lectura hay dos métodos, dependiendo de si somos Master o Slave . En caso de ser Master somos los únicos que tenemos control sobre el reloj por lo que la función de escritura es la misma que la de lectura. Por lo que con la función SPI.transfer leemos el parámetro devuelto.


Para explicar el uso del Salve vamos a usar dos Arduinos, uno como Master y otro como Slave, este primero mandará un mensaje al Slave como lo hemos visto antes. El Slave para poder realizar la lectura necesita hacer uso de las interrupciones de este modo cuando le llegue un byte saltará a la interrupción y allí haremos el tratamiento del dato recibido. A continuación podemos ver los dos códigos:

Código Master 




Código Slave 

Finalmente pasamos el programa a cada placa con las conexiones antes mencionadas para el arduino. 



Diana Colin Amador 

7 comentarios:

  1. la comunicación spi nos ayuda mucho a disminuir la cantidad de de puertos para comunicar dispositivos externos a nuestro microcontrolador inclusive a comunicarnos entre microcontroladores, la teensy 3.0 tiene algunos problemas para usar la librería de comunicación spi como maestro, esperemos y que al ser un sistema open source pronto se pueda manejar como maestro, un saludo y buen aporte.

    ResponderEliminar
  2. Esta muy buena la explicación ademas que poder ver las imágenes de las señales ayuda comprender mas fácil los efectos en los cambios de la frecuencia del reloj, por eso un osciloscopio siempre es de gran ayuda, también sorprende el tamaño del código necesario para implementar el SPI en un arduino en comparación con algún otro micro, te reduce mucho el trabajo esas librerias.

    ResponderEliminar
  3. Cuando queremos comunicar dos microcontroladores con un bus SPI es bastante fácil; esto es debido a que no existe un protocolo definido para realizar la interfaz. El sensor Freescale de presión y temperatura mpl115a1, utiliza la comunicación SPI, si observan el datasheet verán que el protocolo propuesto debe estar de acuerdo a una tabla de tiempos. Por cierto si tienen la oportunidad de usar este sensor, existe igualmente con comunicación I2C.
    Y por lo de la Teensy con las librerías en sí no es la incompatibilidad total, sino que en ocasiones la arquitectura ARM no reconoce algunos tipos de variables. Al Arduino Due le sucede lo mismo.



    ResponderEliminar
  4. Este tipo de información es muy útil para relacionarnos con el protocolo SPI, ya que el ejemplo está muy bien explicado. Puede ser replicado fácilmente para experimentar con su funcionamiento.

    ResponderEliminar
  5. Me agrado mucho tu post, ya que fue bastante gráfico en cuanto a los códigos, en los pulsos de la comunicación y en las conexiones del arduino, en general un excelente aporte solo falto el link de "download" jejeje.

    ResponderEliminar
  6. Gracias Diana!! :) la verdad nos ayudo mucho la información, porque si fue un poco tediosa la comunicación SPI con el arduino porque no entendíamos muy bien como funcionaba la interrupción en la recepción de los datos.
    si es cierto que existen muchas librerias, codigo y ejemplos de aplicaciones para el arduino, pero cuando se traba de buscar información acerca de como funcionan sus modulos o los registro que se modifican u cosas un poco mas "avanzadas" casi no encuentras. pero gracias de verdad por tu aporte :)

    ResponderEliminar
  7. Miraaa que facil, jejee pues si la verdad que ese es su Gran ventaja competitiva del arduino, la informacion.
    definitivamente esta tarjeta tiene la fama que tiene solo por esto por toda la información que hay y las librerias que ya te facilitan todoo.

    pero definitivamente es una buena opcion para iniciarte con algún tema desconocido y ya despues programarlo con otro micro controlador.

    ResponderEliminar