Introducción a los buses de comunicación

Una de las cosas mas importantes es la comunicación con los distintos perifericos que podríamos utilizar en conjunto con el microcontrolador (sensores, memorias externas, etc). En esta página daremos una pequeña introducción a los buses seriales más conocidos. Cuando hablemos de interfaces 2-wire o 3-wire nos referiremos al número de lineas de control. Adicionalmente a estas líneas de control generalmente necesitaremos una tierra común, la cual puede ser el plano de tierra del circuito impreso (PCB) o un cable distinto si comunicamos 2 tarjetas alimentadas en forma independiente.Los buses seriales son ampliamente utilizados para comunicar microcontroladores con memorias EEPROM, conversores A/D y muchos otros perifericos. Los sistemas de buses seriales también son ampliamente utilizados para implementar buses de control dentro de equipos como televisores, equipos de música y teléfonos celulares.La mayor ventaja de utilizar buses seriales es el pequeño número de cables necesarios para establecer la comunicación. La mayor desventaja es la compensación entre la velocidad de comunicación y el número de líneas que utilizaremos. Los procesadores puede gastar mucho tiempo en la comunicación con un dispositivo serial, en consecuencia es difícil encontrar dispositivos con tasas de transferencias mayores a 500kbps.

El Bus I2C

La sigla I2C viene de “Inter Integrated Circuit bus”. I2C es un tipo de interfaz serial standar que utiliza 2 cables, la cual fue definida por Philips Semiconductors al comienzo de los 80’s. Su proposito fue proveer una forma fácil de comunicación entre un CPU y los perifericos en una TV. El BUS físicamemte consiste en 2 cables activos y un cable adicional para la conexión a tierra. Los cables activos SDA (Serial DAta line) y SCL (Serial Clock Line) son ambos bi direccionales.

La ventaja de este bus es que sólo necesita de 2 lineas (clock y data) para una comunicación full duplex entre multiples dispositivos. La interfaz típicamente corre a bajas velocidades (100kHz a 400khz) Con I2C, cada dispositivo en el bus tiene una dirección de memoria única. El dispositivo puede trabajar como receptor y/o transmisor dependiendo de como haya sido configurado.

El bus I2C fue implementado para maximizar la eficiencia del hardware y la simplicidad del circuito. La interfaz I2C es una simple interfaz maestro/esclavo. Como se mencionó anteriormente la simplicidad del bus radica en el diseño de 2 cables (SDA y SCL) y el formato del protocolo. La comunicación bidireccional se ve facilitada ya que las líneas tienen solo dos estados; active-low o passive-high. El protocolo del bus I2C soporta detección de colisiones, sincronización de reloj y hand-shaking para multiples dispositivos conectados en el bus. El reloj es siempre generado por la unidad maestra, pero el esclavo puede mantener la línea abajo para generar un estado de espera. En la mayoría de los sistemas en donde se utilizan microcontroladores, éste es el maestro y los dispositivos externos son los esclavos.

El máximo número de unidades que pueden conectarse en un bus I2C está definido por la máxima capacitancia de la línea; 400pF, y el límite de 16k para la dirección del dispositivo; la capacitancia típica de un dispositivo es de 10pF. El protocolo I2C tiene 127 direcciones disponibles. La visión original fue asignar direcciones de acuerdo a la funcionalidad del dispositivo, pero cuando Philips comenzó a vender microcontroladores con I2C, la dirección podía ser programada, eliminando la necesidad de que Philips asignara una dirección válida.

El dispositivo que controla la transferencia controlando el reloj es llamado maestro y el dispositivo que es controlado por el maestro es llamado esclavo. El maestro puede transmitir o recibir señales desde o hacia un esclavo o controlar el reloj para que dos esclavos puedan comunicarse entre si. El bus I2C soporta más de un maestro conectado al mismo bus.

Para comenzar la comunicación el dispositivo maestro (típicamente un microcontrolador) pone en el bus la dirección del dispositivo con el que se quiere comunicar. Todos los dispositivos monitorean el bus para determinar si el maestro esta enviando su dirección. Solo el dispositivo con la dirección correcta puede comunicarse con el maestro.

El dispositivo maestro I2C es generalmente implementado como un controlador independiente el cual está integrado en un microcontrolador (implementación por hardware). También se puede implementar por software programandolo en un microcontrolador. Ambas opciones son perfectamente posibles en un bus típico, pero los sistemas multi-master son generalmente implementados en hardware ya que es muy dificultoso controlar el timing del bus por software.

Los datos pueden ser transferidos a una velocidad que supera los 100kbps en el modo standard y sobre los 400kbps en el modo Fast, y sobre 3.4Mbps en el modo High Speed. En el modo Standard se utilizan 7-bit para la direccionar los dispositivos en los otros modos los dispositivos esclavos pueden utilizar 7 o 10bits.

Para más información sobre el bus I2C te recomendamos leer los siguientes tutoriales: Protocolo I2C (Inter Integrated Circuit), Interfaz de un LCD I2C con Arduino

Bus SPI

El bus SPI es una interfaz serial 4-wire utilizada por muchos microprocesadores y chips perifericos. El Serial Peripheral Interface (SPI) es la forma standard de transmitir datos asincornos en microprocesadores Motorola. Provee soporte para redes de bajo y medio ancho de banda (1 Megabaud) entre aquellos dispositivos que soportan el protocolo.

El bus SPI es basicamente una interfaz asíncrona simple para conectar dispositivos externos de baja velocidad usando una cantidad mínima de cables. Este bus fue definido por Motorola en la línea de microcontroladores MC68HCxx. Un reloj asíncrono pone datos seriales desde y hacia el microcontrolador en bloques de 8 bits. El SPI es típicamente utilizado en dispositivos mobiles.

Este bus es también del tipo maestro/esclavo. Cuando dos dispositivos se comunican, uno será el maestro y el otro el esclavo. El maestro maneja el reloj. Cuando se utiliza SPI, los datos son simultaneamente transmitidos y recibidos esto establece una comunicación full-duplex.

Los nombres que Motorola asignó a las señales son los siguientes:

SCLK para el reloj, el cual es siempre manejado por el dispositivo maestro
MISO Master In Slave Out data.
MOSI Master Out Slave In data.
CS Chip Select, la cual si es utilizada permite seleccionar distintos dispositivos conectados a un mismo bus. Cada dispositivo conectado al bus necesita su propia señal CS. Por ejemplo si se tienen 10 dispositivos conectados al mismo bus, entonces es necesario utilizar 10 líneas de CS distintas, además de las líneas compartidas del reloj SCLK y las de datos MISO y MOSI.

Para más información sobre el bus SPI te recomendamos leer el siguiente tutorial: Protocolo SPI (Serial Peripheral Interface),

Microwire

Microwire es una interfaz serial standard definida por National Instruments. El protocolo Microwire es escencialmente un subconjunto del bus SPI

Maxim 3-Wire

La interfaz Maxim 3-wire se puede encontrar en dispositivos como el DS1620 y algunos otros IC’s de Maxim. Los datos que fluyen desde y hacia el DS1620 son multiplexados en solo una línea (DQ) mientras que en SPI se utilizan 2 líneas distintas(MISO y MOSI).

Maxim/Dallas 1-Wire

El bus 1-wire fue desarrollado por Dallas/Maxim. Este permite utilizar solo 1 cable con la señal la cual lleva tanto los datos como la alimentación esto permite reducir los costos de los dispositivos y simplificar la transferencia de datos. Un solo cable es necesario adicionalmente de la tierra del circuito. Una red típica es construida utilizando un cable para alimentación y datos y una línea de tierra. El sistema es sensible al timing de las señales para su correcta operación.

Una gran variedad de sensores, dispositivos de control, iButtons y memorias que utilizan esta interfaz estan disponibles hoy en el mercado.

Puedes revisar el siguiente tutorial para ver un ejemplo de como conectar un dispositivo one-wire a un arduino: ¿Cómo conectar un sensor de temperatura DS18b20 a Arduino?