modulo i2c en un microcontrolador pic16f877

21
06/04/12 Modulo I2C en un microcontrolador PIC16F877 2/24 varper-tech.com/articulo.php?idart=39 con microcontrolador PIC (35.3) Circuito para captura de señales ECG (20.5) Control de motores DC con microcontroladores PIC (14.3) Sistema de levitación magnética (13.0) James Clerk Maxwell (10.2) Manejo de display 7 segmentos y teclado matricial (9.0) Corriente alterna (7.3) Circuito para foto-pletismógrafo (6.9) Electroiman (6.8) Circuito impreso (6.2) artículo · Comentar · Descargar archivos · 1595 Lecturas · En edición · Modulo I2C en un microcontrolador PIC16F877 Introducción El modulo MSSP en modo I2C implementa todas las funciones de maestro y esclavo (incluyendo soporte para llamadas generales) y provee interrupciones en los bits START o STOP en hardware, para determinar el estado de bus libre (funciones multimaestro). El modulo MSSP implementa las especificaciones del modo estandar, asi como tambien direccionamiento de 7 bits y 10 bits. Un sistema de filtrado de errores se situa en los pines SCL y SDA cuando el pin es una entrada. Este filtro opera tanto a 100 Khz como a 400 Khz. En el modo de 100 Khz, cuando estos pines son salidas, hay un control en el tiempo de flanco del pin que es independiente de la frecuencia del dispositivo. Anuncios Google I2C Bus I2C I2C RS232 Atmel I2C EEPROM Me gusta 1

Upload: juan-aguilera

Post on 24-Jul-2015

453 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

2/24varper-tech.com/articulo.php?idart=39

con microcontrolador PIC (35.3)

Circuito para captura de señales ECG(20.5)

Control de motores DC conmicrocontroladores PIC (14.3)

Sistema de levitación magnética (13.0)

James Clerk Maxwell (10.2)

Manejo de display 7 segmentos yteclado matricial (9.0)

Corriente alterna (7.3)

Circuito para foto-pletismógrafo (6.9)

Electroiman (6.8)

Circuito impreso (6.2)

artículo · Comentar · Descargar archivos · 1595 Lecturas · En edición ·

Modulo I2C en unmicrocontrolador PIC16F877

Introducción

El modulo MSSP en modo I2C implementa todas las funciones de maestro y esclavo (incluyendo soporte parallamadas generales) y provee interrupciones en los bits START o STOP en hardware, para determinar el estadode bus libre (funciones multimaestro). El modulo MSSP implementa las especificaciones del modo estandar, asicomo tambien direccionamiento de 7 bits y 10 bits.

Un sistema de filtrado de errores se situa en los pines SCL y SDA cuando el pin es una entrada. Este filtro operatanto a 100 Khz como a 400 Khz. En el modo de 100 Khz, cuando estos pines son salidas, hay un control en eltiempo de flanco del pin que es independiente de la frecuencia del dispositivo.

Anuncios Google I2C Bus I2C I2C RS232 Atmel I2C EEPROM

Me gusta

1

Page 2: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

3/24varper-tech.com/articulo.php?idart=39

Gráfico 1. Diagrama de bloques para el modulo MSSP.

Dos pines son usados para transferencia de datos, estos son el pin SCL, que es el clock, y el pin SDA, que es el dedatos. Los pines SLC y SDA son configurados automaticamente cuando se configura el modo I2C. Las funciones delmodulo SSP se habilitan al setear el bit SSPEN (SSPCON<5>).

El modulo MSSP tiene seis registros para la operacion del modo I2C. Estos son:

Registro de control del SSP (SSPCON).

Segundo registro de control del SSP (SSPCON2).

Registro de estado del SSP (SSPSTAT).

Buffer de transmision/recepción serial (SSPBUFF).

Registro de desplazamiento (SSPSR) – No es accesible directamente.

Registro de direccion del SSP (SSPADD).

El registro SSPCON permite el control de la operacion del modulo I2C. Cuatro bits de seleccion de modo(SSPCON<3:0>) permiten seleccionar alguno de los siguientes modos:

Modo esclavo (direccionamiento de 7 bits).

Page 3: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

4/24varper-tech.com/articulo.php?idart=39

Modo esclavo (direccionamiento de 10 bits).

Modo maestro, clock = OSC/4 (SSPADD + 1).

Modos por firmware (proveidos para compatibilidad con otros productos de medio rango).

Antes de seleccionar un modo, los pines SCL y SDA deben ser programados como entradas seteando los bits delcorrespondiente registro TRIS. Seleccionar un modo al setear el bit SSPEN, permite a los pines SCL y SDA ser usadoscomo lineas de datos y de clock. Unos resistores pull-up deben ser colocados externamente para una adecuadaoperacion del modulo I2C.

El bit CKE (SSPSTAT <6>) establece los niveles de los pins SDA y SCL tanto en modo maestro como esclavo. CuandoCKE = 1, los niveles seran conformes a las especificaciones del SMBus. Cuando CKE = 0, estos niveles seranconformes a las especificaciones del protocolo I2C.

El registro SSPSTAT muestra el estatus de la transferencia de datos. Esta información incluye deteccion de los bitsSTART (S) y STOP (P), especifica si el byte recibido fue direccion o datos. Si el proximo byte es la otra parte de unadireccion de 10 bits, y si sera una transferencia de lectura o escritura de datos.

SSPBUF es el registro en el que se escriben los datos que se van a enviar o a recibir. El registro SSPSR desplaza losdatos que entran o salen del dispositivo. En operaciones de recepcion, el registro SSPBUF y SSPSR crea un receptorcon doble buffer. Esto permite la reccepcion del proximo byte antes de leer el ultimo byte de datos recibidos.Cuando un byte completo es recibido, se transfiere al registro SSPBUF y la banderilla SSPIF se setea. Si otro byte esrecibido antes de que el registro SSPBUF sea leido, ocurre un desbordamiento y el bit SSPOV (SSPCON <6>) se seteay el byte en SSPSR se pierde.

El registro SSPADD retiene la direccion del dispositivo esclavo. En modo de 10 bits, el usuario necesita escribir elbyte alto de la direccion (1 1 1 1 0 A9 A8 0). Luego se cargara el byte bajo de la direccion (A7: A0).

Modo esclavo

En modo esclavo los pines SCL y SDA deben ser configurados como entradas. El modulo MSSP trabajara sobre elestado de entrada con los datos de salida, cuando sea requerido (transmisor esclavo).

Cuando una direccion coincide, o los datos transferidos despues de una direccion, el hardware automaticamentegenerara un pulso de reconocimiento (ACK), y cargara el registro SSPBUF con el valor recibido actualmente en elregistro SSPSR.

Hay ciertas condiciones que causaran que el modulo MSSP no entregue una señal de reconocimiento ACK. Estosucesi si pasa lo siguiente:

a. El bit de buffer full (SSPSTAT<0>) se setea antes de que se haya recibido una transferencia.

b. El bit de desbordamiento SSPOV (SSPCON<6>) se setee antes de que una transferencia haya sido recibida.

Si el bit BF se setea, el valor del registro SSPSR no sera cargado en el registro SSPBUF, pero SSPIF y SSPOV seranseteadas. La Tabla 1 muestra que pasa cuando un byte es recibido, basados en los bits de estado BF y SSPOV. Lasceldas sombreadas muestran la condicion donde el software de usuario no limpia propiamente las condiciones dedesbordamiento. El bit BF es limpiado al leer el registro SSPBUF, mientras que SSPOV es limpiado en software.

Direccionamiento

Una ves que el modulo MSSP ha sido habilitado, espera que una condicion START ocurra. Seguido de una condicionSTART, los 8 bits son movidos al registro SSPSR. Todos los bits entrantes son muestreados en el flanco de subidade la linea de reloj (SCL). El valor del registro SSPSR es comparado con el valor del registro SSPADD. La direccion escomparada en el flanco de bajada de el octavo pulso de reloj. Si la direccion coincide y los bits BF y SSPOV estan en

Page 4: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

5/24varper-tech.com/articulo.php?idart=39

bajo, los siguientes eventos ocurren:

a. El valor del registro SSPSR es cargado en el registro SSPBUF en el flanco de bajada del octavo pulso de reloj.

b. El bit de buffer full BF se pone en uno en el flanco de bajada del octavo pulso de reloj.

c. Un pulso de reconocimiento (ACK) es generado.

d. La banderilla de interrupcion del SSP, SSPIF (PIR<3>) se pone en uno en el flanco de bajada del noveno pulsode reloj.

En los modos de direccionamiento a 10 bits, se necesita recibir dos bytes. Los cinco bits mas significativos delprimer byte de direccion especifica si es una direccion de 10 bits. El bit R/W (SSPSTAT <2>) debe ser puesto comoescritura para que el dispositivo esclavo reciba el segundo byte de direccion.

Para las direcciones de 10 bits. El primer byte debe ser igual a 1 1 1 1 0 A9 A8 0, donde A9 y A8 son los dos bitsmas significativos de la direccion. La secuencia de eventos para direcciones de 10 bits se describe de la siguienteforma, los pasos 7 – 9 son para transmisores esclavos:

1. Se recibe el primer byte de direccion, los bits SSPIF, BF y UA (SSPSTAT<1>) son puestos en alto.

2. Se actualiza el registro SSPADD con el primer byte de direccion (se limpia el bit UA y se libera la linea SCL).

3. Se lee el registro SSPBUF (se pone en bajo el bit BF) y se limpia la banderilla SSPIF.

4. Se recibe el segundo byte de direccion, los bits SSPIF, BF y UA se ponen en alto.

5. Se actualiza el registro SSPADD con el segundo byte de direccion. Esto limpiara el bit UA y liberara la lineaSCL.

6. Se lee el registro SSPBUF (se limpia el bit BF) y se limpia la banderilla SSPIF.

7. Se recibe una condicion de inicio repetida.

8. Se recibe el primer byte de direccion, los bits SSPIF y BF se ponen en alto.

9. Se lee el registro SSPBUF y se limpia la banderilla SSPIF.

Recepcion en modo esclavo

Cuando el bit R/W de el byte de direccion esta en bajo y la direccion coincide, el bit R/W del registro SSPSTAT espuesto en bajo. La direccion recibida es cargada dentro del registro SSPBUF.

Cuando una condicion de desbordamiento con un byte de direccion ocurre, un pulso de no reconocimiento esgenerado. En una condicion de desbordamiento tanto el bit BF como el bit SSPOV es seteado. Esta es una condicionde error dada por el firmware del usuario.

Una interrupcion es generada por cada byte transferido. La banderilla SSPIF debe ser limpiada en software. Elregistro SSPSTAT es usado para determinar el estado del byte recibido.

Page 5: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

6/24varper-tech.com/articulo.php?idart=39

Gráfico 2. Formas de onda para el modo esclavo

Bits de estado de recepciónde datos SSPSR → SSPBUF

Genera un pulsoNACK

Setea el bit SSPIF (ocurre interrupciones siestan habilitadas)

BF SSPOV

0 0 Si Si Si

1 0 No No Si

1 1 No No Si

0 1 Si Si Si

Tabla 1: Acciones ante bytes recibidos.

Nota: las celdas sombreadas muestran las condiciones donde el software del usuario no limpia adecuadamente lascondiciones de desbordamiento.

Transmision en modo esclavo

Cuando el bit R/W de la direccion entrante esta en alto y la direccion coincide, el bit R/W del registro SSPSTAT sesetea. La direccion recibida es cargada en el registro SSPBUF. El pulso ACK es enviado en el noveno bit, y el pin SCLse mantiene en bajo. Los datos transmitidos deben ser cargados en el registro SSPBUF, que tambien carga elregistro SSPSR. Entonces el pin SCL deberia ser habilitado seteando el bit CKP (SSPCON<4>). El maestro debemonitorear el pin SCL previamene para ordenar otro pulso de reloj. Los dispositivos esclavos pueden mantener elmaestro inactivo mientras extendienden el tiempo en que la linea de reloj se mantiene en bajo. Los ocho bits dedatos son enviados fuera en cada flanco de bajada de la entrada SCL. Esto asegura que la señal en el pin SDA seavalido durante el periodo en alto del pin SCL (Figura 7).

Page 6: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

7/24varper-tech.com/articulo.php?idart=39

Gráfico 2. Formas de onda en una transmisión (direccionamiento de 7 bits).

Una interrupcion por el SSP se genera por cada transferencia de datos. La banderilla SSPIF debe ser limpiado ensoftware y el registro SSPSTAT se usa para determinar el estado de una transferencia. El bit SSPIF se setea en elflanco de bajada del noveno pulso de reloj.

Para un transmisor esclavo, el pulso ACK desde el receptor maestro es visto en el flanco de subida del novenopulso de reloj que entra en el pin SCL. Si la linea SDA esta en alto (NACK), entonces la transferencia se completa.Cuando un pulso NACK es establecido por el esclavo, la logica del esclavo se resetea y el esclavo monitorea otraocurrencia de una condicion de START. Si la linea SDA estaba en bajo, los datos deben ser cargados en el registroSSPBUF, que tambien carga el registro SSPSR. Entonces el pin SCL deberia ser habilitado al setear el bit CKP.

Soporte para llamadas generales

Los procedimientos para el bus I2C son tales que el primer byte despues de una condicion START usualmentedetermina cual dispositivo sera el esclavo direccionado por el maestro. La excepcion es la direccion de llamadageneral, que puede direccionar a todos los dispositivos. Cuando esta direccion es usada, todos los dispositivosdeberian, en teoria, responder con un reconocimiento.

La direccion de llamada general es una de las ocho direcciones reservadas para propositos especificos por elprotocolo I2C. Esta consiste de todos los ceros con el bit R/W = 0.

La direccion de llamada general es reconocida cuando el bit GCEN se pone en uno (SSPCON2<7>) y la direccion escomparada con el registro SSPADD. Es tambien comparada con la direccion de llamada general.

Si la direccion de llamada general coincide, el registro SSPSR es transferido al registro SSPBUF, el bit BF es puestoen alto, y en el flanco de bajada del noveno bit la banderilla SSPIF se pone en alto.

Cuando una interrupcion es servida, la fuente de esta interrupcion puede ser verificada al leer el contenido delregistro SSPBUF para determinar si la direccion fue de un dispositivo especifico o una direccion de llamada general.

En modo de 10 bits, el registro SSPADD requiere ser actualizado para la segunda mitad de la direccion, y el bit UAes puesto en alto. Si la direccion de llamada general es muestreada cuando el bit GCEN es seteado, mientras elesclavo es configurado a modo de 10 bits, entonces la segunda mitad de la direccion no es necesaria, el bit UAB nosera seteado y el esclavo comenzara a recibir datos desepues de un reconocimiento (Figura 8).

Page 7: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

8/24varper-tech.com/articulo.php?idart=39

Gráfico 3. Secuencia de dirección de llamada general (modo de 10 o 7 bits).

Operación en modo Sleep

Mientra esta en modo SLEEP, el modulo I2C puede recibir direcciones o datos. Cuando una direccion coincide o unatransferencia completa ocurre, se despierta el procesador del modo SLEEP (si la interrupcion por SSP es habilitada).

Modo maestro

La operacion en modo maestro es soportada por generacion de interrupciones en la deteccion de un bit START ySTOP. Los bits son limpiados en un reset, o cuando el modulo MSSP es deshabilitado. El control del bus I2C puedeser tomado cuando P es seteado, o el bus esta inactivo, o tanto el bit S y el bit P en bajo.

Page 8: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

9/24varper-tech.com/articulo.php?idart=39

Gráfico 3. Diagrama de bloques del modulo MSSP.

Modo multimaestro

En modo multimaestro, la generacion de interrupcion al detectar condiciones START o STOP permite determinarcuando el bus esta libre. Los bits de STOP (P) y START (S) son limpiados cuando ocurre un RESET o el modulo MSSPes deshabilitado. El control de bus I2C puede ser tomado cuando el bit P es seteado, o el bus esta inactivo y tantoel bit S y el bit P estan en bajo. Cuando el bus esta ocupado, al habilitar las interrupciones por SSP se generarancuando una condicion de STOP ocurra.

Los siguientes eventos causaran que la banderilla SSPIF sea puesta en uno:

Una condicion START.

Una condicion STOP.

Un byte transferido o recibido.

Una transmision de una señal de reconocimiento.

Una condicion START repetida.

En operacion multimaestro, la linea SDA debe ser monitoreada de forma arbitraria para ver si los niveles de señalson los esperados. Esta verificacion es desarrollada en hardware, con el resultado colocado en el bit BCLIF.

Los estados donde el chequeo se puede perder son:

Transferencia de direcciones.

Transferencia de datos.

Una condicion de START.

Una condicion de START repetida.

Una condicion de reconocimiento.

Soporte para modo maestro

El modo maestro se habilita al setear y limpiar los bits SSPM adecuados en el registro SSPCON y al setear el bitSSPEN. Una ves que el modo maestro es habilitado, el usuario tiene seis opciones:

Iniciar una condicion de START en las lineas SDA y SCL.

Enviar una condicion de START repetida en los pines SDA y SCL.

Escribir en el registro SSPBUF para iniciar una trasmision de datos/direccion.

Generar una condicion de STOP en SDA y SCL.

Configurar el puerto I2C para recibir datos.

Generar una condicion de reconocimiento al final del byte de datos recibido.

Operación en modo maestro

Page 9: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

10/24varper-tech.com/articulo.php?idart=39

El dispositivo maestro genera todos los pulsos de reloj y las condiciones de START o STOP. Una transferencia sefinaliza con una condicion de STOP o con una condicion de START repetida. Una ves que una condicion de STARTsea repetida, esta tambien es el comienzo de la proxima transferencia y el bus I2C no sera liberado aun.

En modo de transmision maestro, los datos son puestos en la salida a traves de la linea SDA, mientras que SCLgenera el reloj. El primer byte transmitido contiene la direccion del esclavo al cual seran enviados los datos y un bitR/W. En este caso, el bit R/W sera un cero logico. Los datos son transmitidos ocho bits por vez. Despues de quecada byte es transmitido una señal de reconocimiento es recibida. Las condiciones de START y STOP para indicar elinicio y el final de una transferencia.

En modo receptor maestro, el primer byte transmitido contiene la direccion del dispositivo al cual sera transmitidoy el bit R/W que en este caso sera un uno logico. Los datos son recibidos por medio de la linea SDA, mientras queSCL genera la señal de reloj. Los datos son recibidos ocho bits a la ves. Despues de que cada byte es recibido, unbit de reconocimiento es transmitido. Las condiciones START y STOP indican el comienzo y el final de unatransmision.

El generador de baud rate usado para la operacion en modo SPI no se usa para establecer la frecuencia en el pinSCL tanto para 100 Khz, 400 Khz o 1 Mhz. El valor de recarga generador de baud rate es contenido en los 7 bits masbajos del registro SSPADD. El generador de baud rate automaticamente comenzara a contar en una escritura alregistro SSPBUF. Una ves que la operacion se ha completado (por ejemplo, transmision de los ultimos bits de datosseguidos de un ACK), el reloj interno automaticamente parara de contar y el pin SCL permanecera en el ultimoestado.

Una secuencia tipica de transmision debieria ser de la siguiente forma:

a. El usuario genera una condicion de START poniendo en alto el bit SEN en el registro SSPCON2.

b. SSPIF es puesto en alto. El modulo esperara el tiempo de inicio requerido antes de que otra operacion tomelugar.

c. El usuario carga el registro SSPBUF con la direccion a transmitir.

d. La direccion es enviada por el pin SDA hasta que todos los 8 bits sean transmitidos.

e. El modulo MSSP lee el bit ACK desde el dispositivo esclavo y escribe su valor en el registro SSPCON2(SSPCON2<6>).

f. El modulo MSSP genera una interrupcion al final del noveno pulso de reloj seteando SSPIF.

g. El usuario carga el registro SSPBUF con el byte de datos.

h. El dato es enviado por el pin SDA hasta que los 8 bits sean transmitidos.

i. El modulo MSSP espera una señal ACK desde el dispositivo esclavo y escribe el valor en el registro SSPCON2(SSPCON2<6>).

j. El modulo MSSP genera una interrupcion al final del noveno ciclo de reloj seteando el bit SSPIF.

k. El usuario genera una condicion de STOP seteando bit PEN en el registro SSPCON2.

l. Una interrupcion es generada una ves que la condicion STOP es completada.

Generador de Baud Rate

En el modo maestro, el valor recargado por el generador de Baud Rate es localizado en los 7 bits menos

Page 10: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

11/24varper-tech.com/articulo.php?idart=39

significativos del registro SSPAD (Figura 10). cuando el BRG es cargado con este valor, este decrementahasta abajo y se detiene hasta que otra recarga tenga lugar. El conteo del BRG es decrementado dos veces porciclo de instruccion, en el tiempo Q2 y Q4.

En el modo maestro, el BRG es recargado automaticamente. Si la verificacion arbitraria del reloj esta tomandolugar, el BRG sera recargado cuando el pin SCL sea muestreado en alto ().

Nota: Baud Rate = Fosc / (4 * (SSPAD + 1))

Gráfico 4. Diagrama de bloques del generador de baud rate.

Gráfico 5. Tiempos para los muestreos arbitrarios del generador de baud rate.

Condición de START en modo maestro

Para iniciar una condicion de START el usuario setea el bit SEN (SSPCON2<0>). Si los pines SDA y SCL sonmuestreados en alto, el generador de baud rate es recargado con el contenido de SSPADD <6:0> y empieza elconteo. Si SCL y SDA son muestreados ambos en alto cuando el tiempo del generador de baud rate se acaba, el pinSDA es puesto en bajo. La accion de SDA comienza poniendose en bajo mientras SCL esta en alto y entonces setiene una condicion de START y causa que el bit S sea puesto en uno. Siguiendo esto, el generador de baud rate esrecargado con el contenido de SSPADD y se retoma su conteo. Cuando el tiempo del generador de baud rate seacaba, el bit SEN automaticamente es limpiado por el hardware. El generador de baud rate es suspendido, dejandola linea SDA en bajo, y la condicion de START se completa.

Page 11: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

12/24varper-tech.com/articulo.php?idart=39

Gráfico 6. Primera condición START.

Nota: si al comienzo de una condicion de START los pines SDA y SCL ya han sido muestreados en bajo, o si durantela condicion de START la linea SCL es muestreada en bajo antes de que la linea SDA sea puesta en bajo, unacolision en el bus ocurre. La banderilla BCIF se pone en alto y la condicion START es abortada y el modulo esreseteado en su estado inactivo.

Bandera de estado WCOL

Si el usuario escribe en el registro SSPBUF cuando una secuencia de START esta en progreso, el bit WCOL serapuesto en alto y el contenido del buffer sera descartado.

Nota: debido a que no esta permitido poner eventos en cola, las escrituras a los 5 bits del SSPCON2 estandeshabilitadas hasta que la condicion de START sea completada.

Repeticion de la condicion de START en modo maestro

Una condicion START repetida ocurre cuando el bit RSEN (SSPCON2<1>) es puesto en alto y el modulo esta enestado inactivo. Cuando el bit RSEN es puesto en alto, el pin SCL es puesto en bajo. Cuando el pin SCL esmuestreado en bajo, el generador de baud rate es cargado con el contenido del registro SSPADD y comienza acontar. El pin SDA es liberado para un conteo del generador de baud rate. Cuando el tiempo del generador de baudrate se acaba, si SDA es muestreado en alto, el pin SCL sera puesto en alto. Cuando SCL es muestreado en alto elgenerador de baud rate es recargado con el contenido de SSPADD y comienza a contar. SDA y SCL debe sermuestreado en alto durante un TBRG. Esta accion es entonces seguida por una aserción del pin SDA por un TBRG,mientras SCL esta en alto. Seguido de esto el bit RSEN sera limpiado automaticamente y el generador de baud rateno sera recargado, manteniendo el pin SDA en bajo. Tan pronto como una condicion START es detectada en lospines SDA y SCL, el bit S sera seteado. La bandera SSPIF no sera puesta en alto hasta que el generador de baud ratehaya acabado su tiempo.

Page 12: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

13/24varper-tech.com/articulo.php?idart=39

Gráfico 7. Repetición de una condición START.

Nota:

1. Si RSEN es alterado mientras otro evento esta en progreso, no tendra efecto alguno.

2. Una colision de bus durante una condicion START repetida ocurrira si:

SDA es muestreado en bajo cuando SCL va de bajo a alto.

SCL va a un nivel bajo antes de que SDA sea puesta en bajo. Esto puede indicar que otro maestro estaintentando transmitir un dato.

Inmediatamente despues de que la banderilla SSPIF es puesta en alto, el usuario debe escribir el registro SSPBUFcon la direccion de 7 bits o de 10 bits, tal sea el caso. Despues de que los primeros ocho bits son transmitidos y unACK es recibido, el usuario debe transmitir unos o bits adicionales de direccion (en modo de 10 bits) o de datos (enmodo de 7 bits).

Transmision en modo maestro

La transmision de un byte de datos, una direccion de 7 bits, o la mitad de una direccion de 10 bits, se cumplesimplemente escribiendo el valor en el registro SSPBUF. Esta accion seteara la banderilla BF y permitira algenerador de baud rate empezar a contar e iniciar la proxima transmision. Cada bit de direccion o dato se irasacando a traves del pin SDA despues de un flanco de bajada en el pin SCL. SCL es retenido en bajo durante unconteo del generador del baud rate. Los datos deberian ser validos antes de que SCL se libere y se ponga en alto,.Los datos en el pin SDA deben permanecer estables por ese tiempo y altun tiempo despues del proximo flanco debajada en el pin SCL. Despues de que el octavo bit es sacado por la linea, la banderilla BF es limpiada y el maestrolibera SDA permitiendo al dispositivo esclavo ser direccionado para responder con un ACK durante el noveno bit siuna coincidencia en la direccion ocurre o si los datos fueron recibidos exitosamente. El estado del ACK es leido enel bit ACKDT en el flanco de bajada del noveno pulso de reloj. Si el maestro recibe una señal de reconocimiento, elbit de reconocimiento ACKSTAT es limpiado. Sino, el bit es puesto en alto. Despues del noveno pulso de reloj, el bitSSPIF es seteado y el reloj del dispositivo maestro es suspendido hasta que el proximo byte de datos sea cargadoen el registro SSPBUF, dejando SCL en bajo y SDA sin cambios.

Page 13: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

14/24varper-tech.com/articulo.php?idart=39

Gráfico 8. Transmisión en modo maestro.

Después de escribir en el registro SSPBUF, cada bit de direccion sera enviado en cada blanco de bajada de SCLhasta que todos los bits, incluyendo el bit R/W, sean transmitidos. En el flanco de bajada del octavo pulso de reloj,el maestro debera liberar el pin SDA, permitiendo al esclavo responder con una señal de reconocimiento. En elflanco de bajada del noveno pulso de reloj, el maestro debera muestrear el pin SDA para ver si la direccion fuereconocida por el esclavo. El estado del bit de reconocimiento es cargado en el bit ACKSTAT. Seguido del flanco debajada del noveno pulso de reloj de la transmision de la direccion, el bit SSPIF es puesto en alto, la banderilla BF eslimpiada y el generador del baud rate es apagado hasta que otra escritura tome lugar en el registro SSPBUF,reteniendo en bajo el pin SCL y liberando SDA.

Recepcion en modo maestro

La recepcion en odo maestro es habilitada al poner en alto el bit RCEN (SSPCON2<3>).

Nota: el modulo SSP debe estar desocupado antes de que el bit RCEN sea puesto en alto, o no sera tomado encuenta.

El generador del baud rate empezara a contar y en cada pulso el estado del pin SCL cambia y los datos son movidosal registro SSPSR. Despues del flanco de bajada del noveno pulso de reloj la banderilla para habilitar la recepciones puesta en bajo, el contenido del registro SSPSR es cargado en el registro SSPBUF, la banderilla BF es puesta enalto, la banderilla SSPIF es puesta en alto, y el generador de baud rate es suspendido, manteniendo SCL en bajo. Elmodulo MSSP es ahora en estado inactivo, esperando el proximo comando. Cuando el buffer es leido por el CPU, labanderilla BF es automaticamente limpiada. El usuarip puede ahora enviar un bit de reconocimiento al final de larecepcion, seteando el bit ACKEN (SSPCON2<4>).

Banderilla de estado del buffer BF

En la operacion de recepcion, la banderilla BF se pone en uno cuando una direccion o un byte es recibido en elregistro SSPBUF. Se limpia automaticamente cuando SSPBUF es leido.

Page 14: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

15/24varper-tech.com/articulo.php?idart=39

Banderilla de estado SSPOV

En la operacion de recepcion, SSPOV es puesto en uno cuando un byte ha sido recibido en el registro SSPSR y labanderilla BF todavia esta en uno porque no se ha realizado una lectura.

Temporizacion en la secuencia de reconocimiento

Una secuencia de reconocimiento es habilitada al setear el bit ACKEN (SSPCON2<4>). Cuando este bit esta en uno,el pin SCL es puesto en bajo y el contenido del bit de reconocimiento es presentado en el pin SDA. Si el usuariodesea general un reconocimiento, el bit ACKDT debe ser limpiado. Sino, el usuario debe poner en uno el bit ACKDTantes de empezar una secuencia de reconocimiento. El generador de baud rate contara durante un periodo (TBRG)y el pin SCL se pondra en alto. Cuando el pin SCL es muestreado en alto, el generador de baud rate cuenta por unTBRG. El pin SCL entonces se pone en bajo. Seguido de esto, el bit ACKEN es automaticamente limpiado, elgenerador de baud rate es apagado, y entonces el modulo SSP se va a modo inactivo. La Figura 15 muestra esteproceso.

Gráfico 9. Formas de onda para una secuencia de reconocimiento.

Diagramas de tiempo para una condicion de STOP

Un bit de STOP es puesto en el pin SDA al final de una transmision/recepcion al poner en uno el bit PEN(SSPCON2<2>). Al final de una recepcion/transmision, la linea SCL es puesta en bajo despues del flanco de bajadadel noveno pulso de reloj. Cuando PEN es puesto en uno, el maestro pondra la linea SDA en bajo. Cuando la lineaSDA es muestreada en bajo, el generador de baud rate es recargado y cuenta hasta 0. cuando el tiempo delgenerador de baud rate se termina, el pin SCL sera puesto en alto, entonces el pin SDA sera puesto en alto. Cuandoel pin SDA es muestreado en alto mientras SCL esta en alto, el bit P (SSPSTAT<4>) es puesto en alto. Luedo de quehaya transcurrido un TBRG, el bit PEN es limpiado y la banderilla SSPIF se pone en alto. (vease Figura 16)

Page 15: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

16/24varper-tech.com/articulo.php?idart=39

Gráfico 10. Condición de STOP en modo transmisión o recepción.

Siempre y cuando el firmware decida tomar control del bus, primero se debe determinar si el bus esta ocupadochequeando los bits S y P en el registro SSPSTAT. Si el bus esta ocupado, entonces el CPU puede ser interrumpidocuando un bit STOP ha sido detectado.

Muestreo del reloj

el testeo del reloj ocurre cuando el maestro, durante cualquier condición de recepcion, transmision libera el pin SCL(puesto en alto). Cuando el pin SCL se pone en alto el generador de baud rate es suspendido hasta que el pin SCLsea muestreado en alto. Cuando el pin es muestreado en alto, el generador de baud rate es recargado con elcontenido de SSPAD<6:0> y comienza a contar. Esto asegura que el tiempo en alto de la linea SCL sea siempre almenos un conteo luego de que el reloj es puesto en bajo por algun dispositivo externo.

Modo multimaestro, comunicación, colision, y muestreo de reloj

El soporte de modo multimaestro es llevado a cabo por medio del testeo. Cuando el maestro envia bits de direcciono datos por el pin SDA, el muestreo toma lugar cuando el maestro pone un uno en SDA, al permitir que SDApermanezca en alto y otro maestro lo pone en 0. cuando el pin SCL se mantiene en alto, los datos deberian serestables. Si los datos esperados en SDA es un uno y los datos muestreados son un 0, una colision en el bus tendralugar. El maestro pondra el bit BCLF en alto y reseteara el puerto I2C a su estado inactivo (Figura 17).

Gráfico 11. Formas de onda para una colisión en el bus para transmisiones y reconocimiento.

Page 16: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

17/24varper-tech.com/articulo.php?idart=39

Si una transmision estaba en progreso cuando la colision en el bus ha ocurrido, la transmision es detenida, labanderilla BF es limpiada, las lineas SDA y SCL son puestas en alto y el registro SSPBUF puede ser escrito. Cuandoel usuario sirve a una interrupcion por colision del bus y si el bus esta libre, el usuario puede reestablecer lacomunicación al iniciar una condicion START.

Si una condicion START, START repetida, STOP o reconocimiento estaba en progreso cuando ocurrio la colision en elbus, las condiciones son abortadas, el pin SCL y SDA son liberadas y los bits de control respectivos en el registroSSPCON2 son limpiados. Cuando el usuario sirve a una rutina de interrupcion por colision en el bus y si el bus estalibre, el usuario puede reestablecer la comunicación al iniciar una condicion START.

El maestro continuara monitoreando las lineas SDA y SCL y si una condicion STOP ocurre, SSPIF sera puesto en alto.

Una escritura en el registro SSPBUF empezara la transmision de datos sin importar donde la transmision termino ocuando la colision en el bus ocurrio.

En odo multimaestro, la generacion de interrupciones en la deteccion de condiciones START y STOP permite ladeterminacion de cuando el bus esta libre. El control del bus I2C puede ser tomado cuando el bit P es puesto enalto o el bus esta inactivo y los bits S y P estan en bajo.

Colision de bus durante una condicion de START

Durante una condicion de START, una colision de bus ocurre si:

SDA o SCL son muestreados en bajo al comienzo de la condicion START (Figura 18).

SCL es muestreado en bajo antes de que la linea SDA sea muestreada en bajo (Figura 19).

Gráfico 12. Colisión en el bus durante una condición START (solamente SDA).

Page 17: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

18/24varper-tech.com/articulo.php?idart=39

Gráfico 13. Colisión en el bus durante una condición START (SCL = 0).

Durante una condicion de START, tanto la linea SDA como la linea SCL son monitoreados. Si tanto el pin SDA o elpin SCL estan todavia en bajo, entonces estos eventos ocurren:

La condicion START es abortada,

Y el bit BCLIF es puesta en alto, y el modulo SSP es reseteado a su estado inactivo (Figura 18).

La condicion START comienza con SDA y SCL en alto. Cuando el pin SDA es muestreado en alto, el generador debaud rate es cargado desde SSPADD <6:0> y cuenta hasta 0. si el pin SCL es muestreado en bajo mientras SDA estaen alto, una colision en el bus ocurre, por eso se asume que otro maestro esta tratando de transmitir un dato 1durante una secuencia de START.

Si el pin SDA es muestreado en bajo durante este conteo, el BRG es reseteado y la linea SDFA es soltada (Figura20). Sin embargo si un uno es muestreado en SDA, este sera puesto en bajo al final del conteo de BRG. Elgenerador de baud rate es entonces recargado y cuenta hasta 0, una colision en el bus no ocurre. Al final delconteo del BRG el pin SCL es puesto en bajo.

Nota: la razon por la que la colision en el bus no es un factor durante la condision de SART es que dos maestros nopueden iniciar una condicion START exactamente al mismo tiempo. Por consiguiente, un maestro siempre iniciaSDA antes que otro. Esta condicion no causa una colision en el bus, debido a que dos maestros deben ser capacesde testear la primera direccion despues de una condicion de START. Si la direccion es la misma el muestreo debeser permitido para continuar en la porcion de datos, START repetido o condicion de STOP.

Page 18: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

19/24varper-tech.com/articulo.php?idart=39

Gráfico 14. Reset en BRG debido a una colisión en SDA durante una condición START.

Colision de bus durante una condicion de START repetida

Durante una condicion de START repetida, una colision de bus ocurre si:

a. Un nivel bajo es muestreado en la linea SDA cuando SCL pasa de bajo a alto.

b. SCL pasa a nivel bajo antes de que SDA sea puesto en bajo, indicando que otro maestro esta intentandotransmitir un uno.

Cuando el usuario libera el pin SDA, el BRG es cargado con el valor del registro SSPADD<6:9> y cuenta hasta cero.El pin SCL es liberado y cuando es muestreado en alto, el pin SDA es muestreado. Si SDA esta en bajo una colisionen el bus ocurre (por ejemplo, si otro maestro intenta transmitir un cero). Sin embargo, si SDA es muestreado enalto, el BRG es recargado y comienza a contar. Si SDA pasa de alto a bajo antes de que el tiempo del BRG expire,no ocurriran colisiones de bus, debido a que dos maestros no pueden poner en bajo el pin SDA exactamente almismo tiempo.

Sin embargo, si SCL pasa de alto a bajo antes de que el tiempo del BRG expire y SDA no ha sido todavia puesta enbajo, una colision en el bus ocurre. En este caso, otro maestro esta intentando transmitir un uno durante lacondicion de START repetida.

Si al final del tiempo de expiracion del BRG, tanto el pin SDA y SCL todavia permanecen en alto, el pin SDA espuesto en bajo, el BRG es recargado y comienza a contar. Al final del conteo, independientemente del estado delpin SCL, este es puesto en bajo y la condicion de START repetida esta completa (vease Figura 21 y Figura 22).

Page 19: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

20/24varper-tech.com/articulo.php?idart=39

Gráfico 15. Colisión de bus durante una condición START repetida (caso 1).

Gráfico 16. Colisión de bus durante una condición START repetida (caso 2).

Colision durante una condicion de STOP

Una colision durante una condicion de STOP ocurre si:

a. Despues de que el pin SDA ha sido liberado y esta en alto, SDA es muestreado en bajo despues que el BRGha terminado su conteo.

b. Despues de que el pin SCL es liberado y SCL es muestreado en bajo antes de que SDA sea puesto en alto.

La condicion de STOP comienza con SDA puesto en bajo. Cuando SDA es muestreado en bajo, el pin SCL se puedellevar a alto. Cuando el pin es muestreado en alto, el generador de baud rate es cargado con el valor del registroSSPADD<6:0> y cuenta hasta cero. Despues de que el BRG termina su conteo, SDA es muestreado. Si SDA esmuestreado en bajo, una colision de bus ocurre. Esto es debido a que otro maestro intenta enviar un cero. Si SCL esmuestreado en bajo mientras SDA esta en alto, una colision ocurre. En este caso otro maestro esta intentandoponer un uno en el bus (vease Figura 23 y Figura 24).

Page 20: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

21/24varper-tech.com/articulo.php?idart=39

Gráfico 17. Colisión de bus durante una condición STOP (caso 1).

Gráfico 18. Colisión de bus durante una condición STOP (caso 2).

Consideraciones especiales sobre conecciones al bus I2C

Para dispositivos que usen el modo I2C estandar, los valoresde los resistores Rp y Rs en la Figura 25 depende delos siguientes parametros:

Voltaje de alimentacion.

Capacitancia del total bus.

Numero de dispositivos conectados (corriente de entrada + corriente de fuga).

El voltaje de alimentación limita los valores de los resistores Rp, debido a la corriente minima de sumidero de 3 mAa VOL max = 0,4 V, para las etapas de salida especificas. Por ejemplo con una fuente de voltaje de VDD = 5 V ±10%y un VOL max = 0,4 V, Rp min = (5,5 – 0,4) / 0,003 = 1.7 KÎ. VDD como una funcion de RP como se muestra enla Figura 25. El margen de ruido deseado de 0,1 VDD para el nivel bajo limita el maximo valor de Rs. Los resistoresen serie son opcionales y son usados para mejorar la susceptibilidad a las ESD (Electro Shock Discharges).

Page 21: Modulo I2C en Un Microcontrolador PIC16F877

06/04/12 Modulo I2C en un microcontrolador PIC16F877

22/24varper-tech.com/articulo.php?idart=39

La capacitancia es la total del bus, las conexiones y los pines. Esta capacitancia limita el maximo valor deRp debido al tiempo de levantamiento especificado.

El bit SMP controla el tiempo de levantamiento. Este bit en el registro SSPSTAT controla el tiempo de levantamientode los pines I/O cuando estan en modo I2C (maestro o esclavo).

Gráfico 19. Ejemplo de configuración del bus I2C.

Artículos relacionados