Expansión de GPIOs por I2C

Hace tiempo que pedí samples a Microchip de un circuito que me pareció interesante un expansor de BUS I2C de 16 bits (MCP23017)… Entre viajes y estudios no tuve tiempo de ponerme a montar nada hasta que anoche pensando en lo que podría hacer con la LCD me acorde de él, así que me puse a mirar su cortísimo datasheet. Así que hoy ha salido esto:

Aquí tenéis un pequeño Manual del uso básico de este circuito.

13/08/2008 – Añado librería Eagle del MCP23017.

En resumen el circuito y es una expansor I2C con las siguientes características:

Posibilidad de configurar 8 direcciones, permitiendo interconectar 8 módulos, lo que serían 128 IO’s.

Interface I2C de alta velocidad, 100 kHz, 400 kHz y 1.7MHz.

Dos salidas de interrupción por cambio de estado configurables.

Posibilidad de inversión en el modo de entrada.

Reset externo.

Sobre el hardware necesario casi ninguno, configurar las 3 entradas de dirección en la dirección que deseemos alimentarlo y conectarlo a nuestro bus I2C.

La programación se resume en 2 posibilidades. Usar el banco 0 (Activa por defecto) en la cual tendremos los bytes de control de los puertos correlativos:

Tabla de registros del Banco0

O bien usar el banco 1 de modo que tendremos primero las direcciones correspondientes a los 8 primeros bits y a continuación la correspondiente a los otros ocho bits:

Tabla de registros del Banco1

A la hora de escribir en el tendremos que tener en cuenta dos factores, la dirección del dispositivo que se compone con la siguiente secuencia:

0  1  0  0  A2  A1  A0  R/W

Por ejemplo si hemos configurado todas las entradas de dirección a positivo y vamos a proceder a escribir en el dispositivo usariamos: 0b01001110 o lo que es lo mismo 0x4E o 78 en Decimal.

Después de escribir ese byte tendremos que escribir la dirección del registro a la que queramos acceder, por ejemplo la configuración como entrada o salida del puerto A, IODIRA: Dirección 0×00.

Aquí es donde tenemos que tener encuenta otro factor importante el tipo de avanze que tengamos configurado en el registro IOCON en concreto el bit 5: SEQOP, por defecto vale 0 de forma que si mandamos otro byte el puntero se habra despazado y escribiremos en el siguiente registro, siguiendo nuestro ejemplo estariamos escribiendo en IODIRB (Dirección 0×01). Si activamos el bit de SEQOP y mandamos otro bit estariamos volviendo a escribir en IODIRA.

Bueno, con esto ya estamos preparados para entender el siguiente codigo ejemplo de escritura escrito en CCS:

#use i2c(master, slow, sda=PIN_C1, scl=PIN_C2) //Configuramos el bus I2C

i2c_start(); //condición de inicio
i2c_write(78); //escribimos la dirección del dispositivo
i2c_write(00); //escribimos la dirección del registro
i2c_write(00); //configuramos el registro IODIRA como todo salida.
i2c_write(00); //configuramos el registro IODIRB como todo salida.
i2c_stop(); //condición de parada

i2c_start();
i2c_write(78); //Expansor de GPIO
i2c_write(0×12); //Reg. Puerto A
i2c_write(0×55); //Escribimos 01010101
i2c_write(0xAA); //Escribimos 10101010 (Con el avanze del puntero escribimos en Reg. Puerto B
i2c_stop();

Notas: La configuración del bus I2C he usado el modo lento pero admite el modo rapido sin problemas, basta con poner Fast. Los puertos del Pic que yo he usado no forman parte del Hardware I2C así que los genera por software, en caso de usar puertos con hardware I2C y querer usarlo deberemos añadir: “NOFORCE_SW” Normalmente los dos primeros bloques se colocarian en la configuración (la directiva de #USE y la configuración como Salidas) y el tercer bloque en el codigo de “uso del hardware”.

Actualizo este articulo añadiendo una librería para EAGLE que acabo de hacer, es solo del expansor por I2C si alguien quiere seguir trabajando con ella y hacer la parte del SPI adelante.

LIBRERÍA MCP23X17 ( Download Cadsoft Eagle library MCP23X17.lbr )

Y bueno esto es todo lo que tengo por el momento.

Entradas relaccionados:

  1. Radiomodem EasyRadio.
  2. Control remoto por infrarojos.
This entry was posted in Circuitos, PICs and tagged , , , . Bookmark the permalink.

3 Responses to Expansión de GPIOs por I2C

  1. Mif says:

    Que bueno tio, no me habia leido esta entrada, y me ha parecido muy sencillo de usar, la verdad es que he tenido malas experiencias con los expansores de puertos de Philips, a ver si puedo hace algo antes de irme… aunque no creo…

  2. Te atreverías a hacerlo como módulo de la entrenadora?

    S2

    Ranganok Schahzaman

  3. Pingback: RoBoOpS » Blog Archive » Expansor de GPIOs I2C, PCB.

Deja un comentario

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

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>