sábado, 22 de junio de 2013

Serial Peripheral Interface (SPI)

Registrada por Motorola, es un protocolo serie para comunicarse con otros microcontroladores o periféricos, por ejemplo EEPROM, conversores A/D, y D/A, potenciometros digitales, etc, Permite la transmisión y la recepción simultanea de forma sincrónica, o sea es Full Duplex y Sincrónico. Intervienen dos o más nodos, uno de los cuales es el maestro y el resto son los esclavos, por lo que se considera Multipunto. se destaca por su simplicidad y normalmente la velocidad de comunicación no supero los 5Mbps. una se sus ventajas es la facilidad con que se realiza el aislamiento galvánico de sus líneas utilizando optoacopladores.


Intervienen 4 señales que son: Serial Data Out (DO o SDO), Serial Data In (DI o SDI), Serial Clock (CK) y Chip Select (CS) o Slave Select (SS), cuya forma de conexión se muestra en la Figura 1:


Figura 1.- Señales en el protocolo SPI, entre un Maestro y un Esclavo (a), o varios Esclavos (b).

El direccionamiento del esclavo se hace mediante la señal CS, por lo que tiene, una por esclavo. el Maestro genera la señal CK y controla las señales CS y DI, por lo que es el único que puede inicial la comunicación . la señal CK controla la velocidad de comunicación, permitiendo hacer pausas o tiempos de espera en la misma.

Es importante señalar que el SPI es un protocolo de intercambio de datos, por lo que se plantea que no existen dispositivos solamente transmisores o solamente receptores. Cuando se envía datos también se reciben datos, incluso si estos no son útiles a nuestra aplicación. los datos entrantes deben leerse antes de intentar transmitir nuevamente, sino se perderán. 

La señal CS activa o selecciona el dispositivo esclavo con el cual el maestro intercambiará datos. en caso de un solo esclavo el CS puede obviarse, aunque puede ser útil para provocar el reinicio del módulo SPI del esclavo.

Adentrandonos un poco más en los módulo SPI de estos dispositivos, posemos en la Figura 2, que el tener activo un esclavo se forma un lazo entre entre ambos dispositivos. Mientras que el maestro esta generando la señal de CK, se estarán desplazando los datos contenidos en cada registro y a su vez entre la salida de un registro y la entrada del otro. Es por ello que cada vez que se transmitan una cantidad de datos igual al tamaño del registro, se recibirá una cantidad igual que debe ser leída del búfer para no perderla. El búfer de datos también actúa como registro de escritura, y aal emplearlo como tal sobreescribimos su contenido.

Figura 2. Lazo entre dos dispositivos SPI

Si analizamos este proceso paso a paso, de forma general y cíclica, ocurriría como sigue:
1.- El maestro escribe en su búfer de datos.
2.- El maestro comienza a general CK y el esclavo escribe en su búfer de datos.
3.- El contenido del búfer del maestro se transfiere al registro de desplazamiento del maestro, y el del esclavo al registro de desplazamiento del esclavo.
4.- Maestro y esclavo intercambian una cantidad igual al tamaño de los registros de desplazamiento.
5.- El nuevo contenido de ambos registros de desplazamiento se transfiere a los respectivos búferes de datos.
6.- El dato es leído de los búferes de datos.

De esta misma forma se explica la conexión en cascada mostrada en la figura 3, que reduce notablemente la cantidad de líneas en el circuito impreso, pero que solo es posible con determinados dispositivos, por ejemplo potenciómetros digitales.

Figura 3.- Conexión en cascada de un Maestro y varios Esclavos

Normalmente los registros SPI son de 8 bits, aunque algunos dispositivos necesitan transmitir mayor cantidad de datos, en esos casos se realizan varias transferencias de 8 bits hasta completar todos los datos. Durante este tiempo al esclavo debe mantenerse activo.


14 comentarios:

  1. Muy buena información sobre la transmisión de datos vía SPI, este protocolo es ampliamente usado en memorias EEPROM y SD. En la materia de interfaces con el maestro Romero tuve la oportunidad de leer la memoria AT93C46, fue un poco tedioso debido a que se debe respetar una tabla de tiempos y envío de bits; de lo contrario no se puede acceder a las opciones de escritura y lectura. La principal ventaja de este protocolo es la velocidad de transmisión.

    ResponderEliminar
  2. Buen post la verdad no conocía este medio de transmisión de datos, pero tuve que utilizarlo debido a la practica 3 de este curso, creo que con esta información ya se cual es la falla en mi comunicación. En lo personal me agrada mas el bus de comunicación I2C o UART, se me hacen mas cómodos pero siempre es bueno ampliar las opciones que uno tiene para la comunicación entre dispositivos.

    ResponderEliminar
  3. Gracias por la explicación corta y concisa; sin embargo, este tipo de comunicación se me hizo un poco pesada, por la cantidad de cables que usamos, el tiempo que debíamos respetar para el envío y recepción de datos, que fue uno de los problemas que tuvimos al inicio cuando no sabiamos si realmente esta recibiendo o enviando los datos correctamente, así como que solo funciona a distancias cortas.

    ResponderEliminar
  4. Muy buen aporte y detallado de la comunicación SPI aunque es importante tambien recalcar que hay que configurar los dipositivos Maestro y Eclavo de de acuerdo a que bit recibira primero el menos significativo o el mas significativo ademas que igual hay que configurar en que momento se mandara y leera los datos si en el flanco de subida o en el flanco de bajada ambos tienen que tener la misma configuracion para tener una comunicación adecuada, por lo menos esos probleas son los que tube al realizar la practica

    ResponderEliminar
  5. Como menciona Peña tiene la ventaja que se pueden usar altas velocidades de transmisión pero tiene la desventaja de que no se puede usarse a largas distancias si se compara con una comunicación usb, rs-232 o una rs-485. Es mas pesada en comparación con el i2c en cuanto al cableado y los tiempos que se tienen que respetar, y en general toda la configuración tanto del maestro como del esclavo, ademas que no presenta un acknowledge, por lo que el maestro no se entera si existe un dispositivo esclavo que reciba los datos

    ResponderEliminar
  6. Muy buena explicación acerca de este estándar de comunicación. Como bien dicen es usado principalmente para la transferencia de información en distancias cortas, es por ello que se utiliza para comunicar circuitos integrados entre sí. Y tiene buenas ventajas entre ellas su comunicación full duplex (sistema capaz de mantener una comunicación bidireccional, enviando y recibiendo mensajes de forma simultánea) y bien su principal desventaja para mi es que consume más pines que I2C!

    ResponderEliminar
  7. Muy buen aporte, es la primera vez que manejo este tipo de comunicación, en mi opinión considero que es muy engorrosa por el excesivo cableado que se tiene que manejar además de que tiene la desventaja de comunicar dispositivos a distancias cortas, sin embargo también tiene sus ventajas como lo son la comunicación full duplex y la rápida transmisión de datos a comparación de otras comunicaciones, aún no me termina de convencer y prefiero la comunicación I2C sin embargo fue muy útil aprender sobre esta comunicación y compararla con las otras, gracias por tu aporte Adri :)

    ResponderEliminar
  8. En lo personal, no había trabajado con este tipo de comunicación, y algo que me agrado de esto es que el maestro escoge cuando recibir la señal y de que dispositivo, simplemente mandando una señal o un aviso de que solicita datos. Igualmente creo que como una desventaja seria que no puede ser utilizado a largas distancias, pero es muy bueno para distancias cortas brindando gran velocidad.

    ResponderEliminar
  9. para los que quieran ver mas información a cerca de este tema les recomiendo que bajen la hoja de datos del modulo spi de la pagina del cypress aun que no esten utilizando un micro de este tipo ahi te explica muy bien todo.

    ResponderEliminar
  10. La vdd es que si me dan a elegir entre I2C o SPI, sin pensarlo elegiría I2C, siento que es un protocolo un poco mas estandarizado y menos problemático, aunque el SPI es bastante mas rápido y permite bidireccionalidad, pero como siempre he dicho la elección del protocolo va depende de lo que se quiera hacer y los requerimientos que se desean cumplir. Les dejo este enlace, que me pareció muy completo e interesante, hace una comparativa bastante completa y exhaustiva entre I2C y SPI, espero les sirva de ayuda para sus proyectos futuros. http://www.csun.edu/~glaw/ee525/spii2ccomparison.pdf

    ResponderEliminar
  11. Este protocolo es muy efectivo cuando se requiere una transmisión de datos muy extensa,debido a su velocidad y a que permite el envío y recepción de información simultánea entre dos estaciones. Podría ser empleado en proyectos en los que se necesite la reproducción de archivos desde tarjetas de almacenamiento, así que considero que será muy útil.

    ResponderEliminar
  12. Un aporte muy ilustrativo, ya que muestra gráficamente como se configuran los bloques del SPI, es importante mencionar que la diferencia a I2C es la tasa de transferencia de datos, las desventajas pues que utiliza mas pines y necesitan tener el mismo reloj.

    ResponderEliminar
  13. De acuerdo con Gonz. No había notado las ventajas sobre I2C hasta que lo escribiste aquí. Pero se me hizo más claro el I2C que SPI. Está bien rraro esto. Pero según lo que se quiera hacer sus ventajas debe tener

    ResponderEliminar
  14. Me pareció muy interesante la conexión de la figura 3 "Daisy chain", como bien lo dices reduce el numero de lineas (de CS), pero a la vez reduce la velocidad pues en si todo funciona como un registro de desplazamientos, por lo que para enviar un dato al dispositivo n, se deberán hacer n corrimientos (n ráfagas de señales de reloj). Saludos

    ResponderEliminar