TutorialSPI Arduino
TutorialSPI Arduino
En este tutorial vamos a explicar el funcionamiento del bus SPI. Se entrara en detalle del
comportamiento del bus y de como se transmite la información, además se vera su
funcionamiento en Arduino.
SPI (Serial Peripheral Interface) es básicamente un bus de comunicación a nivel de circuitos
integrados. La transmisión de datos se realiza en serie, es decir un bit después de otro. El bus
SPI se define mediante 4 pines:
SCLK o SCK : Señal de reloj del bus. Esta señal rige la velocidad a la que se transmite
cada bit.
MISO(Master Input Slave Output): Es la señal de entrada a nuestro dispositivo,
por aquí se reciben los datos desde el otro integrado.
MOSI(Master Output Slave Input): Transmisión de datos hacia el otro integrado.
SS o CS: Chip Select o Slave Select, habilita el integrado hacia el que se envían los
datos. Esta señal es opcional y en algunos casos no se usa.
Como todo también tiene sus desventajas que son las siguientes:
Uso en 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.
Para ello usaremos la instrucción SPI.setClockDivider(divider) donde divider 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 opciones 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 mas cuadrado 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 enfrente al tiempo de
bit. Eso implica que en el momento de leer el bit hay mas posibilidades de que la señal sea
estable y cojamos el valor correcto.
Divisor de 16
Por contra 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
Posiblemente con otros cable y mejor apantallados se pueda transmitir con esta velocidad
aunque a mi parecer la señal cuadrada del clock casi parece una especie de senoidal.
Divisor por 2. Velocidad 8 Mhz
La ultima 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 mandara 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 saltara a la interrupción y allí haremos el tratamiento del dato recibido. A
continuación podemos ver los dos códigos:
Código Master.
Finalmente pasamos el programa a cada placa con las conexiones descritas abajo y si
conectamos por USB el Slave podemos ver el mensaje recibido por SPI. Tener en cuenta las
conexiones de MISO y MOSI ya que los cables van con la misma nomenclatura y no cruzados,
es decir MISO con MISO y MOSI con MOSI.
Conexiones entre Arduinos