Publicado el 6 de Diciembre del 2013 por Pichon en Tecnología
Comunicación entre circuitos integrados: SPI

Buenas de nuevo, gente.

En el día de hoy, voy a hablaros sobre un protocolo de comunicaciones utilizado para la comunicación entre circuitos integrados en equipos electrónicos, conocido como SPI (Serial Peripheral Interface). Su esquema básico sería el que aparece en la siguiente figura.

SPI con un único esclavo

SPI con un único esclavo

 

Este esquema se corresponde con una de las dos modalidades existentes de SPI, conocida como de 4 hilos (aberración traductora de 4-wire). Los 4 hilos se corresponden a:

  1. SCLK (Clock, señal de reloj): El protocolo SPI es un protocolo síncrono, esto es, por cada pulso de reloj, se lee o se recibe un bit.
  2. SIMO o MOSI (Slave input Master Output o viceversa): Salida de datos del dispositivo maestro y entrada de datos del esclavo. También puede aparecer en algunos circuitos como SDA o SDI.
  3. SOMI o MISO (Slave Output Master Input o viceversa): Entrada de datos del dispositivo maestro y salida de datos del esclavo. También puede aparecer en algunos circuitos como SDO
  4. CS o SS (Chip Select o Slave Select): Se encarga de señalizar de entre todos los esclavos a los que pueda estar conectado el maestro, con cual quiere comunicarse. Es activa a nivel bajo, que si no entendéis de electrónica, significa que mientras haya un “1” binario no hace nada, y cuando  baja a “0” comienza a funcionar y empieza la comunicación. También llamado STE (Slave Transmit Enable)

En la variante conocida como 3 hilos (3-wire), el SIMO y el SOMI van por el mismo canal físico, imposibilitando que se pueda enviar información en ambos sentidos al mismo tiempo. La variante de 3-wire no se puede utilizar en sistemas multiesclavo, por lo que acabo de comentar, ya que podría darse el caso de que un esclavo solicitara leer y el otro escribir.

En primer lugar analizaremos el reloj. SPI admite un rango de frecuencias entre los 10 KHz y los 100 MHz, pero lo más utilizado es entre los 256 KHz y los 16 MHz. Cuando se genera una señal de reloj, un dato se envía por el SOMI y otro el SIMO, siempre que la transmisión sea full dúplex. Ahora bien, como en todo proceso síncrono, el receptor debe enterarse de cuando tiene que empezar a leer. Y en este aspecto entran en juego dos parámetros muy importantes: La polaridad del reloj (CPOL) y la fase del reloj (CPHA). Analizando las cuatro opciones posibles tenemos que:

Las diferentes posibilidades de polaridad y fase

Las diferentes posibilidades de polaridad y fase

  • CPOL = 0 y CPHA = 0: El estado inicial del reloj es cero (nivel bajo). Cuando se envía el dato es capturado en el flanco de subida del reloj, y se transmite en el flanco de bajada.
  • CPOL = 0 y CPHA =1: El estado inicial del reloj es cero (nivel bajo). Cuando se envía el dato es capturado en el flanco de bajada del reloj, y se transmite en el flanco de subida.
  • CPOL = 1 y CPHA = 0: El estado inicial del reloj es uno (nivel alto). Cuando se envía el dato es capturado en el flanco de subida del reloj, y se transmite en el flanco de bajada.
  • CPOL = 1 y CPHA =1: El estado inicial del reloj es uno (nivel alto). Cuando se envía el dato es capturado en el flanco de bajada del reloj, y se transmite en el flanco de subida.

Como siempre, ¿esto se utiliza? Sí. Mucho. ¿Por qúe?  Permite comunicación full Duplex (en ambos sentidos al mismo tiempo), no se tienen que envíar obligatoriamente bloques de 8 bits, y una línea específica para cada esclavo (el chip select). Lo malo, más cables que I2C (otro protocolo del que ya hablaré algún día), solo sirve para distancias cortas, y probablemente el más importante: no es un protocolo seguro, esto es, cuando envía el dato, no recibe un ACK de confirmación. Quiere esto decir que uno puede estar enviando datos desde el emisor perfectamente, pero el receptor no recibe nada y ninguno de los dos se entera de lo que está pasando.

Para ilustrar un poco esto, y demás aspectos de este procotolo, vamos a poner un ejemplo concreto, basado en un microcontrolador de Texas Instruments, el msp430f247.

El protocolo SPI se realiza a través de cualquiera de las dos USCI (Universal Serial Communication Interface) que tiene dicho micro.  Utilizaremos por ejemplo la A. Primero se configura el watchdog (mecanismo por el cual se resetea el sistema si este queda bloqueado) y se configura también el reloj.

La USCI tiene un registro UCA0CTL0 en el cual debemos configurar la polaridad y fase como ya hemos comentado antes, además del orden de los bits (MSB o LSB) de seleccionar si se van a enviar 7 u 8 bits (si queremos 8 entonces UC7BIT =0), si el micro es el maestro (MST= 1), si el protocolo es a 3 o 4 hilos, y por último UCSYNC = 1 (comunicación síncrona, si fuera 0 entonces estaríamos hablando de una UART). En el registro UCA0CTL1 se configura se señala cual queremos que se la fuente de reloj. La imagen que os adjunto es de un programa proporcionado por dicha compañía, llamado Grace, y con el que se puede configurar todos los registros para el protocolo.

Configuracion de los registros en el Grace

Configuracion de los registros en el Grace

 

 

El registro UCA0BR0 es otro registro configurable y que sirve como divisor de la frecuencia de reloj que hayamos configurado anteriormente. Y el último registro del que comentaré algo será del UC0IE que habilita o inhabilita las interrupciones en transmisión recepción.

Os voy a dejar un par de enlaces, a continuación muy útiles por si queréis continuar con el tema. El primero es un ejemplo de TI de cómo funciona el protocolo para un determinado micro (no es del que he hablado).

http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=swra141&fileType=zip

http://www.ti.com/lit/an/swra141/swra141.pdf

Os recomiendo que tengáis cuidado ya que concretamente para ese micro y esos esclavos si funciona, pero para otros no. Es importante leerse el datasheet del esclavo y hacer las oportunas modificaciones. En un par de meses (si Isithrade no me ha fustigado antes por mis pocas aportaciones), espero poder subir un ejemplo completo para que veáis completamente como funciona.

Hasta entonces un saludo