Comunicación Serie Síncrona I2C
Comunicación Serie Síncrona I2C
Comunicación Serie Síncrona I2C
Maestro
Clk
Esclavo
Maestro
Clk
Esclavo
Un bus I 2C puede tener distintas configuraciones. Configuracin de un Maestro y varios Esclavos. Configuracin multiMaestro. En cualquiera de estas configuraciones, el dispositivo Maestro es el nico que tiene capacidad de iniciar la transferencia, decidir con quin se realiza, el sentido de la misma (envo o recepcin desde el punto de vista del Maestro) y cundo se finaliza. El bus I 2C consiste fsicamente en dos lneas de colector abierto. SCL para el reloj (pin RC3). SDA para los datos (pin RC4).
La comunicacin es, por tanto, half-duplex.
VDD
Rp
Rp Rp
Perifrico
Rs Rs
SDA SCL
C bus=10 400pF
A7 A6 A5 A4 A3 A2 A1 R/W ACK Direccin de 7 bits del esclavo Lectura (1) o Escritura (0)
En este caso, y dado que las etapas de salida son de drenador abierto, los niveles lgicos 0 son dominantes en las lneas, por lo que el Esclavo debe dejar su salida SDA a 1 para que el Maestro pueda generar el STOP (paso de 0 a 1 con SCL=1)
Si el receptor es el dispositivo Maestro, genera un ACK tras cada byte recibido, permitiendo al Esclavo que contine enviando bytes. Si el Maestro decide finalizar la transferencia, genera un bit de STOP tras colocar un bit de no-reconocimiento (NACK). El Esclavo puede retardar el envo del siguiente byte (porque no lo tiene todava disponible, p.e.) situando la lnea SCL en estado bajo, forzando as al Maestro a situarse en un estado de Espera puesto que no podr generar flancos en SCL.
Recibe el dato
ACK D7 D6 D5 D43 D3 D2 D1 D0
Recibe el dato
D7 D6 D5 D4 D3 D2
Pulso ACK
Pulso ACK
Pulso ACK
D7 D6 D5 D4 D3 D2
D1 D0
Pulso ACK
Pulso ACK
Ambos mdulos son idnticos en lo que se refiere al interface SPI. Caractersticas del interface I 2C en el mdulo MSSP. - Detecta condiciones START y STOP en el bus por interrupcin. - Permite seleccionar tres modos de operacin.
Esclavo I2 C con direccin de 7 bits. Esclavo I2 C con direccin de 10 bits. Maestro I2 C con reloj SCL de frecuencia fSCL = fOSC /[4(SSPADD+1)] SSPCON SSPADD SSPCON2 SSPBUF SSPSTAT SSPSR
Reloj
SSPBUF SSPSR
MSb LSb
Buffer Buffer para para envo envo y y recepcin recepcin Registro Registro E/S E/S
No Noaccesible accesible directamente directamente
SSPM3:SSPM0 SSPADD<6:0>
SSPBUF
RC4 SDA
SDA In
SSPSR
MSb Habilita recepcin LSb
Reloj
Generador de baudios
Ctrl CLK (detiene fuente de CLK) (SSPSTAT) (SSPCON2)
RC3 SCL
Deteccin de START/STOP
SCL In Colisin de bus
Ctrl CLK
Maestro
CKE: Bit de seleccin de niveles umbral en los pines D/A: Informacin del ltimo byte transmitido P: Bit de STOP S: Bit de START
Se pone a 1 si la ltima secuencia detectada es un bit de STOP Se pone a 1 si la ltima secuencia detectada es un bit de START
bit 1 bit 0
Esclavo
ACKDT: Valor a transmitir tras una recepcin ACKEN: Habilitacin de secuencia ACK RCEN: Bit de habilitacin de recepcin PEN: Habilitacin de una secuencia STOP RSEN: Habilitacin de START repetido
1 : Inicia secuencia de reconocimiento en SDA y SCL 1 : Activa modo recepcin 1 : Inicia situacin de STOP en SDA y SCL 1 : Inicia repetidas situaciones de START 1 : Inicia situacin de START en SDA y SCL
(87h)
SSPBUF SSPSR
(13h)
SSPADD
(93h)
PIR1 PIE1
(0Ch 8Ch)
(0Dh 8Dh)
La direccin viene indicada por SSPADD<7:1> - SSPADD<0>=0 LSb se usa para determinar la operacin solicitada por el Maestro
Esperar por un suceso I 2C. Se puede determinar con la ayuda del bit SSPIF.
La interrupcin puede estar activada o no
Identificar el suceso y actuar en consecuencia. Los sucesos I2C que percibe el Esclavo pueden ser de 5 tipos.
Debe leerse el registro SSPBUF aunque no se vaya a usar la informacin que contiene. Esta accin borra el bit BF y evita posteriores overflows.
Debe leerse el registro SSPBUF. Si SSPBUF no estaba lleno antes de la escritura, el Esclavo enva un reconocimiento ACK en el 9 pulso de reloj. Lo hace el MSSP automticamente. Si ya estaba lleno, SSPOV 1 y se enva un NACK.
El bit CKP se pone a 0 para que la lnea SCL pase a estado bajo, dando as tiempo al Esclavo para preparar el dato a enviar. El Esclavo debe escribir en el buffer el dato solicitado por el Maestro. Y debe hacer CKP 1 para liberar la lnea SCL.
El bit CKP se pone a 0 para que la lnea SCL pase a estado bajo, dando as tiempo al Esclavo para preparar el dato a enviar. El Esclavo manda el dato al Maestro escribindolo en el registro SSPBUF y haciendo CKP 1 para liberar la lnea SCL.
El envo de un NACK queda identificado porque R/W 0. Debido a que la recepcin de un NACK da lugar a un reset de la lgica I2C del Esclavo. Esta situacin da lugar a que los bits del registro SSPSTAT reflejen una situacin incoherente.
Indican que se ha recibido un dato del Maestro pero que el buffer est vaco.
Implementar alguno de los 6 eventos I 2C. 1. START 5. Reconocer (tras una lectura) 2. RESTART * ACK 3. STOP * NACK 4. Leer (recibir datos) 6. Escribir (transmitir datos)
2C por software. Si , ,implementar Sino nose seindica indica NOFORCE_SW NOFORCE_SW implementarel elprotocolo protocoloI I2 C por software.
--Pensado Pensadopara paraaquellos aquellosmicrocontroladores microcontroladoresPIC PICque queno nodisponen disponende deMSSP. MSSP. --El modo Esclavo , sin embargo, deber usarse con el MSSP. El modo Esclavo , sin embargo, deber usarse con el MSSP.
i2c_stop (); Si el PIC est en modo Maestro, esta instruccin genera una secuencia STOP.
Entero de 8 bits a sacar por el bus. Bit que recoge el valor del ACK enviado por el receptor.
Manda un byte al bus I2C. En modo Maestro, esta funcin generar adems la seal de reloj que marca la velocidad de transmisin del dato; en modo Esclavo, se esperar por la seal de reloj que genere el Maestro. Esta funcin puede devolver el bit ACK que enva el receptor cuando la transmisin ha terminado. El LSb del primer dato transmitido tras una secuencia de START indica el sentido en que se pretende establecer la comunicacin (si dicho LSb es 0, la informacin se transmitir de Maestro a Esclavo).
Lee el dato presente en el bus I2C. Se usa junto con i2c_poll() para evitar que el programa se cuelgue. Para que el watchdog se resetee mientras se espera a poder leer el dato, se incluye la opcin RESTART_WDT en la directiva #use i2c().
valor1 = i2_poll();
valor1 : 0 (FALSE) si no se ha recibido un byte en el buffer. 1 (TRUE) si se ha recibido un byte en el buffer.