Diferencia entre revisiones de «SPI»

De ArduWiki
Saltar a: navegación, buscar
(Referencias externas)
(Referencias externas)
 
(No se muestran 14 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
La librería permite comunicarse con dispositivos SPI, usando Arduino como elemento maestro (master)
+
Esta 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.
 
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.
 
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.
Línea 13: Línea 13:
  
 
{| class="wikitable col5cen col6cen col7cen"
 
{| class="wikitable col5cen col6cen col7cen"
 +
|+Pines SPI en varios Arduino
 
|-
 
|-
 
! Arduino/Genuino
 
! Arduino/Genuino
Línea 79: Línea 80:
 
|}
 
|}
  
{Nota|Es 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.}
+
{{Nota|Es 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 ==
 
== Sintaxis ==
Para escribir código para un dispositivo SPI hay que saber unas pocas cosas.
+
<pre>
* ¿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.
+
#include <SPI.h>
* ¿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.
+
SPI.begin();
* ¿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.
+
</pre>
  
== Métodos ==
+
== Modos de operacion ==
 
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:
 
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:
  
 
{| class="wikitable col2cen col3cen col4cen col5cen"
 
{| class="wikitable col2cen col3cen col4cen col5cen"
 +
|+Modos de operacion de SPI
 
|-
 
|-
 
! Mode
 
! Mode
Línea 122: Línea 124:
 
| Rising
 
| Rising
 
|}
 
|}
 +
 +
<pre>
 +
setDataMode (SPI_MODE0);
 +
</pre>
  
 
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:
 
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));
+
<pre>
 +
SPI.beginTransaction(SPISettings (14000000, MSBFIRST, SPI_MODE0));
 +
</pre>
  
 
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.
 
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.
Línea 131: Línea 139:
 
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()
 
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:'''
+
== Métodos ==
* SPI.beginTransaction() -- Inicializa el bus SPI usando lo definido en SPISettings
+
{| class="wikitable col2cen col3cen col4cen col5cen"
* SPI.endTransaction() -- Detiene el bus SPI. Normalmente es llamado después de deseleccionar el chip para permitir a otras librerías usar el bus.
+
|+Metodos disponibles en libreria SPI
* 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().
+
|-
 +
! Método !! Descripción
 +
|-
 +
| SPI.begin() || Inicializa el bus SPI
 +
|-
 +
| SPI.transfer(c) || Envia un byte.
 +
|-
 +
| SPI.attachInterrup() || Activa una interrupcion para recibir datos
 +
|-
 +
| SPI.beginTransaction() || Inicializa el bus SPI usando lo definido en SPISettings
 +
|-
 +
| SPI.endTransaction() || Detiene el bus SPI. Normalmente es llamado después de deseleccionar el chip para permitir a otras librerías usar 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().
 +
|}
 +
 
 +
== Comentarios ==
 +
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.
  
 
== Advertencias ==
 
== 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.
 
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 ==
+
== Ejemplos ==
 
* [https://www.arduino.cc/en/Tutorial/BarometricPressureSensor Sensor barométrico de presión]
 
* [https://www.arduino.cc/en/Tutorial/BarometricPressureSensor Sensor barométrico de presión]
 
* [https://www.arduino.cc/en/Tutorial/DigitalPotControl Control de potenciómetro digital]
 
* [https://www.arduino.cc/en/Tutorial/DigitalPotControl Control de potenciómetro digital]
  
 
== Vea también ==
 
== Vea también ==
* [[Wire]]
+
<categorytree mode=all>Librerias</categorytree>
* [[Ethernet]]
 
* [[GSM]]
 
* [[WiFi]]
 
  
 
== Referencias externas ==
 
== Referencias externas ==
 +
* [https://www.arduinolibraries.info/libraries All Libraries]
 +
* [https://github.com/adafruit Adafruid librarys]
 
* [https://www.arduino.cc/en/Reference/Wire Wire]
 
* [https://www.arduino.cc/en/Reference/Wire Wire]
 +
* [https://www.arduino.cc/en/reference/SPI SPI]
 
* [http://arduino.perut.org/Arduino_19.htm Apuntes Arduino]
 
* [http://arduino.perut.org/Arduino_19.htm Apuntes Arduino]
 +
* [https://www.luisllamas.es/arduino-spi/ Bus SPI] - Luis Llamas
 +
* [https://aprendiendoarduino.wordpress.com/category/bus-spi/ Bus SPI] - Enrique Crespo
 +
* [http://www.gammon.com.au/spi Bus SPI] - Nick Gammon
  
 
[[Category:Librerias]]
 
[[Category:Librerias]]

Revisión actual del 00:35 5 may 2019

Descripción

Esta 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.

Pines SPI en varios Arduino
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

Nota: Es 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

#include <SPI.h>
SPI.begin();

Modos de operacion

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:

Modos de operacion de SPI
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
setDataMode (SPI_MODE0); 

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()

Métodos

Metodos disponibles en libreria SPI
Método Descripción
SPI.begin() Inicializa el bus SPI
SPI.transfer(c) Envia un byte.
SPI.attachInterrup() Activa una interrupcion para recibir datos
SPI.beginTransaction() Inicializa el bus SPI usando lo definido en SPISettings
SPI.endTransaction() Detiene el bus SPI. Normalmente es llamado después de deseleccionar el chip para permitir a otras librerías usar 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().

Comentarios

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.

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.

Ejemplos

Vea también


Referencias externas