Diferencias de los protocolos de comunicación UART vs I2C vs SPI

Cuando se habla de protocolos de comunicación, UART, SPI e I2C son las interfaces de hardware más comunes usadas en el desarrollo de microcontroladores. En este blog te contaremos las características de estos protocolos, las ventajas e inconvenientes de cada uno y algunos ejemplos de cómo se usan en los microcontroladores.

Uart Vs Spi

 Comunicación en serie

La comunicación en serie, serial o secuencial es la metodología más utilizada en lo que respecta a los sistemas integrados. Pero antes de hablar sobre los tipos de protocolos de comunicación en serie utilizados en la industria integrada y compararlos, vamos a ver qué es una comunicación en serie primero. La principal ventaja de la comunicación serie es que necesita un número más pequeño de líneas de transmisión que una comunicación paralela para transmitir la misma información. Además, elimina algunos problemas de transmisión o sincronización que presenta la comunicación en paralelo, por lo que suele ser la tecnología más usada actualmente.

Sin embargo, la comunicación en serie tiene un menor rendimiento a la misma frecuencia, es por ello por lo que para compensarse se trabaja a frecuencias más altas.

transferencia 

Un ejemplo muy claro de comunicación serial es el código Morse que todos conocemos, donde se envía la información secuencialmente dato a dato.

 SOS

‘SOS’ en código morse

Diferencias entre I2C, UART y SPI

Cualquier microcontrolador que vaya de los 8 a los de 32 bits utilizará al menos uno de estos protocolos, junto con los pines GPIO, para su programación y envío de señales a periféricos sencillos. Estos tres protocolos serie tienen en común que son protocolos de bus. Mientras que I2C y UART utilizan esquemas de direccionamiento, el SPI funciona sin direccionamiento. El direccionamiento del UART es según la dirección base, por ejemplo, en el puerto COM1, la dirección 0 es usualmente 3F8h y la dirección 7 es 3FFh.

Aunque SPI funcione sin direccionamiento, no deja de ser un protocolo de bus y sigue pudiendo utilizarse para seleccionar los dispositivos de bajada que van a recibir los datos.

UART

El protocolo UART, viene de las siglas en inglés ‘Universal Asynchronous Receiver-Transmitter’ (Receptor-transmisor asíncrono universal), mientras que USART son las siglas de ‘Universal Synchronous and Asynchronous Receiver-Transmitter’. La diferencia entre ellos es obvia, UART realiza solo comunicación en serie asíncrona, mientras que USART puede realizar procesos de comunicación en serie tanto síncronos como asíncronos.

Las principales características son:

  • Tiene dos líneas de datos, una para transmitir (TX) y otra para recibir (RX), que se utilizan para comunicarse a través del pin digital 0, pin digital 1.
  • TX y RX siempre están conectados entre dos dispositivos. (por ejemplo, USB y un ordenador)
  • Admite la transmisión de datos bidireccional, asíncrona y en serie.
  • También puede manejar problemas de administración de sincronización entre ordenadores y dispositivos seriales externos.

Funcionamiento

En cuanto a su funcionamiento es simple, los datos que fluyen desde TX del UART transmisor hasta el RX del UART receptor, una vez se haya conectado e iniciado la comunicación. Sin embargo, la comunicación entre dispositivos puede realizarse de 3 formas:

Símplex = transmisión de datos en una dirección.

Half-duplex = transmisión de datos en cualquier dirección, pero no simultáneamente.

Full-duplex = transmisión de datos en ambas direcciones simultáneamente.

La transmisión de UART convierte los datos en paralelo del dispositivo maestro (por ejemplo, la CPU) en forma de serie y los transmite en serie a la UART receptora. Después volverá a convertir los datos en serie en datos paralelos para el dispositivo receptor.

 

Además, al ser asíncrono, no hace uso de relojes, el direccionamiento distribuye la información adecuadamente. UART agrega bits de inicio y parada que se transfieren para representar el inicio y el final de un mensaje, ayudando así al receptor a saber cuándo comenzar y dejar de leer bits. Cuando el UART receptor detecta un bit de inicio, leerá los bits equivalentes a la tasa de BAUD definida. Esta tasa define la velocidad de transmisión de bits, la cual es similar a la de símbolos, y normalmente la velocidad viene predeterminada en 115.200 baudios.

Es importante que ambos UART tengan definida la misma velocidad en baudios, ya que si la diferencia es de más del 10% la temporización de los bits puede estar desactivada y dejar los datos inutilizables.

5

 

Protocolo

En cuanto al protocolo de trabajo de un UART su funcionamiento es el siguiente. El que primero que quiere transmitir datos, recibirá datos de un bus de datos que es enviado por otro componente (por ejemplo, la CPU). Después de obtener los datos del bus de datos, agregará un bit de inicio, un bit de paridad y un bit de parada para crear el paquete de datos. Este paquete de datos se transmite luego por el pin TX donde el UART receptor leerá el paquete de datos en su pin RX. Los datos se envían hasta que no quedan datos en el UART transmisor, y se recibe el bit de parada. 

Por tanto, cada paquete UART estará compuesto de los siguientes bits: 1 bit de inicio (nivel bajo), 8 bits de datos, incluido el bit de paridad, 1 o 2 bits de parada (nivel alto).

Existe también una bandera llamada FIFO (First Input, First Output): Primero en entrar, primero en salir. Es un búfer UART que obliga a que cada byte se pase en secuencia al UART receptor. Esta bandera tendrá el bit ‘BUSY’ (ocupado) que solo estará inactivo después de que los datos hayan terminado de transmitirse, el FIFO se vacíe y cada bit se haya transmitido, incluido el bit de parada.

Ventajas UART

  • Proporciona comunicación en serie tanto síncrona como asíncrona
  • Disponibilidad de varias velocidades en baudios, lo que la hace adecuada para aplicaciones y dispositivos amplios
  • Una de las formas más sencillas de comunicación en serie. Además es fácil de operar y está bien documentado, ya que es un método ampliamente utilizado con muchos recursos en línea.
  • No se necesita reloj
  • Bit de paridad para permitir la verificación de errores

Desventajas UART

  • Puede conectar solo dos dispositivos a la vez. No se pueden utilizar varios sistemas maestros y esclavos
  • El tamaño de la trama de datos está limitado a solo 9 bits
  • Baja velocidad de transmisión de datos.
  • Las velocidades en baudios de cada UART deben estar dentro del 10% entre sí para evitar la pérdida de datos.

Ejemplos de UART en microcontroladores

El ejemplo más típico sería un controlador de puente de USB a UART integrado. Este proporciona una solución simple para actualizar los diseños de RS-232 a USB con un mínimo de componentes y espacio de PCB. Proporciona conectividad USB a dispositivos con interfaz UART.

 Cp2102 Conventidor USB 2.0

CP2102 Convertidor USB 2.0 a serie TTL UART - Referencia C0001

I2C

El protocolo I2C, significa circuito inter-intergrado, de las siglas inglesas ‘Inter-Integrated Circuit’. Se suele pronunciar I-cuadrado C o IIC por sus siglas. Fue desarrollado por Philips Semiconductor para televisiones en los años 1980’s.

Este protocolo utiliza dos líneas para controlar otros dispositivos. La primera línea es el reloja llamado SCL (línea de reloj en serie), mientras que la otra es para datos llamado SDA (puerto de aceptación de línea de datos). Este protocolo es similar al UART, sin embargo, no se utiliza para la comunicación PC-dispositivo, sino con módulos y sensores, siendo el PC el “maestro” y el resto los llamados “esclavos”.  Estos curiosos términos podemos definirlos como:

  • Maestro: dispositivo que proporciona un reloj para la comunicación
  • Esclavo: dispositivo que no es el maestro que utiliza el reloj del maestro para comunicar

A su vez, tiene también tres modos según su velocidad:

  • Baja (< 100 Kbps)
  • Media (400 Kbps)
  • Alta (3.4 Mbps) – I2C v.2.0

I2C es un bus serie síncrono de dos cables (SDA y SCL) bidireccional simple y solo requiere dos cables para transmitir información entre los dispositivos conectados al bus. Es por tanto de tipo half-duplex. 

Typical i2C Bus

 En cuanto a la velocidad, esta depende de la velocidad de los datos, la calidad del cable y el ruido externo.

Funcionamiento

Como hemos dicho, mediante los dos cables SDA y SCL se establece la comunicación del maestro con los esclavos. El primero inicia la transferencia de datos por el bus y genera un reloj para abrir el dispositivo transferido y, cualquier dispositivo direccionado se considera un dispositivo esclavo.

La relación entre los dispositivos maestro y esclavo, transmitiendo y recibiendo en el bus no es constante. Depende de la dirección de transferencia de datos en ese momento. 

Por lo tanto, cuando es el maestro el que desea enviar datos al esclavo, primero deberá dirigirse al esclavo o esclavos antes de enviar cualquier dato.

Entonces, el maestro completará la transferencia de datos. Si el maestro desea recibir datos del esclavo, es el maestro el que debe volver a dirigirse al esclavo primero. Luego, el maestro (host) recibe los datos enviados por el esclavo y, finalmente, el receptor finaliza el proceso de recepción. 

Por otra parte, es necesario conectar la fuente de alimentación a través de una resistencia pull-up. Cuando el bus está inactivo, ambas líneas funcionan a un nivel de potencia alto.

La capacitancia en la línea afectará la velocidad de transmisión del bus. Como la potencia actual en el bus es pequeña, cuando la capacitancia es demasiado grande, puede causar errores de transmisión. Por lo tanto, su capacidad de carga debe ser de 400pF, por lo que se puede estimar la longitud permitida del bus y el número de dispositivos conectados.

Protocolo

El funcionamiento es un poco más complejo que UART, pero al final es muy parecido. El maestro envía a cada esclavo la dirección de 7 o 10 bits del esclavo y un bit de lectura/escritura al esclavo con el que desea comunicarse.

El esclavo comparará la dirección con la suya. Si la dirección coincide, el esclavo devolverá un bit ACK que cambia la línea SDA a baja por un bit. Si la dirección no coincide con su dirección, el esclavo deja la línea SDA alta.

A continuación, el maestro enviará o recibirá la trama de datos. Al acabar esta acción, la transferencia de datos, el dispositivo receptor devuelve otro bit ACK al remitente para reconocer la transmisión exitosa.

Por otro lado, para detener la transmisión de datos, el maestro envía una señal de parada al esclavo cambiando SCL alto antes de cambiar SDA alto. 

Todo esto se puede apreciar un poco mejor en el siguiente diagrama, donde vemos el inicio de la transmisión, el envío de la dirección junto con el bit de escritura o lectura (R/W) y por último el envío de los datos y la señal de parada (stop).

Protocolo

Ventajas de I2C

  • Flexible, ya que admite comunicación multimaestro y multiesclavo.
  • Soporta múltiples maestros.
  • Proporciona comunicación en serie síncrona que es mucho más confiable que la asíncrona.
  • Es la forma más rápida de comunicación en serie
  • Simple, ya que solo usa 2 cables bidireccionales para establecer comunicación entre múltiples dispositivos.
  • Adaptable ya que puede adaptarse a las necesidades de varios dispositivos esclavos, y hasta 127 distintos.
  • Tiene un recuento bajo de pines/señales incluso con numerosos dispositivos en el bus

Desventajas de I2C

  • Requiere más espacio ya que las resistencias consumen un valioso espacio de PCB.
  • Velocidad más lenta ya que requiere resistencias pull-up en lugar de resistencias push-pull utilizadas por SPI. También tiene un diseño de drenaje abierto = velocidad limitada.
  • Solo el maestro tiene control sobre todo el proceso de comunicación; no hay dos esclavos que puedan comunicarse entre sí directamente
  • Puede volverse complejo a medida que aumenta el número de dispositivos.

Ejemplos de I2C en microcontroladores

Un ejemplo de uso simple del protocolo I2C es en los sistemas Grove de la marca Seeed. Además, la mayoría de los sensores Grove tienen una función de cambio de nivel para trabajar en el voltaje adecuado.  También hay sensores y componentes más comunes que usan este protocolo, como por ejemplo las pantallas OLED.

OLED 0,96

 Pantalla OLED 0,96" 128x64 Azul I2C 4 pines - Referencia P0096

SPI

Las siglas SPI vienen del inglés “Serial Peripheral Interface” o interfaz de periféricos en serie, siendo un protocolo similar al I2C pero especialmente pensado para microcontroladores. También es usado en situaciones donde la velocidad es importante como, por ejemplo, tarjetas SD, módulos de visualización o cuando la información se actualiza y cambia rápidamente como termómetros.

Este protocolo de comunicación serial es de tipo serie de tipo síncrono y consta de dos líneas de datos (MOSI y MISO), una línea de reloj (SCK) y una línea de selección esclava (SS). Estas líneas tienen las siguientes funciones: 

  • MOSI: Master Output Slave In - Salida del maestro entrada del esclavo (línea a través de la cual el maestro envía datos a sus esclavos)
  • MISO - Master In Slave Out – Entrada del maestro salida del esclavo (línea a través de la cual los esclavos responde al maestro)
  • SCK - Serial Clock (reloj proporcionado por el dispositivo maestro)
  • SS - Slave Select (línea utilizada para seleccionar el esclavo con el que el maestro desea comunicarse)

Funcionamiento

Por lo general es un protocolo más rápido que el I2C debido a que es más simple.

Existen dos modos de comunicarse con este protocolo:

  • En un primer modo, si se utiliza un único dispositivo controlador para activar un único dispositivo de bajada, se trata simplemente de una topología punto a punto. Seleccionar cada dispositivo con una línea Chip Select, por lo que se necesita una línea de selección de chip separada para cada dispositivo. Esta es la forma más común en que los Raspberry Pi utilizan actualmente SPI, por ejemplo. La activación de varios dispositivos depende del número de salidas de selección de chip que proporcione el controlador (modo estándar). 
  • El segundo modo utiliza la conexión en cadena margarita, en la que una única salida de selección de dispositivo activa sucesivamente cada uno de los dispositivos de la propia cadena margarita.

 

Por lo tanto, no hay límite para la cantidad de dispositivos SPI que se pueden conectar. Sin embargo, existen límites prácticos debido al número de líneas de selección de hardware disponibles en el dispositivo principal (el máster) con el método de selección de chip o la complejidad de pasar datos a través de dispositivos en el método de conexión en cadena.

 

Conexión en modo estándar

 

Conexión modo “margarita”

Protocolo

Este protocolo precisa un poco más de complejidad hardware que el sistema I2C cuando se requiere de múltiples esclavos, ya que cada esclavo requiere una señal de habilitación separada.

La interfaz SPI son en realidad dos registros de desplazamiento simples en el hardware interno. Los datos transmitidos son de 8 bits y se transmiten bit a bit bajo la señal de habilitación del esclavo y el pulso de cambio generado por el dispositivo maestro. El bit alto está en el frente y el bit bajo está en la parte posterior.

La interfaz SPI es una transmisión de datos en serie sincrónica entre la CPU y el dispositivo periférico de baja velocidad. Bajo el pulso de cambio del dispositivo maestro, los datos se transmiten bit a bit. El bit alto está en el frente y el bit bajo está en la parte posterior.

Es una comunicación full-duplex y la velocidad de transmisión de datos es en general más rápida que la del bus I2C ya que puede alcanzar velocidades de unos pocos Mbps.

 

Ventajas de SPI

  • Es el protocolo más rápido en comparación con UART e I2C.
  • El protocolo es simple ya que no existe un sistema de direccionamiento esclavo complicado como I2C.
  • Proporciona comunicación en serie síncrona que es mucho más confiable que la asíncrona.
  • Líneas MISO y MOSI separadas, lo que significa que los datos se pueden transmitir y recibir al mismo tiempo
  • Sin bits de inicio y parada a diferencia de UART, lo que significa que los datos se pueden transmitir de forma continua sin interrupciones

Desventajas de SPI

  • Utiliza cuatro líneas: MOSI, MISO, CLK, NSS
  • Se ocupan más puertos Pin, por lo que es un límite práctico para varios dispositivos.
  • No se especifica ningún control de flujo y ningún mecanismo de reconocimiento confirma si los datos se reciben a diferencia de I2C
  • Solo 1 maestro y además solo el maestro tiene control sobre todo el proceso de comunicación; no hay dos esclavos que puedan comunicarse entre sí directamente
  • No hay forma de verificación de errores a diferencia de UART (usando bit de paridad)

Ejemplos de SPI en microcontroladores

Como hemos dicho, es la forma más común de comunicación series d las Raspberry Pi, por lo que los dispositivos que están basados en esta plataforma usan SPI. Pero también dispositivos más simples que busquen la gran velocidad que ofrece, como por ejemplo módulos para conectividad Ethernet.

Modulo W5500 Lite ethernet 

Módulo W5500 Lite Ethernet Network SPI - Referencia W0107

Conclusión y resumen

Entonces, ¿cuál es el mejor periférico o protocolo de comunicación serie? Desafortunadamente, no existe un "mejor" periférico de comunicación. Como hemos visto cada periférico de comunicación tiene sus propias ventajas y desventajas, por lo que cada usuario debe elegir según sus necesidades. Habrá alguno que se adapte más a tu proyecto o simplemente porque ese lo tengas más a mano o controlado que otro. Por ejemplo, si un usuario quiere conectar muchos dispositivos sin que sea demasiado complejo, I2C será la elección ideal, ya que puede conectar hasta 127 dispositivos y es fácil de administrar. Por otro lado, si desea el periférico de comunicación más rápido, SPI sería la elección ideal.

Por último, todo se entiende mejor con una tabla resumen visual, donde queda mejor resumido.

 

Fuentes:

http://www.itq.edu.mx/carreras/IngElectronica/archivos_contenido/Apuntes%20de%20materias/ETD1022_Microcontroladores/4_SerialCom.pdf

https://www.seeedstudio.com/blog/2019/09/25/uart-vs-i2c-vs-spi-communication-protocols-and-uses/

https://electronoobs.com/eng_circuitos_tut36.php

https://www.rfwireless-world.com/Terminology/UART-vs-SPI-vs-I2C.html

https://resources.altium.com/es/p/i2c-vs-spi-vs-uart-how-layout-these-common-buses

https://es.wikipedia.org/wiki/Serial_Line_Internet_Protocol

https://es.slideshare.net/TethAzraelCortsAguilar/protocolo-comunicacin-serial

Share