Bus I2C de Raspberry Pi I

@cmdearcos
Grupo TIECs

¿Qué es el bus I2C?. Empezaremos diciendo que I2C significa “Inter Integrated Circuits”.

Este bus fue desarrollado por la empresa Philips Semiconductors (ahora nxp semiconductors) a principios de los 80´s. Aquí os dejo las especificaciones del bus y el manual de usuario de fecha de 9 de octubre de 2012.

Este bus tiene una topología maestro-esclavo. En este caso el maestro es nuestro Raspberry pi (y los esclavos una multitud de dispositivos y sensores que podéis conseguir en el mercado). A continuación podéis ver un esquema del bus.

 

i2c_diagram

Las transferencias de datos se llevan a cabo mediante la línea serie de datos SDA. La línea SCL lleva la señal de reloj que sincroniza los datos de la línea SDA.

El dispositivo maestro (microcontrolador, en nuestro caso Raspberry pi) es quien siempre tiene la iniciativa de la comunicación. El maestro genera la señal de reloj y controla cuando se transmiten o reciben los datos.

Puede haber varios esclavos en la red I2C, pero el maestro solo se comunica con uno a la vez con un protocolo de pregunta/respuesta. Para poder localizar a cada dispositivo es necesario que cada uno tenga una dirección única dentro del bus.

En terminología I2C los datos se organizan en transferencias. Las transferencias comienzan con una señal de START y termina con otra de STOP. Los datos tienen una longitud de 1 byte y terminan con bit de ACK (o NACK). A continuación podéis ver una transferencia en la siguiente figura:

trama ack

Una condición START es una transición de Alto a Bajo en la línea SDA cuando SCL está en Alto. Después de Start el bus se considera ocupado.

Una condición STOP es una transición de Bajo a Alto en la línea SDA mientras SCL está en Alto. Después de Stop las dos líneas están en Alto y el bus se considera libre.

Siendo una comunicación serie donde cada dato por la línea SDA esrá sincronizado con el reloj, es este último quien marca la velocidad de transmisión. Una velocidad de 100 kbits/s implica que cada bit se transmite en 1s/100k = 10µs. Estos datos se detallan en el Estándar I2C y también suelen ir indicados en los datasheets de los dispositivos I2C.

El estándar del bus I2C soporta cuatro modos de operación:

  • Standard Mode, con una velocidad de hasta 100 kbit/s.
  • Fast mode, con una velocidad de hasta 400 kbit/s.
  • Fast mode plus, con una velocidad de hasta 1 Mbit/s.
  • High-speed mode, con una velocidad de hasta 3.4 Mbit/s.

Ahora pasamos a configurar nuestro Raspberry para poder programar aplicaciones donde se comuniquen diferentes dispositivos.

¿Dónde se encuentra el bus I2C en nuestra Raspberry?. Se encuentra en nuestra en el pin 3 (SDA) y el pin 5 (SCL).

Para poder acceder desde un programa en C es necesario instalar la librería wiringPi.

wiringPi se mantiene bajo GIT, por ello, si no está instalado es necesario instalarlo. Si este fuera el caso, lo podéis instalar con el siguiente comando:

sudo apt-get install git-core

Si este comando diera error es aconsejable actualizar el Raspbian a la última versión disponible. Para ello ejecutad:

sudo apt-get update

sudo apt-get upgrade

Una vez instalado GIT es necesario descargarse la librería wiringPi:

git clone git://git.drogon.net/wiringPi

Este comando creará el directorio en el directorio actual llamado wiringPi donde se encuentra la librería. Para poder utilizarla es necesario “construirla”:

cd wiringPi

./build

Una vez ejecutado el script de construcción podemos comprobar que se ha instalado adecuadamente con los siguientes comandos:

gpio -v

gpio readall

Una vez instalada la librería debemos instar las i2c-tools:

apt-get install i2c-tools

Para poder acceder a la librería en un primer momento podemos ejecutar el siguiente comando:

gpio load i2c

En el caso de los que los dispositivos esclavos lo permitieran se puede poner la velocidad del bus a 400 kbps de la siguiente forma:

gpio load i2c 400

Para que se cargue el modulo i2c una vez que arranque el sistema es necesario incluir los módulos i2c-bcm2708 y i2c-dev en el fichero /etc/modules y por otro lado comentar las entradas con un # del fichero /etc/modprobe.d/raspi_blacklist.conf:

  • blacklist spi-bcm2708
  • blacklist i2c-bcm2708

Una vez cargados los modulos de I2C se podrá ejecutar el siguiente comando donde nos muestra la dirección del dispositivo conectado a nuestra bus (si es que tenemos alguno):

  • i2cdetect -y 0 (para la Rev 1)
  • i2cdetect -y 1 (para la Rev 2)

Aquí os dejo la salida de mi Raspberry donde tengo conectado un esclavo con dirección 0x39.

Ahora ya tenéis vuestra Raspberry preparado para empezar a utilizar el bus I2C en vuestros programas.

@cmdearcos
Grupo TIECs

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *