Diferencia entre revisiones de «SPI»
(→Métodos) |
(→Referencias externas) |
||
(No se muestran 21 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
== Descripción == | == 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. | 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. |
* MISO (Master In Slave Out)- Línea para mandar datos al maestro desde el esclavo | * 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 | * MOSI (Master Out Slave IN)- Línea para mandar datos a los periféricos | ||
Línea 11: | Línea 11: | ||
== Placas aplicables == | == Placas aplicables == | ||
La siguiente tabla muestra en que pines están las líneas SPI en diferentes placas. | La siguiente tabla muestra en que pines están las líneas SPI en diferentes placas. | ||
− | + | ||
− | {| class="wikitable" | + | {| class="wikitable col5cen col6cen col7cen" |
+ | |+Pines SPI en varios Arduino | ||
|- | |- | ||
! Arduino/Genuino | ! Arduino/Genuino | ||
Línea 78: | Línea 79: | ||
| 3,3V | | 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 == | == Sintaxis == | ||
− | + | <pre> | |
− | + | #include <SPI.h> | |
− | + | SPI.begin(); | |
− | + | </pre> | |
− | + | == 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" | + | {| class="wikitable col2cen col3cen col4cen col5cen" |
+ | |+Modos de operacion de SPI | ||
|- | |- | ||
! Mode | ! Mode | ||
Línea 124: | 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. | ||
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() | ||
− | |||
− | |||
− | + | == Métodos == | |
− | + | {| class="wikitable col2cen col3cen col4cen col5cen" | |
− | + | |+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 == | == 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. | ||
− | == | + | == Ejemplos == |
− | + | * [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] |
− | * | ||
== Vea también == | == Vea también == | ||
− | + | <categorytree mode=all>Librerias</categorytree> | |
− | |||
== 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: | + | [[Category:Librerias]] |
Revisión actual del 04:35 5 may 2019
Contenido
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.
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:
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
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
- All Libraries
- Adafruid librarys
- Wire
- SPI
- Apuntes Arduino
- Bus SPI - Luis Llamas
- Bus SPI - Enrique Crespo
- Bus SPI - Nick Gammon