SPI

De ArduWiki
Revisión del 11:24 20 jun 2018 de Jopapa (Discusión | contribuciones) (Métodos)

Saltar a: navegación, buscar

Descripción

La librería permite comunicarse con dispositivos SPI, usando Arduino como elemento maestro (master) Serial Peripheral Interface (SPI) es un protocolo de de comunicación serie rápida entre dispositivos a corta distancia. Aparte de entre Arduino y periféricos, también permite comunicación entre microcontroladores. En una comunicación SPI hay siempre un maestro (master) que controla los periféricos. Típicamente hay tres líneas de control comunes a todos los elementos-

  • MISO (Master In Slave Out)- Línea para mandar datos al maestro desde el esclavo
  • MOSI (Master Out Slave IN)- Línea para mandar datos a los periféricos
  • SCK (Serial Clock)- Pulsos de reloj para sincronizar la transmisión de datos generada por el maestro a una línea específica de cada periférico.
  • SS (Slave Select)- El pin en cada periférico que el maestro activa o desactiva para que los datos lleguen al dispositivo que queremos.

Cuando el SS (Slave Select) esta bajo (low), el comunica con el maestro y lo ignora cuando esta en alto (high). Esto nos permite tener múltiples dispositivos compartiendo las mismas líneas de MISO, MOSI y CLK.

Placas aplicables

La siguiente tabla muestra en que pines están las líneas SPI en diferentes placas.

Arduino/Genuino MOSI MISO SCK SS (slave) SS (master) Nivel
Uno o Duemilove 11 ó ICSP-4 12 ó ICSP-1 13 ó ICSP-3 10 -- 5V
Mega1280 ó 2560 51 ó ICSP-4 50 ó ICSP-1 52 ó ICSP-3 53 -- 5V
Leonardo ICSP-4 ICSP-1 ICSP-3 -- -- 5V
Due ICSP-4 ICSP-1 ICSP-3 -- 4, 10, 52 3,3V
Zero ICSP-4 ICSP-1 ICSP-3 -- -- 3,3V
101 11 ó ICSP-4 12 ó ICSP-1 13 ó ICSP-3 10 10 3,3V
MKR1000 8 10 9 -- -- 3,3V


Importante que las líneas MISO, MOSI y SCK están disponibles en una localización fija en un conector ICSP, esto es útil en el diseño de escudos (shield) que funcionen en todas la placas.

Sintaxis

Para escribir código para un dispositivo SPI hay que saber unas pocas cosas.

  • ¿Cual es la máxima velocidad del dispositivo? Esto es controlado por el primer parámetro in el SPISetting. Si se usa un chip a 15MHz, use 15000000. Arduino automaticamente usará la mejor velocidad igual o menor que esta.
  • ¿Estan los datos desplazados (shifted) en el mayor Most Significant Bit (MSB) o menor Least Significant Bit (LSB)? Esto es controlado por el segundo parámetro del SPISetting, o sea MSBFIRTS o LSBFIRTS. La mayoría de chip SPI usan el MSB.
  • ¿Esta el reloj de datos con alto o bajo? ¿Hay muestras en el borde ascendente o descendente de los pulsos de reloj? Este modo es controlado por el tercer parámetro del SPISetting.


Métodos

En términos generales, hay cuatro modos de transmisión. Estos modos controlan si los datos se desplazan hacia adentro y hacia afuera en el borde ascendente o descendente de la señal del reloj de datos (fase del reloj), y si el reloj está inactivo cuando está alto o bajo (polaridad del reloj). Los cuatro modos combinan polaridad y fase según esta tabla:

Mode Clock Polarity Clock Phase Output Edge Data Capture
SPI_MODE0 0 0 Falling Rising
SPI_MODE1 0 1 Rising Falling
SPI_MODE2 1 0 Rising Falling
SPI_MODE3 1 1 Falling Rising


Una vez que tenga sus parámetros SPI, use SPI.beginTransaction() para comenzar a usar el puerto SPI. El puerto SPI se configurará con todos sus parámetros. La forma más simple y eficiente de usar SPISettings es hacerlo dentro de SPI.beginTransaction(). Por ejemplo:

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

Si otras bibliotecas usan SPI desde interrupciones, se les impedirá acceder a SPI hasta que llame a SPI.endTransaction(). La configuración de SPI se aplica al comienzo de la transacción y SPI.endTransaction() no cambia la configuración de SPI. A menos que usted, o alguna biblioteca, llame a startTransaction() por segunda vez, la configuración se mantiene. Debe intentar minimizar el tiempo entre antes de llamar a SPI.endTransaction(), para obtener la mejor compatibilidad si su programa se usa junto con otras bibliotecas que usan SPI.

Con la mayoría de los dispositivos SPI, después de SPI.beginTransaction (), escribirá el pin de selección esclavo LOW, llamará SPI.transfer() cualquier cantidad de veces para transferir datos, luego poner el pin SS HIGH, y finalmente llamar a SPI.endTransaction()
Resumiendo:

  • SPI.beginTransaction() -- Inicializa el bus SPI usando lo definido en SPISettings
  • SPI.endTransaction() -- Detiene el bus SPI. Normalmente es llamado despues de deseleccionar el chip para permitir a otras librerias suar el bus.
  • usingInterrupt() -- Si su programa realizará transacciones SPI dentro de una interrupción, llame a esta función para registrar el número o nombre de la interrupción con la biblioteca SPI. Esto permite que SPI.beginTransaction() evite conflictos de uso. Tenga en cuenta que la interrupción especificada en la llamada a usingInterrupt() se deshabilitará en una llamada a beginTransaction() y se volverá a habilitar en endTransaction().

Advertencias

Tener en cuenta que el estandar para SPI no existe y su implementación varia levemente entre dispositivos. Hay que leer la hoja de datos de cada uno.

Ejemplo

  • Sensor barométrico de presión [1]
  • Control de potenciómetro digital [2]

Vea también

Referencias externas