0% encontró este documento útil (0 votos)
7 vistas

TutorialSPI Arduino

ebook

Cargado por

Miguel Cb
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas

TutorialSPI Arduino

ebook

Cargado por

Miguel Cb
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 10

Tutorial Arduino - SPI

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.

Imagen de la conexión SPI. Fuente Wikipedia.


A diferencia de otros buses el SPI no implementa el nivel del enlace entre dispositivos, es
decir no hay un campo para la dirección ni un campo para ACK, etc. El SPI se comporta como
un shift register donde a cada golpe de clock se captura un bit. En parte no es necesaria hacer
un direccionamiento de los chips ya que mediante la señal Chip select, habilitamos al
integrado al que queremos enviar los datos.
El funcionamiento para un envió de un Master es el siguiente:

1. Se habilita el chip al que hay que enviar la información mediante el CS (Opcional).


2. Se carga en el buffer de salida el byte a enviar.
3. La linea de Clock empieza a generar la señal cuadrada donde normalmente por cada
flanco de bajada se pone un bit en MOSI.
4. El receptor normalmente en cada flanco de subida captura el bit de la linea MISO y lo
incorpora en el buffer.

Se repite el proceso 8 veces y se ha transmitido un byte. Si se ha terminado de transmitir se


vuelve a poner la linea CS en reposo. Hay que tener en cuenta que a la vez que el Master
esta enviando un dato también lo recibe así que si el Slave ha depositado algún byte en el
buffer de salida, este también sera enviado y recibido por el Master.
A continuación vamos a ver una transmision típica en SPI. En este caso se ha enviado el byte
0x52 que en binario seria 0101 0010

Envio de un byte mediante SPI


Visto como se envia un byte en SPI vamos a ver sus principales ventajas.

1. Comuncación Full-Duplex, es decir es capaz de enviar y recibir datos al mismo tiempo.


2. Muy simple y usado en los integrados.
3. Velocidades de comunicación relativamente elevadas. En el caso de Arduino de hasta
8 Mhz.
4. Completo control sobre la trama de bits al no exigir direccionamiento ni ACK.

Como todo también tiene sus desventajas que son las siguientes:

1. No hay control del flujo por hardware.


2. No hay confirmación de la recepción como si ocurre en I2C con el ACK. Es decir no
sabemos si el mensaje a llegado al destino.
3. Usa mas pines que otros buses, ya que necesita uno por cada esclavo. Eso implica
que no hay direccionamiento en la propia trama. A menos que se diseñe por software.
4. Funcionamiento a distancias cortas

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.

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


el código resultante:
Para realizar las conexiones a 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 suponer un problema. Como se ve en las gráficas anteriores los bits
llegan con oscilaciones que si bien en casi todos los caso no darán error, es posible a veces
falle. Para distancias cortas la tasa de error no es muy elevada y se puede trabajar
perfectamente, pero podemos ver como si vamos elevando la distancia y si entran en juego
otros componentes u otras señales es posible que los errores aumentes. Por ello es bueno
rebajar 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 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

También podría gustarte