Sei sulla pagina 1di 4

5.9.11.

COMUNICACIÓN SERIAL SICRÓNICA I²C.

Muchos de los dispositivos electrónicos que se encuentran comúnmente en una tarjeta electrónica, incluyen circuitos integrados con el bus I²C desarrollado por PHILIPS, como por ejemplo las memorias 24CXX, los procesadores de señal, codificadores de video, sensores de temperatura, RTC (reloj en tiempo real), sensores ultrasónicos, etc. El bus I²C (Inter Integrated Circuit) o interconexión de circuitos integrados necesita sólo 2 líneas para transmitir y recibir datos, estos son: para datos (SDA) y para la señal de reloj (SCL), esta forma de comunicación utiliza una sincronía con un tren de pulsos que viaja en la línea SCL, de tal manera que en los flancos negativos se revisan los datos RX o TX. Ver figura 5.9.12.2., su velocidad de transmisión pueden ser de 100Kbits/seg. en el modo standard, 400Kbits/seg. en el modo rápido y 3,4Mbits/seg. en alta velocidad. Cada dispositivo conectado al bus tiene un código de dirección seleccionable mediante software, por lo que existe una relación permanente Master/Slave. El Master es el dispositivo que inicia la transferencia en el bus y genera la señal de reloj (SCL), y el Slave es el dispositivo direccionado, sin embargo cada dispositivo reconocido por su código (dirección), puede operar como transmisor o receptor de datos, ya que la línea (SDA) es bidireccional.

5.9.12. COMUNICACIÓN I²C CON UNA MEMORIA SERIAL 24LC04B.

Esta es una práctica muy básica para aprender sobre la interfaz I²C, consiste en guardar datos en las cuatro primeras direcciones de la memoria serial, estas son utilizadas para el almacenamiento de datos que pueden ser necesitados más adelante. Para el caso de la memoria 24LC04B tiene un espacio de memoria de 4Kbytes, luego de almacenarlos los volveremos a leer y mostrar en la pantalla de un LCD.

       

Dirección

Cantidad de disposit. en el bus

Voltaje

Referencia

Capacidad

Ciclos de

Bloques

     

de

     
   

E/W

internos

A0

A1

A2

operación

24LC01B

1K bits

1,000.000

1

1-0

1-0

1-0

8

2,5-5,5V.

24LC02B

2K bits

1,000.000

1

1-0

1-0

1-0

8

2,5-5,5V.

24LC04B

4K bits

1,000.000

2

X

1-0

1-0

4

2,5-5,5V.

24LC08B

8K bits

1,000.000

4

X

X

1-0

2

2,5-5,5V.

24LC016B 16K bits 1,000.000 8 X X X 1 2,5-5,5V.
24LC016B
16K bits
1,000.000
8
X
X
X
1
2,5-5,5V.

Figura 5.9.12.1. Tabla de las capacidades de las memorias EEPROM y su direccionamiento, en nuestro caso sólo podemos poner hasta 4 memorias seriales en una red I²C.

El principio de funcionamiento es el siguiente: primero se envía el start bit (bit de arranque) cada palabra puesta en el bus SDA debe tener 8 bits, la primera palabra transferida debe contener la dirección del esclavo seleccionado, en este caso se envía el código de la memoria 1010 (este dato lo suministra el fabricante), luego la dirección del dispositivo (A2, A1, A0), y un bit 0 indicando que se desea escribir en la memoria (1=lectura), luego de todo esto la memoria debe enviar un reconocimiento para informarle al microcontrolador que recibió la información, este acuse de recibo se denomina ACK (acknowledge). Luego el Master lee el ACK, si vale 0 (enviado por el esclavo), el proceso de transferencia continúa. Si vale 1, esto indica que el circuito direccionado no valida la

152

------------------------

direccionado no valida la 152 ------------------------ Microcontroladores PIC Programación en BASIC

Microcontroladores PIC

Programación en BASIC ------------------------

comunicación, entonces el Maestro genera un bit de stop para liberar el bus I²C, en la cual las líneas SDA y SCL pasan a un estado alto, vamos a suponer que el ACK es 0, entonces el microcontrolador envía los 8 bits correspondientes a la posición de memoria que se desea escribir o leer, nuevamente la memoria envía un reconocimiento, finalmente se envía el dato a ser almacenado y se espera la respuesta de la memoria indicando que el dato llegó correctamente, finalmente se debe enviar el bit de parada. Como en nuestra práctica vamos a almacenar la palabra HOLA, vamos a suponer que ya guardamos las 3 primeras letras, la H en la dirección 0, la O en la dirección 1 y la L en la dirección 2, nos falta guardar la A en la dirección 3, esto se realizaría enviando pulsos de la siguiente manera:

esto se realizaría enviando pulsos de la siguiente manera: Figura 5.9.12.2. Esquema de una transmisión completa

Figura 5.9.12.2. Esquema de una transmisión completa con la interfaz I²C para guardar el número 65 en la dirección 3 de una memoria serial 24LC04B.

Noten que la dirección del CI. A2, A1, A0 es 000, lo que quiere decir que estos tres pines van conectados a tierra, según la tabla 5,9,12,1, se pueden instalar 4 dispositivos de memoria en un bus, estos son empezando por A2, A1 y A0 los siguientes: 00x, 01x, 10x y 11x, por ejemplo:

01x esta memoria debe tener conectado a 5 voltios el pin A1 y su control sería 10100100.

LA DECLARACIÓN I2CWRITE Y I2CREAD. Estas declaraciones sirven para escribir y leer datos en un chip EEPROM serial usando una interfaz I²C de 2 hilos, funcionan en modo I²C Master y también puede ser utilizado para comunicarse con otros dispositivos de interfaz I²C como sensores de temperatura, reloj calendarios, conversores A/D, etc.

------------------------

calendarios, conversores A/D, etc. ------------------------ Microcontroladores PIC Programación en BASIC

Microcontroladores PIC

Programación en BASIC ------------------------

153

Los 7 bits de control contienen el código de fábrica del chip y la selección del chip A2, A1, A0, el último bit es una bandera interna que indica si es un comando de lectura o escritura y no se debe usar. Por lo tanto el control para nuestro caso en lectura o escritura es %10100000. Debido a que los pines SDA y SCL de la memoria 24LC04B son de colector abierto, estas deben ir conectadas con resistencias de 4,7 K pull-up, sin embargo existe una línea de comando que hace que no se necesite la resistencia pull-up del SCL, esta se debe agregar al comienzo del programa:

DEFINE I2C_SCLOUT 1

; no es necesario resistencia pull-up en SCL (reloj)

También cabe indicar que existen algunas memorias que necesitan de un período de tiempo para poder ser grabadas, por lo que se adiciona un PAUSE 10 después de cada grabación. Su estructura es de la siguiente manera:

I2CWRITE portb.6, portb.7, %10100000, 0, [65] PAUSE 10

;almacenar en la dirección 0 el dato 65 ;pausa necesaria para completar la grabación

I2CWRITE pin dato, pin reloj, control, posición memoria, variable.

MATERIALES. -1 LCD 2 x 16 -1 resistencia de 4,7 K -1 resistencia de 10 -1 potenciómetro de 10 K -1 memoria serial 24LC04B de microchip o equivalente -1 switch selector de 3 pines.

de microchip o equivalente -1 switch selector de 3 pines. Figura 5.9.12.3. Esquema de conexionado de

Figura 5.9.12.3. Esquema de conexionado de una memoria 24LCXX a un PIC, el switch selector permite proteger a la memoria de escrituras accidentales al colocar en R Read.

154

------------------------

al colocar en R Read . 154 ------------------------ Microcontroladores PIC Programación en BASIC

Microcontroladores PIC

Programación en BASIC ------------------------

En nuestro caso vamos a escribir y leer en la memoria, por lo que el pin WP debe estar colocado en estado bajo, una vez que se haya grabado se podrá colocar este pin en estado alto para proteger la memoria de futuras escrituras, los datos almacenados en esta memoria permanecen aún si se le corta la alimentación al CI. (no volátil), el acceso a estos datos se lo realiza las veces deseadas, recuerde que la memoria serial soporta 1,000.000 de ciclos de borrado y escritura, por lo tanto se debe tener cuidado de no ejecutar un programa que almacene una y otra vez el mismo dato.

DEFINE

I2C_SCLOUT 1

;para que no necesite resistencia pull-up en SCL

contro

CON

%10100000

;contro contiene valor constante %10100000

PinSCL

VAR

Portb.7

;pin señal de reloj I2C

PinSDA VAR

Portb.6

;pin de datos I2C

dato

VAR BYTE

;variable para almacenar dato leído

Inicio:

LCDOUT $fe,1," Grabando PAUSE 1000

"

;limpiar y sacar el texto en LCD

I2CWRITE PinSDA,PinSCL,contro,0,["H"] PAUSE 10 I2CWRITE PinSDA,PinSCL,contro,1,["0"] PAUSE 10 I2CWRITE PinSDA,PinSCL,contro,2,["L"] PAUSE 10 I2CWRITE PinSDA,PinSCL,contro,3,["A"] PAUSE 10

;guarda la H en posición 0 ;pause para la grabación ;guarda la O en posición 1 ;pause para la grabación ;guarda la L en posición 2 ;pause para la grabación ;guarda la A en posición 3 ;pause para la grabación

LCDOUT $fe,1,"Leer memoria"

;limpiar y sacar el texto en LCD

PAUSE 1000

LCDOUT $FE,1

;limpiar pantalla del LCD

leer:

;programa para leer la memoria serial.

I2CREAD PinSDA,PinSCL,contro,0,[dato] LCDOUT, dato PAUSE 1000 I2CREAD PinSDA,PinSCL,contro,1,[dato] LCDOUT, dato PAUSE 1000 I2CREAD PinSDA,PinSCL,contro,2,[dato] LCDOUT, dato PAUSE 1000 I2CREAD PinSDA,PinSCL,contro,3,[dato] LCDOUT, dato

;leer la mem. 0 y guardar en dato ;mostrar dato en el LCD ;esperar 1 seg. ;leer la mem. 1 y guardar en dato ;mostrar dato en el LCD ;esperar 1 seg. ;leer la mem. 2 y guardar en dato ;mostrar dato en el LCD ;esperar 1 seg. ;leer la mem. 3 y guardar en dato ;mostrar dato en el LCD

END

Figura 5.9.12.4. memoria 24LCXX.pbp Programa para escribir y leer datos en un chip EEPROM.

------------------------

y leer datos en un chip EEPROM . ------------------------ Microcontroladores PIC Programación en BASIC

Microcontroladores PIC

Programación en BASIC ------------------------

155