Está en la página 1de 12

PROTOCOLO DE

COMUNICACION SPI
INTRODUCCION
• El SPI es un protocolo de comunicación  síncrona de 4 hilos, entre dispositivos
electrónicos presentado por Motorola, ahora Freescale, http://www.freescale.com/
 en 1982, que ha ganado bastante aceptación en la industria como sistema de
comunicación de muy corta distancia, normalmente dentro la placa de circuito
impreso. Es un protocolo de transmisión que permite alcanzar velocidades muy
altas y que se diseñó pensando en comunicar un microcontrolador con distintos
periféricos y que funciona a full dúplex.
• SPI utiliza una solución síncrona, porque utiliza unas líneas diferentes para los
datos y el Clock. El Clock es una señal que indica al que escucha exactamente
cuándo leer las líneas de datos, con lo que el problema de pérdida de sincronía se
elimina de raíz.
SPI  (DEL INGLÉS SERIAL PERIPHERAL INTERFACEES)
• Es otro protocolo serie muy simple. Un maestro envia la señal de reloj, y tras cada
pulso de reloj envía un bit al esclavo y recibe un bit de éste.

• Los nombres de las señales son por tanto SCK para el reloj, MOSI para el Maestro
Out Esclavo In, y MISO para Maestro In Esclavo Out. Para controlar más de un
esclavo es preciso utilizar SS (selección de esclavo).

• UART se diferencia de SPI y I2C en que es asíncrono y los otros están


sincronizados con señal de reloj. La velocidad de datos UART está limitado a
2Mbps.

• El bus SPI incluye una línea de reloj, dato entrante, dato saliente y un pin de chip
select, que conecta o desconecta la operación del dispositivo con el que uno desea
comunicarse. De esta forma, este estándar permite multiplexar las líneas de reloj.
El bus SPI se define mediante 4
Uno de los motivos por los que SPI pines:
es tan popular es que el hardware de • SCLK o SCK : Señal de reloj del bus. Esta
señal rige la velocidad a la que se transmite
recepción puede ser un sencillo Shift cada bit.
register, lo que es una solución • MISO(Master Input Slave Output): Es la
mucho más simple y barata que una señal de entrada a nuestro dispositivo, por
UART (Universal Asíncronous aquí se reciben los datos desde el otro
Receiver Transmitter o  sistema integrado.
• MOSI(Master Output Slave Input):
universal asíncrono de recepción y Transmisión de datos hacia el otro integrado.
transmisión serie) de comunicación • SS o CS: Chip Select o Slave Select, habilita
serie. el integrado hacia el que se envían los datos.
Esta señal es opcional y en algunos casos no
se usa.
VENTAJAS DE SPI SOBRE I2C.
 I2C No es Full-Duplex por lo que no permite envíos y recepciones al mismo tiempo.

 I2C un poco más complejo que SPI.

 I2C no tiene control de errores, por ejemplo mediante paridad etc. Aunque se puede
realizar por Software.

 Velocidades de comunicación relativamente elevadas. En el caso de Arduino de hasta 8


Mhz.

 Completo control sobre la trama de bits al no exigir direccionamiento ni ACK.

 Se requiere un hardware sencillo (Barato)

 Requiere un menor consumo y menor electrónica de conexión que el I2C

 Como el Clock lo proporciona el master, los esclavos no necesitan osciladores (más


barato)
DESVENTAJAS DE SPI SOBRE I2C.
 No hay control del flujo por hardware.

 Las comunicaciones tiene que estar perfectamente establecidas de antemano. No


puedes enviar mensajes de diferentes longitudes cuando convenga.

 No hay confirmación de la recepción como ocurre en I2C con el ACK. Es decir no


sabemos si el mensaje a llegado al destino.

 Usa más pines que otros buses, ya que necesita uno por cada esclavo. Eso implica que
no hay direccionamiento en la propia trama. A menos que se diseñe por software.

 Funcionamiento a distancias cortas

 Master único y casi sin posibilidad de master múltiple

• Tanto el bus SPI como el I2C son llamados buses de tarjeta, es decir están pensados
para trabajar a distancias pequeñas del entorno de una tarjeta, en caso de necesitar un
bus serie a larga distancia hay que ir a buses de campo como RS485, CAN, etc…
APLICACIONES
• El canal SPI fue diseñado para aplicaciones de transmisión de datos a
velocidades altas (10 Mbps) y distancias cortas, del orden de 10 a 20
cms, ó bien dentro de un mismo PCB (circuito impreso), entre 2
circuitos integrados como podrían ser un microcontrolador y otro
dispositivo, por ejemplo, un circuito integrado con la función RFID. Las
señales de transmisión de datos y control del canal SPI, usan niveles de
voltaje TTL ó bien 3.3 volts, dependiendo de la tecnología de fabricación
del dispositivo.

• Algunas aplicaciones utilizadas son las siguientes: Sensores de presion


Barometricos, lectura de aire comprimido y temperature de un sensor.
CONEXIONES DE MAESTRO-ESCLAVO
• Cuando el número de esclavos crece suele ser más frecuente
conectarlos en cascada, con el MISO de uno (Salida), conectado al
MOSI (Entrada) del siguiente. En este caso solo usamos una única
línea SS, que se comparte entre todos los esclavos.

• Esta configuración es típica de una situación en la que le master envía


datos pero no recibe nada de vuelta, como en el caso de una cadena
de múltiples display LEDs (Matrices de 8×8), en los que se envía
información para ser mostrada pero, no hay datos de vuelta. En este
caso incluso podemos desconectar la línea MISO.

• Una vez que todos los datos son enviados la línea SS es activada y
todos los chips son activados simultáneamente.
PARA LA IMPLEMENTACIÓN DE ESTE PROTOCOLO SE UTILIZA LA
LIBRERÍA: #INCLUDE <SPI.H>
• Include <spi.h>
• #include <Wire.h>  void setup() {

• #include <SPI.h>   Serial.begin(9600);


  Serial.println(F("Iniciando ejemplo BMP280 SPI"));
• #include <Adafruit_BMP280.h>
  Serial.println("----------------------------"); 
•  #define BMP_SCK  (13) it (!sensor1.begin()) {
• #define BMP_MISO (12)     Serial.println(F("No se ha encontrado el primer sensor
(9)"));
• #define BMP_MOSI (11)
    while (1);
• #define BMP_CS_2 (9)   }

• #define BMP_CS_1 (10)    if (!sensor2.begin())


{
•  // Instancia de los dos sensores
    Serial.println(F("No se ha encontrado el segundo
• Adafruit_BMP280 sensor (10)"));
sensor1(BMP_CS_1);     while (1);
• Adafruit_BMP280   }
sensor2(BMP_CS_2);  }
• void loop() {
•     // Mostrar información sensor 1
•     Serial.println("Sensor 1");
•     mostrarInfoSensor(sensor1);
•     Serial.println("Sensor 2");
•     mostrarInfoSensor(sensor2);
•     Serial.println("-------------------------------------------");
•      Serial.println();
•     delay(5000); }

•  void mostrarInfoSensor(Adafruit_BMP280 sensor){


•       Serial.print(F("Temperatura = "));
•     Serial.print(sensor.readTemperature());
•     Serial.println(" *C");
•      Serial.print(F("Presion = "));
•     Serial.print(sensor.readPressure()); https://www.youtube.com/watch?v=gqsVMZrlEUQ&t=19s
•     Serial.println(" Pa");
•      Serial.println(); }

También podría gustarte