Usando el protocolo I2C en comunicación con varios picaxe

Este documento originalmente lo publiqué en el foro ucontrol el 30 de enero de 2011, ahora lo posteo aca en mi blog.

El protocolo I2c (Inter-Integrated Cirtuit) fue desarrollado por Phillips, y es una interfaz que consiste en un bus de 2 líneas (reloj (scl), data (sda)), la versatilidad de este protocolo es que se pueden aplicar unas 128 asignaciones (osea podríamos agregar 128 dispositivos a esas 2 líneas de transmisión). Se diseño este protocolo con la finalida de comunicar varios integrados en una placa de circuito impreso.

La mayoría de dispositivos I2C se diseñan de 8 pines por lo que hace que sea muy factible en un diseño de circuito impreso. Hay 4 datos de configuración que debemos tener claro:

  • Dirección de esclavo: cada dispositivo debe tener una dirección distinta, es de una longitud de 7 bits y un octavo que es reservado para indicar si es escritura o lectura
  • Velocidad de bus: La mínima es de 100khz y la máxima de 400khz y algunos dispositivos solo trabajan a 100 Khz
  • Tamaño de dirección de registo: todos los datos enviados del maestro al esclavo son ESCRITURA, los de esclavo a maestro son LECTURA. Cuando el maestro o el esclavo tranmite ellos hacen las líneas del bus 0.
  • Buffer de escritura de página: Las memorias eeprom tienen un tiempo de escritura de 5 a 10ms, para evitar un retraso de escritura poseen un buffer que puede aceptar más de un bit al mismo tiempo, asi que si recibe 90 bytes no se tardaria 90ms sino que reduciría aproximadamente a 10ms de escritura
 
Así que con esta información podemos empezar la comunicación y unas pequeñas practicas de I2C: estas prácticas fueron realizadas con 2 20X2, conectando sus pines sda y slc y agregandole 2 resistencias de 4.7k como pull up. El pic o el dispositivo i2c que sera conectado debe poseer una dirección ej: %10100000, algunos dispositivos deben ser revisada en su hoja de datos la dirección recomendada para i2c, los desarrolladores de picaxe nos recomienda que si no sabemos que dirección colocar podemos usar %10100000, asi que empezamos:

comando hi2csetup:

      hi2csetup i2cmaster, direcciondelesclavo, modo, largodedirrección

En modo pueden escoger la velocidad máxima o mínima (i2cslow 100khz o i2cfast 400khz), deben ver la hoja de datos del dispositivo para ver a que velocidad pueden trabajar.

Largo de dirección: depende del dispositivos que usemos, si utiliza 8 bits (byte) o 16 (word), por ejemplo las eeprom 24lCxxB se debe usar un i2cbyte pero para eepro mayores se utiliza i2cword.

ej:
     hi2csetup i2cmaster, %10100000, icsolw, i2cbyte

El siguiente ejercicio mandara dos datos binarios al pic esclavo.


hi2csetup i2cmaster, %10100010, i2cslow, i2cbyte
b0 = 1
main:
 if b0 = 1 then
  hi2cout 0,(b0)
  b0 = 2
  pause 150
 endif
 if b0 = 2 then
  hi2cout 0,(b0)
  b0 = 1
  pause 150
 endif
goto main

El siguiente código es el pic esclavo el cual con los datos binarios invertirá el estado de dos de sus pines. Cuando recibe un dato por i2c el esclavo se activará su bandera hi2cflag, luego de activarse debe de restablecerse la bandera con hi2cflag = 0. 

Para configurar el pic esclavo se utiliza la siguiente sentencia:

hi2csetup i2cslave, direccion ej:      hi2csetup i2cslave, %10100010

hi2csetup i2cslave, %10100010
main:
 if hi2cflag = 0 then main
 hi2cflag = 0
 get hi2clast,b1
 if b1 = 1  then
  toggle c.0
 end if
 if b1 = 2 then
  toggle c.1
 end if
goto main

Ahora vamos a LEER un dato del pic esclavo por medio del pic maestro.

Empezaremos con el código del pic esclavo, para esto debemos tener en cuenta que el protocolo i2c no utiliza como lectura las variables b1, b2, etc. si no utiliza lo que es el SCRATPAD (pueden verlo en la pagina 12 del segundo manual de picaxe) para el pic 20x2 tengo la opcion de usar de 0 a 127 bytes en el scratchpad, el scratchpad es una memoria temporal para almacenar datos como arreglos, el cual usa el comando PUT (grabar) Y LET (leer).

En este ejemplo el pic grabará el valor de una entrada analógica en b5 y lo colocará en el scratpad.


hi2csetup i2cslave, %10100010
main:
 readadc 3, b5
 put 2,b5
goto main

 

El pic maestro solo debe de agregarse el comando hi2cin, seguido por el bloque en donde esta el scratchpad que en este caso es 2 y almacenarlo en una variable para luego mandarlo a la pc.

 

hi2csetup i2cmaster, %10100010, i2cslow, i2cbyte
main:
      hi2cin 2,(b1)
      sertxd ("data: ",#b1,13,10)
goto main

 

NOTA: observa que ahora en estos ultimos dos ejemplos le cambié la dirección al picaxe esclavo. 


Ahora supongamos que tengo 3 picaxe conectados en i2c, dos son esclavos y uno maestro, si la direcciones de los esclavos son : %10100000 y % 10100010 y el maestro quiere leer en ambos una entrada analogica digital (usaremos para los esclavos el mismo codigo para el esclavo del ejemplo anterior solo hay que cambiar las direcciones para cada pic). El código del maestro sería: 



hi2csetup i2cmaster, %10100000, i2cslow, i2cbyte
main:
 hi2cin [%10100000],2,(b1)
 sertxd ("data: ",#b1,13,10)
        pause 15
 hi2cin [%10100010],2,(b3)
 sertxd ("data: ",#b31,13,10)
goto main

Como verás el uso del i2c es muy fácil e intuitivo, debes tener en cuenta cada uno de los aspectos mencionados, puedes probarlos cambiandoles la velocidad a fast, espero que esta pequeña guia de cortos ejercicios te aclare la mente en la implementación del protocolo I2c comunicando 2 o más picaxes en su bus.