Biblioteca SPI

Esta biblioteca le permite comunicarse con dispositivos SPI, con el Arduino como dispositivo maestro.


Una breve introducción a la interfaz periférico serie (SPI)


Serial Peripheral Interface (SPI) es un protocolo de datos serie síncrono utilizado por los microcontroladores para comunicarse con uno o más dispositivos periféricos rápidamente en distancias cortas. También se puede utilizar para la comunicación entre dos microcontroladores.

Con una conexión SPI siempre hay un dispositivo master (por lo general un microcontrolador) que controla los dispositivos periféricos. Por lo general hay tres líneas comunes a todos los dispositivos:
  • MISO (Master In Slave Out) - La línea de esclavo para el envío de datos al maestro,
  • MOSI (Maestro Out Slave In) - La línea principal para el envío de datos a los periféricos,
  • SCK (Reloj serie) - Los impulsos de reloj que sincronizan la transmisión de datos generado por el maestro
y una línea específica para cada dispositivo:
  • SS (Slave Select) - el pin de cada dispositivo que el maestro puede utilizar para activar y desactivar dispositivos específicos.
Cuando en un dispositivo el pin Slave Select está a nivel LOW, se comunica con el maestro. Cuando está a nivel HIGH, no tiene en cuenta el maestro. Esto le permite tener múltiples dispositivos SPI que comparten el mismo MISO, MOSI, y las líneas de CLK.

Para escribir código para un nuevo dispositivo SPI necesita tener en cuenta algunas cosas:
  • ¿Cuál es la velocidad máxima de SPI del dispositivo puede utilizar? Esto  está controlado por el primer parámetro de SPISettings. Si está utilizando un chip nominal de 15 MHz utilice 15000000. Arduino utilizará automáticamente la mejor velocidad que es igual o menor que el número que utiliza con SPISettings
  • ¿Los datos se desplazan primero en el bit más significativo (MSB) o en el bit menos significativo (LSB)? Esto está controlado por el segundo parámetro de SPISettings, ya sea MSBFIRST o LSBFIRST. La mayoría de los chips de SPI utilizan los primeros datos MSB.
  • ¿Está el reloj inactivo cuando los datos son LOW o HIGH? Son muestras n el flanco ascendente o descendente de los pulsos de reloj? Estos modos son controlados por el tercer parámetro de SPISettings.
El estándar SPI es libre y cada dispositivo lo implementa un poco diferente. Esto significa que hay que prestar especial atención a la hoja de datos del dispositivo al escribir el código.

En términos generales, hay cuatro modos de transmisión. Estos modos controlan si los datos se desplaza dentro y fuera en el flanco ascendente o descendente de la señal de reloj de datos (llamado el reloj de fase), y si el reloj está inactivo cuando está alto o bajo (llamado el reloj de la polaridad. Los cuatro modos combinan polaridad y fase de acuerdo con la siguiente tabla:

Modo
Reloj de polaridad (CPOL)
Fase de reloj (ACSP)
SPI_MODE0
0
0
SPI_MODE1
0
1
SPI_MODE2
1
0
SPI_MODE3
1
1

Una vez que tenga los parámetros de SPI, use SPI.beginTransaction () para comenzar a usar el puerto SPI. El puerto SPI se configurará con su todas sus configuraciones. La manera más simple y más eficiente de usar SPISettings se encuentra en SPI.beginTransaction (). Por ejemplo:

SPI.beginTransaction (SPISettings(14000000, MSBFIRST, SPI_MODE0))

Si otras bibliotecas utilizan interrupciones de SPI, se les impide acceder a SPI hasta que llame a SPI.endTransaction(). Los ajustes SPI se aplican al comenzar la transacción y SPI.endTransaction() no cambia la configuración de SPI. A menos que usted, o alguna biblioteca, llame a beginTransaction una segunda vez, el ajuste se mantiene. Usted debe tratar de reducir al mínimo el tiempo antes de llamar para una mejor compatibilidad si su programa se utiliza junto con otras bibliotecas que utilizan SPI.

Con la mayoría de los dispositivos SPI, después de SPI.beginTransaction(), va a escribir en el esclavo seleccionando el pin LOW, llame cualquier número de veces para transferir datos, a continuación, escriba el PIN  SS a nivel HIGH, y finalmente llame a SPI.endTransaction()

Para más información sobre SPI, consulte la página de Wikipedia sobre SPI.

Conexiones

En la siguiente tabla se desglosan los pines de las líneas SPI para las diferentes placas Arduino:



Placa Arduino / GenuinoMOSIMISOSCKSS (maestro)Nivel
Uno o Duemilanove11 o
ICSP-4
12 o
ICSP-1
13 o
ICSP-3
10-5 V
Mega1280 o Mega256051 o ICSP-450 o ICSP-152 o ICSP-353-5 V
LeonardoICSP-4ICSP-1ICSP-3--5 V
DueICSP-4ICSP-1ICSP-3-4, 10, 523,3V
CeroICSP-4ICSP-1ICSP-3--3,3V
10111 o ICSP-412 o ICSP-113 o ICSP-310103,3V
MKR10008109--3,3V

Tenga en cuenta que MISO, MOSI y SCK están disponibles en una ubicación física consistente en el conector ICSP; esto es útil, por ejemplo, en el diseño de un escudo que funciona en cada placa.
Aviso sobre el pin Slave Select (SS)en placas basadas AVR 
Todas las placas base AVR tienen un pin SS que es útil cuando actúan como un esclavo controlado por un maestro externo. Dado que esta biblioteca es compatible con el modo único maestro, este pin debe establecerse siempre como SALIDA, de lo contrario, la interfaz SPI se podría poner automáticamente en modo esclavo por el hardware, haciendo que la biblioteca quede fuera de servicio.

Es, sin embargo, posible utilizar cualquier pin como el Slave Select (SS) para los dispositivos. Por ejemplo, el escudo Arduino Ethernet utiliza el pin 4 para controlar la conexión SPI en la tarjeta SD de a bordo, y el pin 10 para controlar la conexión con el controlador Ethernet.

Ver FUNCIONES DE LA BIBLIOTECA SPI

Ejemplos

1 comentario:

  1. Busco información de MISO _ MOSI _ SPI para conectar un microcontrolador 8051 con un convertidor MCP 3204 , y no encuentro nada que me ayude a resolver el problema

    ResponderEliminar