Más acerca de I/O

(I²C)

I²C es un bus de comunicaciones en serie. Su nombre viene de Inter-Integrated Circuit (Inter-Circuitos Integrados). La versión 1.0 data del año 1992 y la versión 2.1 del año 2000, su diseñador es Philips. La velocidad es de 100 kbit/s en el modo estándar, aunque también permite velocidades de 3.4 Mbit/s. Es un bus muy usado en la industria, principalmente para comunicar microcontroladores y sus periféricos en sistemas integrados (Embedded Systems) y generalizando más para comunicar circuitos integrados entre si que normalmente residen en un mismo circuito impreso.

La principal característica de I²C es que utiliza dos líneas para transmitir la información: una para los datos y por otra la señal de reloj. También es necesaria una tercera línea, pero esta sólo es la referencia (masa). Como suelen comunicarse circuitos en una misma placa que comparten una misma masa esta tercera línea no suele ser necesaria.

Varios competidores, tales como Siemens AG (posteriormente Infineon Technologies AG, empresa de comunicaciones móviles de Intel), NEC, Texas Instruments, STMicroelectronics (antes SGS-Thomson), Motorola (más tarde Freescale), y Intersil, introdujeron productos compatible I²C al mercado a mediados de 1990.

Desde el 10 de octubre del 2006, no hay obligación de aplicar derechos de licencia al protocolo I²C. Sin embargo, aún se requieren cuotas para obtener direcciones esclavas I²C asignadas por NXP.

Observación interesante

SMBus, definido por Intel en 1995, es un subconjunto de I²C que define los protocolos de forma más estricta. Uno de los propósitos de SMBus es promover la robustez e interoperabilidad. En consecuencia, en la actualidad I²C incorpora sistemas de políticas y normas de SMBus, a veces apoyando tanto I²C y SMBus, que sólo requiere la reconfiguración mínima.

I²C en el robot Erle

El robot educacional Erle incluye 3 I²C buses disponible bajo /dev: /dev/i2c-0, /dev/i2c-1 and /dev/i2c-2.


/dev/i2c-2 por defecto no está activada. Para activarlo debe escribir:

echo BB-I2C1 > $SLOTS

Usted puede verificar que ha sido activado al escribir:

cat $SLOTS

Inspeccionando I²C

Una buena herramienta para inspeccionar el bus I²C es el comando de bash i2cdetect:

i2cdetect -r 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1 using read byte commands.
I will probe address range 0x03-0x77.
Continue? [Y/n] 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- 13 -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

Este comando envía un ping al rango 0x03 - 0x77 (en hexadecimal) y registra las respuestas en todas las direcciones por lo tanto es capaz de averiguar si hay algún dispositivo. En particular, podemos ver que las respuestas de las direcciones 0x13 y 0x68 que corresponden a la IR y el sensor IMU respectivamente.

Crear instancias de dispositivos I²C desde el espacio de usuario

El kernel de Linux también permite configurar manualmente los dispositivos I²C a través de una interfaz de sysfs:

En general, el núcleo debe saber qué dispositivos I2C están conectados y en qué dirección están. Sin embargo, en ciertos casos no lo hace, por lo que un interfaz sysfs se añadió para que el usuario proporcione la información. Este interfaz es de 2 archivos de atributos que se crean en cada bus I2C Directorio: new_device y delete_device, ambos archivos son de sólo escritura y deben escribir los parámetros correctos con el fin de crear una instancia adecuada en un dispositivo I2C.

El archivo new_device tiene 2 parámetros: el nombre del dipositivo I2c (una cadena) y la dirección del dispositivo I2C (un número expresado en hexadecimal empezando por 0x, pero también puede ser expresado en decimal.

El archivo delete_device toma un único parámetro: la dirección del dispositivo I2C. Como no hay dos dispositivos pueden estar en la misma dirección en un I2C dado un segmento, la dirección es suficiente para identificar de forma exclusiva el dispositivo para que sea borrado.

Ejemplo:
echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

Mientras que esta interfaz sólo debe utilizarse cuando la declaración del núcleo del dispositivo no se puede hacer, hay una variedad de casos en los que puede ser útil:

  • El controlador I2C normalmente detecta los dispositivos (método 3 anterior ), pero el segmento del bus de su dispositivo sigue vivo no tiene el conjunto adecuado de bits de clase y así la detección no se dispara .
  • El controlador I2C normalmente detecta los dispositivos, pero el dispositivo está en una dirección inesperada .
  • El controlador I2C normalmente detecta los dispositivos, pero no se detecta el dispositivo, ya sea porque la rutina de detección es demasiado estricta, o porque su dispositivo no está soportado oficialmente todavía, pero sabes que es compatible.
  • Está desarrollando un conductor en un tablero de prueba, donde suelda el dispositivo I2C usted mismo .

Esta interfaz es un reemplazo para los parámetros Force_ * que algunos drivers del módulos I2C implementan. En ejecución de i2c -core en lugar de en cada controlador de dispositivo de forma individual, es mucho más eficiente, y también tiene la ventaja de que usted no tiene que volver a cargar el controlador para cambiar un ajuste. También puede crear una instancia del dispositivo antes de que el controlador se carga o incluso disponibles, y usted no necesita saber qué driver necesita el dispositivo.

Considerando esto, se puede instanciar el sensor (hih6130) conectado a /dev/i2c-1 y con la dirección 0x27 ofrecerá:

echo hih6130 0x27 > /sys/bus/i2c/devices/i2c-1/new_device

Después de esto, el dispositivo estará listo bajo /sys/bus/i2c/drivers/hih6130/1-0027.

Para retirar el dispositivo que se pueda utilizar:

echo 0x27 > /sys/bus/i2c/devices/i2c-1/delete_device

Fuentes

results matching ""

    No results matching ""