Anda di halaman 1dari 67

MDULO SSP

(SYNCHRONOUS
SERIAL PORT)
INTERFACE

I2C

MDULO SSP (SYNCHRONOUS SERIAL PORT)


Puerto Serie Sncrono: Interface de Comunicacin Serie Sncrona
Pensado para comunicacin con otros Microcontroladores o Perifricos:
EEPROM serie (almacenamiento de datos no voltiles)
Registros de Desplazamiento (expansin de entradas y/o salidas)
Drivers de Displays (reduccin de conexiones)
Conversores A/D (digitalizacin externa de seales)
Modos de Operacin posibles del mdulo SSP:

Interface I2C
I2C en
SSP SSP
nterface
enelelmdulo
mdulo
Es un interface sncrono a 2 hilos pensado para la comunicacin entre C.I. y
desarrollado por Philips Corporation. Es un bus estndar para muchos equipos de
consumo y telecomunicaciones
Las dos lneas de comunicacin corresponden a reloj (SCL) y datos (SDA). Las
transferencias son por tanto semi-dplex.
En el bus debe existir al menos un dispositivo Maestro que genera la seal de reloj
y uno o varios Esclavos que reciben tal seal SCL.
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 del Maestro)
y cundo se finaliza
Cada dispositivo esclavo conectado al bus tiene asignada una direccin nica
codificada en 7 ( en 10 bits de manera opcional)
Se admite la presencia de varios Maestros en el bus (sistema multi-Maestro) con
un arbitraje que asegura que en cada instante slo hay uno dominante

nterface I2C en el mdulo SSP


Ventajas del BUS I2C
Definido inicialmente a mediados de los 80 para trabajar a 100kbit/s y en 1995
se defini un modo rpido de funcionamiento que permita transferencias de hasta
400kbit/s (algunos dispositivos grficos llegan a 3,4MHz).
Es til y se emplea en muchas aplicaciones en las que la velocidad de transferencia
es mucho mayor de lo que el caso requiere (p.e. Medida de temperaturas con
constantes de tiempo de segundos)
Su principal ventaja, es que una vez disponible el microcontrolador con sus
funciones de interface con bus I2C, la inclusin de un dispositivo I2C adicional slo
necesitara su conexin a las dos lneas del bus (SDA y SCL queson las
mismasparatodos) y asignarle una direccin. Los intercambios se realizaran
utilizando los mismos subprogramas para todos
La tensin de funcionamiento va de 2,5V a 5,5V y no es necesaria la presencia de
drivers de adaptacin de tensin externos (integracin en los propios dispositivos)

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP


ESTADOS EN EL BUS I2C: Inicio y Final de transferencia
En el ESTADO INACTIVO, las lneas SDA y SCL se encuentran a 1: los
transistores de las etapas de salida de todos los dispositivos se encuentran en
corte
El INICIO de transferencia se produce cuando aparece una transicin de 1 a 0
en la lnea SDA mantenindose la lnea de reloj SCL a 1

El FIN de transferencia es por transicin de 0 a 1 en SDA cuando SCL est a


1

nterface I2C en el mdulo SSP

START y STOP slo


pueden ser
generados
por el Maestro

nterface I2C en el mdulo SSP


Cuando un Maestro decide iniciar una transferencia, enva primero la direccin
del dispositivo con el que quiere hablar.
Todos los dispositivos escuchan para determinar si la direccin colocada en
el bus es la suya. Acompaando a la direccin aparece un bit R/W que indica al
esclavo destinatario si el Maestro quiere leer (recibir si R/W=1) del Esclavo o
si el Maestro quiere escribir (enviar si R/W=0) en el Esclavo.
El Maestro y el Esclavo direccionado se deben encontrarse siempre en estados
opuestos:
Maestro emite / Esclavo recibe
Maestro recibe / Esclavo emite
En cualquiera de los casos, el Maestro ser el que genere la seal de reloj en SCL
Si hay ms de un Maestro en el bus, se debe producir un arbitraje cuando SCL=1:
el Maestro que enva un 1 y detecta un 0 en la lnea SDA pierde en el
arbitraje y desactiva su salida de datos (aunque podra seguir generando flancos
en la lnea SCL hasta que finalizara el envo del byte donde perdi el control del
bus)

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP


Reconocimiento de Transferencia (ACK)
Los datos se transmiten en paquetes de 8 bits (bytes), no hay lmite en cuanto
a nmero de bytes, pero despus de cada byte se debe intercalar un bit de
reconocimiento (ACK) por parte del dispositivo receptor
Si es el Esclavo el receptor y
byte, el Maestro debe abortar

no genera el bit de reconocimiento despus de cada


la transferencia generando un bit de fin (STOP)

Si el dispositivo Maestro es el receptor, 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 en lugar de colocar un bit de
reconocimiento
Si el Esclavo necesita retardar el envo del siguiente byte (porque no lo tiene
todava disponible, p.e.), puede situar la lnea SCL en estado bajo y forzar al
Maestro a situarse en un estado de Espera puesto que no se podran generar
flancos en SCL

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP


Repeticin de START (Sr)
Si un dispositivo Maestro no desea abandonar el bus tras una transferencia, en
lugar de generar un bit de STOP y volver a generar el nuevo START, puede
generar una Repeticin de START (Sr)
La Repeticin de START es idntica a la condicin de START (SDA pasa de 1 a 0
con SCL en estado alto) pero se produce tras un pulso de reconocimiento de bus
(ACK) y no desde un estado inactivo

nterface I2C en el mdulo SSP


El interface I2C en los microcontroladores PIC
Existen dos tipos de mdulos SSP en los microcontroladores PIC:
BSSP Basic Synchronous Serial Port, que para el bus I2C implementa:
Modo Esclavo: completo por hardware
Modo Maestro: solo deteccin de bits de START y STOP por hardware,
(el resto debera realizarse por software)
Algunos PIC con BSSP: 16C64, 16C65, 16C73, 16C74,...
MSSP Master Synchronous Serial Port, que para el bus I2C implementa
Modo Esclavo: completo por hardware
Modo Maestro: completo por hardware
* Algunos PIC con MSSP: 16F87x
En lo relativo al modo SPI: BSSP y MSSP ambos son idnticos

nterface I2C en el mdulo SSP


Mdulo MSSP I2C

Implementa todas las funciones del Maestro y del Esclavo en un bus I2C por hardware
Permite detectar las condiciones START y STOP en el bus por interrupcin
Permite emplear direcciones de 7 de 10 bits como Esclavo
Se puede seleccionar uno de los siguientes modos de operacin:
- Esclavo I2C con direccin de 7 bits
- Esclavo I2C con direccin de 10 bits
- Maestro I2C con reloj SCL de frecuencia = Fosc/(4*(SSPADD+1))

El mdulo MSSP dispone de 6 registros asociados:


SSPCON
SSPCON2
SSPSTAT
SSPADD
SSPBUF
SSPSR

Registro de Control
Registro de Control 2
Registro de Estado
Registro de Direccin
Buffer de Transmisin/Recepcin
Registro de Desplazamiento Serie (no accesible)

nterface I2C en el mdulo SSP


Mdulo MSSP I2C: Diagrama de Bloques en MODO ESCLAVO

nterface I2C en el mdulo SSP


Mdulo MSSP I2C: MODO ESCLAVO
En modo ESCLAVO, los pines SCL y SDA se deben configurar siempre como entradas en
el TRISC, en el supuesto de que el mdulo deba manejar la lnea SDA/RC4 para realizar
un envo, la salida interna se superpondr al sentido definido con TRISC<4>=1
Cuando se da una coincidencia entre la direccin que aparece en el bus y la que
tiene asignada el Esclavo, el hardware generar de manera automtica el bit de
reconocimiento ACK sobre la lnea SDA, lo mismo suceder tras haber detectado
coincidencia en la direccin despus de cada dato que se complete salvo que los
flags BF (buffer lleno) SSPOV (overflow) estn activos:

nterface I2C en el mdulo SSP


I2C ESCLAVO: Direccionamiento
Despus de habilitar el mdulo MSSP, ste se queda esperando por una condicin
de START. Tras sta, se introducen 8 bits en SSPSR (SDA se muestrea en los
flancos de subida de SCL).
Se comparan 7 de los bits recibidos SSPSR<7:1> con la direccin almacenada en
SSPADD y si coincide y adems BF y SSPOV estn a 0, se dan los eventos:
a) SSPBUF se carga con el contenido de SSPSR
b) El flag BF se pone a 1 en el 8 flanco de bajada en SCL
c) Se genera un pulso de reconocimiento ACK
d) El flag SSPIF se pone a 1 en el 9 flanco de bajada de SCL

nterface I2C en el mdulo SSP


I2C ESCLAVO: Direccionamiento (II)
Si se emplea un modo de direccionamiento de 10 bits, se precisan dos bytes para
la recepcin de la direccin completa del esclavo
El primer byte est formado por el siguiente contenido: 1 1 1 1 0 A9 A8 0
los 5 primeros bits son fijos (11110) y luego aparecen los dos bits de mayor peso
de la direccin (A9 y A8) seguidos de un 0 para indicar escritura ya que el
esclavo debe recibir el segundo byte a continuacin.
En caso de coincidencia con el contenido de SSPADD, el flag UA (SSPSTAT<1>) se
pondr a 1 para indicar al esclavo que debe colocar el resto de la direccin en
SSPADD. Mientras tanto la lnea SCL queda retenida a 0 por el esclavo para que
le d tiempo a ste a colocar la segunda parte de la direccin.
En cuanto se carga el 2 byte en SSPADD, UA vuelve a 0 y SCL queda liberada
para que el Maestro vuelva a generar flancos.
Despus de recibir el 2 byte y haya coincidencia o no con la direccin, se debe
volver a cargar en SSPADD la parte alta de la direccin para el siguiente envo

nterface I2C en el mdulo SSP


I2C ESCLAVO: Recepcin
Se produce cuando hay una coincidencia de direccin y adems el bit R/W es 0
(el que acompaa a la direccin). En ese caso el bit R/W de SSPSTAT se pone a 0, se
genera el pulso de reconocimiento en SDA y la direccin recibida se carga en SSPBUF
(si no se di una condicin de overflow con BF SSPOV a 1)

nterface I2C en el mdulo SSP


I2C ESCLAVO: Transmisin
Se da si hay una coincidencia con la direccin en el bus y adems el bit R/W es 1
(el adjunto a la direccin). En ese caso el bit R/W de SSPSTAT se pone a 1, se genera
el pulso de reconocimiento en SDA y la direccin recibida se carga en SSPBUF.
Se retiene la generacin de reloj del Maestro porque el Esclavo mantiene SCL
a 0 mientras prepara el envo. El dato que el Esclavo debe enviar lo carga en SSPBUF
que a su vez carga a SSPSR. Para liberar la lnea SCL, se debe poner el bit CKP a 1
por software ya que se puso a 0 por hardware (CKP=SSPCON<4> est listo el dato)

nterface I2C en el mdulo SSP


I2C ESCLAVO: Transmisin (II)
Si al finalizar el envo de un byte por parte del Esclavo, el Maestro no sita el
pulso de reconocimiento en la lnea SDA (no hay ACK), se interpreta que se acab
la transferencia de datos, se resetea la lgica del Esclavo y queda a la espera
de un nuevo START
Si por el contrario, se recibe un ACK del Maestro, el Esclavo debe continuar enviando
bytes, para lo cual debe cargar el nuevo dato en SSPBUF y liberar la lnea SCL con CKP=1

nterface I2C en el mdulo SSP


I2C en el bus ESCLAVO: Llamada general I2C
La llamada general en el interface I2C es un envo con una direccin vlida para
todos los esclavos que se encuentren presentes en el bus. La direccin que coloca el
Maestro consiste en 7 ceros seguido de R/W = 0. En este caso, todos los Esclavos
deberan responder con el pulso de reconocimiento ACK.
Para el dispositivo Esclavo implementado con los microcontroladores PIC, esa
situacin se identifica si el bit GCEN (SSPCON2<7>) est a uno. Tras el bit de START,
se introducen los otros 8 bits en SSPSR y si coinciden con una llamada general, se
transfiere SSPSR a SSPBUF y se ponen a 1 los flags BF y SSPIF

nterface I2C en el mdulo SSP


I2C ESCLAVO: Funcionamiento en modo SLEEP
Si el dispositivo se ha definido como Esclavo, puede recibir direcciones y datos
aunque se encuentre dormido (SLEEP) ya que no tiene que generar el reloj SCL de
la transferencia sino que lo recibe.
Cuandose duna coincidencia entre la direccin que aparece en el bus y la asignada
al dispositivo o cuando se haya completado una transferencia, el microcontrolador
uede despertarse si las mscaras SSPIE y la de perifricos PEIE estn activadas.
Si adems lo est la mscara global GIE, se despierta con una interrupcin

nterface I2C en el mdulo SSP


Mdulo MSSP I2C: Diagrama de Bloques en MODO
MAESTRO

nterface I2C en el mdulo SSP


Mdulo MSSP I2C: MODO MAESTRO
En modo Maestro, las lneas SDA y SCL son manejadas por el hardware del
mdulo MSSP, no es necesario definir su direccin en TRISC
Se dispone de circuitos lgicos para deteccin de START (S) y STOP (P) y su
aparicin queda reflejada en los bits S y P de SSPSTAT. Estos bits son de slo
lectura y quedan a cero tras un reset o cuando el mdulo MSSP est desactivado
El flag SSPIF que permite interrupciones es sensible a los siguientes eventos:
- Condicin de START - Condicin de STOP
- Transferencia de un byte - Transmisin de ACK
- START repetido
En buses multi-Maestro, el control del mismo slo puede intentarse cuando el bit P
est a 1 cuando el bus est inactivo (S y P a 0). En este caso, la lnea SDA ser
monitorizada para el arbitraje y comprobar si el nivel presente coincide con el nivel
esperado y propuesto por el propio Maestro, esta verificacin la realiza el hardware
y el resultado queda reflejado en el bit de flag de colisiones BCLIF (PIR2<3>) si hay
discrepancia y podra generar interrupcin (su mscara es BCLIE = PIE2<3>).

nterface I2C en el mdulo SSP


I2C MAESTRO: GENERADOR DE RELACIN DE BAUDIOS (BRG)
El generador de relacin de baudios (BRG) empleado en el modo SPI es el utilizado
para generar la frecuencia del reloj SCL. La frecuencia viene dada por la expresin:
En I2C las frecuencias estndar son:
100kHz, 400kHz y 1MHz

Se emplean los 7 bits menos significativos del registro SSPADD. En modo Maestro
BRG se actualiza automticamente con el cambio en SSPADD, pero en un bus
multiMaestro, se carga cuando SCL pasa de 0 a estado alto

nterface I2C en el mdulo SSP


I2C MAESTRO: GENERADOR DE RELACIN DE BAUDIOS (II)
El contador BRG se decrementa dos veces por ciclo de instruccin, y marca un tiempo
TBRG patrn para establecer secuencias de STOP, START, etc
Contador descendente que
se decrementa 2 veces
por ciclo de instruccin
(en Q2 y Q4)
BRG

nterface I2C en el mdulo SSP


I2C MAESTRO: OPERACIN
El Maestro generar los flancos en SCL y las condiciones de START y STOP.
Una transferencia finaliza con una condicin de STOP (P) o con una repeticin de
START (Sr), en este caso se trata tambin del inicio de la siguiente transferencia
serie con lo que el bus I2C no quedara libre
El modoMaestro funciona poniendo a 1 0 los bits apropiados del registro
SSPCON y habilitando el mdulo con el bit SSPEN. Son posibles 6 acciones:
-Establecer una condicin de START en las lneas SDA y SCL (bit SEN)
- Escribir un dato en SSPBUF para iniciar una transmisin de dato o direccin
- Configurar la entrada I2C para recibir datos
(bit RCEN)
-Generarun pulso de reconocimiento (ACK)
(bit ACKEN)
-Generar una condicin de STOP en SDA y SCL
(bit PEN)
-Establecer una repeticin de START en lasmismaslneas
(bit RSEN)
Una accin generada por el Maestro debe esperar a que finalice la anterior (p.e. no se
puede escribir el dato en SSPBUF hasta que se haya completado la condicin START)

nterface I2C en el mdulo SSP


I2C MAESTRO: OPERACIN (II)
Debe quedar claro que las acciones que va ejecutando el Maestro son totalmente
independientes unas de otras.
Como ejemplo: no es posible realizar en un solo paso la generacin del bit de START
y el envo de la direccin del Esclavo (stas seran dos acciones independientes)
Para realizar una transferencia completa por parte de un Maestro, emitiendo o
recibiendo, ser preciso encadenar las diferentes acciones individuales de la manera
adecuada, interpretando los resultados obtenidos y los estados presentes en el bus
de manera previa a la ejecucin de la siguiente accin
Ser necesario que el Maestro compruebe que la accin que l est intentando
realizar, efectivamente se produce como verificacin a su dominio sobre el bus
Si el microcontrolador no dispusiera de mdulo MSSP para realizar las acciones por
hardware, debera ejecutar cada una de ellas mediante cdigo interno (firmware).
Tambin es posible que an disponiendo de mdulo MSSP, se prescinda de la
implementacin hardware y se realice tambin en el firmware

nterface I2C en el mdulo SSP


I2C MAESTRO: OPERACIN (III)
Ejemplo de Secuencia tpica de transmisin de un byte por parte del Maestro:
a) Se genera START poniendo a 1 el bit de habilitacin de START (SEN)
del registro SSPCON2
b) Se esperar el tiempo necesario para detectar START, cuando se haya dado la
condicin, SSPIF=1 (se debe poner a 0 por software)
c) Se carga SSPBUF con la direccin a enviar por el bus y el bit R/W=0 (dir. 7 bits)
d) Los bits de la direccin van saliendo por la lnea SDA hasta completar 8 bits
e) Se lee el bit de reconocimiento (ACK) recibido del esclavo y se introduce
ese bit en SSPCON2<6>
f) Al final del 9 flanco en SCL, se pone SSPIF=1 (hay que resetearlo)
g) Se cargan en SSPBUF los 8 bits del dato a enviar
h) Los bits del dato van saliendo por SDA hasta completar la trasnmisin
i) Se lee el bit de reconocimiento (ACK) y se graba su valor en SSPCON<6>
j) Al final del 9 flanco en SCL se pone el flag SSPIF a 1 (a 0 por programa)
k) Se genera una condicin de STOP poniendo a 1 el bit de habilitacin de STOP
(PEN) de SSPCON2
l) Una vez detectada la condicin de STOP, se pone a 1 el flag SSPIF

nterface I2C en el mdulo SSP


Accin 1 de MAESTRO I2C: Generacin de START
Para generar condicin de START, el usuario debe poner a 1 el bit SEN (SSPCON2<6>).
Si los pines SCL y SDA estn a 1, el generador de relacin de baudios (BRG) se carga con
el contenido de SSPADD<6:0> empezando a decrementarse. Si al llegar al final de la
cuenta (TBRG) se muestrean SCL y SDA y ambos permanecen a uno, el pin SDA se pone
en estado bajo (es por tanto condicin de START)
Si se detecta la condicin generada, el bit S (SSPSTAT<3>) se pone a 1, se cargar a
continuacin de nuevo BRG y cuando haya transcurrido TBRG, el bit SEN se pondr a 0
por hardware. Si se intenta escribir en SSPBUF durante secuencia de START,
entonces bit WCOL=1 y no cambia SSPBUF
Si SCL y SDA no estuvieran a 1, se
Generacin de START
considera colisin en el bus
(BCLIF=1),
se para la generacin de START
y se pasa a estado inactivo en I2C

nterface I2C en el mdulo SSP


MAESTRO I2C: COLISIONES
Resulta importante distinguir entre los flags WCOL y BCLIF ya que los dos son
indicadores de conceptos distintos de colisiones:
WCOL
es un indicador de colisin por acceso al registro SSPBUF debido
al intento de escritura en un estado no vlido del bus I2C si
el dispositivo es Maestro o con intento de escritura en SSPBUF
cuando todava se est enviando un dato anterior
BCLIF
es un indicador de colisin en el bus I2C (otro tipo por tanto),
se produce cuando estando la lnea SCL libre, y el estado esperado
en SDA es el 1 pero el muestreado resulta ser el 0.
La colisin puede darse durante un START, un STOP o una
Repeticin de START
BCLIF puede tener asociada una interrupcin

nterface I2C en el mdulo SSP


Accin 2 de MAESTRO I2C: Transmisin de un byte
El envo de un byte, sea direccin o dato se inicia con la escritura del mismo
en el registro SSPBUF. Esto har que el flag BF se ponga a 1 y que el BRG se ponga
en marcha. Cada bit saldr por SDA en los flancos de bajada de la lnea SCL.
Tras la salida del 8 bit por SDA, el flag BF se pone a 0 y el Maestro libera la lnea
SDA para que el Esclavo direccionado responda con el bit de reconocimiento (ACK).
El estado ACK se carga en el bit ACKSTAT (=SSPCON2<6>) en el flanco de bajada
del 9 pulso en SCL. Tras completar el dato, se da SSPIF=1 y la generacin de reloj se
suspende hasta que se escriba un nuevo dato en SSPBUF, la lnea SCL queda en estado
bajo y SDA no cambia

FLAGS en Transmisin
El flag BF (SSPSTAT<0>) es de solo lectura y se pone a 1 cuando se
escribe un byte en SSPBUF, vuelve a 0 cuando hayan sido enviados los 8 bits
El bit WCOL (SSPCON<7>) es de lectura/escritura y se pone a 1 cuando se intenta
escribir en SSPBUF en el transcurso de un envo. Debe ponerse a 0 por software
El bit ACKSTAT (SSPCON2<6>) es de lectura/escritura, se pone a 0 cuando el
esclavo ha enviado un bit de reconocimiento (ACK) y a 1 si no lo ha enviado

nterface I2C en el mdulo SSP


I2C MAESTRO: Cronograma de Transmisin de un byte

Transmisin del byte


de direccin

Transmisin del byte


de dato

nterface I2C en el mdulo SSP


Accin 3 de MAESTRO I2C: Recepcin de un byte
La recepcin de un byte se inicia con la puesta a 1 del bit de habilitacin de la
recepcin RCEN (SSPCON2<3>). Tras esa accin aparecern los flancos en la lnea SCL
e irn entrando los bits por la lnea SDA.
Cuando se hayan completado 8 flancos en SCL, el bit RCEN se pondr a 0 de manera
automtica, el contenido de SSPSR pasar a SSPBUF y flags BF y SSPIF se pondrn a 1.
El reloj dejar de generar flancos, se detendr y dejar la lnea SCL a 0
El MSSP quedar ahora inactivo y a la espera de otra accin. Cuando se lea SSPBUF,
el flag BF se pondr a 0 por hardware. El Maestro podra enviar ahora el bit de
reconocimiento al final de la recepcin poniendo el bit ACKEN=1 (SSPCON2<4>), pero
eso ya formara parte de otra accin

FLAGS en Recepcin
El flag BF (SSPSTAT<0>) en recepcin se pone a 1 cuando se carga
SSPBUF desde el registro SSPSR, se pondr a 0 cuando se haya ledo SSPBUF
El bit WCOL (SSPCON<7>) se pone a 1 cuando se intenta escribir en SSPBUF cuando
una recepcin est en curso (SSPBUF no cambia)
El bit SSPOV (SSPCON<6>) en recepcin se pone a 1 cuando se ha completado un dato
en SSPSR y el flag BF est todava a 1 por una recepcin previa

nterface I2C en el mdulo SSP


I2C MAESTRO: Cronograma de Recepcin de un byte

Recepcin
Recepcin
de
de
un
un byte
byte

Recepcin
Recepcin
de
de
otro
otro byte
byte

nterface I2C en el mdulo SSP


I2C MAESTRO: Cronograma de Recepcin de un byte (detalle)

SDA

SCL
SSPIF

BF

nterface I2C en el mdulo SSP


Accin 4 de MAESTRO I2C: Generacin de ACK
La secuencia de generacin de un pulso de reconocimiento (ACK) se activa mediante
el bit de habilitacin ACKEN (SSPCON2<4>). Si este bit est a 1, el pin SCL queda
retenido a 0 y el contenido del bit ACKDT (SSPCON2<5>) aparece en la lnea SDA.
Si se desea generar pulso de reconocimiento, se debe colocar ACKDT=0, si se desea
colocar no reconocimiento, ACKDT se debe poner a 1.
Los tiempos para generar el pulso ACK, se basan en el empleo del generador de baudios:
tras un tiempo TBRG la lnea SCL se libera (vuelve a 1). Tras detectar el flanco de
subida, permanece a 1 durante un tiempo TBRG. Transcurrido ese tiempo SCL vuelve
a 0, el bit ACKEN se borra de manera automtica y el mdulo MSSP pasa a inactivo
Generacin de ACK

nterface I2C en el mdulo SSP


Accin 5 de MAESTRO I2C: Generacin de STOP
La secuencia de STOP al final de una transmisin o recepcin en la lnea SDA se
consigue poniendo a 1 el bit PEN (SSPCON2<2>).
Al acabar una transmisin la lnea SCL queda en estado bajo, si el bit PEN se pone
a 1, la lnea SDA se pondr a 0, si se detecta esa situacin, el BRG (generador de
relacin de baudios) contabilizar un tiempo igual a TBRG y subir SCL a 1 y volver
a contabilizar el mismo tiempo TBRG para liberar la lnea SDA (STOP)
La condicin ser detectada por el bit P (SSPSTAT<4>) que se pone a 1, un tiempo T BRG
posterior, el bit PEN volver a 0 por el propio hardware

Generacin de STOP

nterface I2C en el mdulo SSP


Accin 6 de MAESTRO I2C: Repeticin de START
La repeticin de START se puede producir si el bus est desocupado y se activa
el bit RSEN (SSPCON2<1>). En ese momento se libera SDA que pasa a 1, tras un tiempo
TBRG SCL se libera tambin. SDA y SCL deben mantenerse ambos a 1 durante un tiempo
TBRG tras el cual se baja SDA manteniendo SCL a 1. Esta situacin debe permanecer
durante un tiempo TBRG equivalente (vase cronograma inferior).
Transcurrida esta secuencia, el bit RSEN pasa a 0 de modo automtico y deja la
lnea SDA a 0. Tan pronto como la condicin de START se detecta en las lneas del
bus, el bit S (SSPSTAT<3>) se pondr a 1. El flag SSPIF se pondr a 1 posteriormente
una vez transcurrido un tiempo TBRG

Repeticin de START

nterface I2C en el mdulo SSP


I2C Multi-MAESTRO: Arbitrajes y Colisiones
Es posible el funcionamiento de varios Maestros en un bus I2C si existe un mecanismo
de arbitraje entre ellos que haga posible que slo un Maestro est gobernando las lneas
SCL y SDA del bus durante una transferencia
SDA puede cambiar cuando SCL se encuentra estable. Si un Maestro coloca un 1
en su salida de datos en ese intervalo y detecta un 0 en SDA, determina que se ha
producido una COLISIN en el bus.
El efecto es que el flag BCLIF de ese Maestro se pone a 1 y este flag puede tener
asociada la generacin de una interrupcin. En caso de colisin se resetea el puerto I2C
y pasa a estado inactivo. Tras atender la interrupcin y cuando el bus se encuentre
libre otra vez, puede intentar iniciar una nueva transferencia
Colisin en lnea SDA

nterface I2C en el mdulo SSP

bit 7 SMP: Slew Rate Control bit


In Master or Slave mode:
1 = Slew rate control disabled for standard speed mode (100 kHz and 1 MHz)
0 = Slew rate control enabled for high-speed mode (400 kHz)
bit 6 CKE: SMBus Select bit
In Master or Slave mode:
1 = Enable SMBus specific inputs
0 = Disable SMBus specific inputs
bit 5 D/A: Data/Address bit
In Master mode:
Reserved.
In Slave mode:
1 = Indicates that the last byte received or transmitted was data
0 = Indicates that the last byte received or transmitted was address
bit 4 P: Stop bit
1 = Indicates that a Stop bit has been detected last
0 = Stop bit was not detected last
Note: This bit is cleared on Reset and when SSPEN is cleared.

nterface I2C en el mdulo SSP

bit 3 S: Start bit


1 = Indicates that a Start bit has been detected last
0 = Start bit was not detected last
Note: This bit is cleared on Reset and when SSPEN is cleared.
bit 2 R/W: Read/Write bit information (I2C mode only)
In Slave mode:
1 = Read
0 = Write
Note: This bit holds the R/W
bit information following the last address match. This bit is
only valid from the address match to the next Start bit, Stop bit or not ACK bit.
In Master mode:
1 = Transmit is in progress
0 = Transmit is not in progress
Note: ORing this bit with SEN, RSEN, PEN, RCEN or ACKEN will indicate
if the MSSP is
in Idle mode.

nterface I2C en el mdulo SSP

bit 1 UA: Update Address (10-bit Slave mode only)


1 = Indicates that the user needs to update the address in the SSPADD register
0 = Address does not need to be updated
bit 0 BF: Buffer Full Status bit
In Transmit mode:
1 = Receive complete, SSPBUF is full
0 = Receive not complete, SSPBUF is empty
In Receive mode:
1 = Data Transmit in progress (does not include the ACK
and Stop bits), SSPBUF is full
0 = Data Transmit complete (does not include the ACK
and Stop bits), SSPBUF is empty

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP


COMUNICACIN I2C en C (compiladores de CCS)
La implementacin de una comunicacin mediante bus I2C puede realizarse por
hardware (mediante el mdulo interno SSP) o por software. El modo Esclavo slo debe
utilizarse con el hardware del SSP. El funcionamiento en modo Maestro se implementa
por software salvo que se le indique lo contrario con una de las opciones
(NOFORCE_SW) de la directiva #USE I2C
El asistente de C permite configurar los pines que se van a utilizar en la
transferencia e inicia la directiva #USE I2C que se emplea para configurar
totalmente este tipo de transferencia:
MASTER
activa modo Maestro
SLAVE
activa modo Esclavo
SCL=
pin especifica el pin de reloj (pin es direccin SCL=PIN_B1)
SDA=
pin seala el pin de datos
ADDRESS= nn si el dispositivo es Esclavo se le asigna esta direccin
FAST
emplea la especificacin fast del I2C
SLOW
emplea especificacin slow
RESTART_WDT resetea el Watchdog si est esperando por lectura
FORCE_HW utiliza funciones I2C hardware
NOFORCE_SW obliga al uso de las funciones I2C hardware

Interface I2C
I2C en
SSP SSP
nterface
enelelmdulo
mdulo
Ejemplo:
#USE I2C(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0xA0, NOFORCE_SW)
La directiva citada tiene efecto sobre las siguientes funciones integradas de C:
i2c_start( )
i2c_stop( )
i2c_write( )
i2c_read( )
i2c_poll( )

generacin de condicin de START


generacin de condicin de STOP
escritura de un byte
lectura de un byte
comprobacin de recepcin de byte

nterface I2C en el mdulo SSP


Las
Las Funciones
Funciones Integradas
Integradas para
para la
la Comunicacin
Comunicacin mediante
mediante I2C
I2C
I2C_start(
I2C_start( ))
Esta
Esta funcin
funcin sirve
sirve para
para generar
generar un
un bit
bit de
de START
START en
en el
el bus
bus cuando
cuando el
el dispositivo
dispositivo es
es
Maestro.Tras
Maestro.Tras generar
generar el
el bit
bit de
de START
START en
en I2C,
I2C, la
la lnea
lnea de
de reloj
reloj SCL
SCL se
se mantiene
mantiene en
en estado
estado
bajo
bajo hasta
hasta que
que se
se llame
llame a
a la
la funcin
funcin I2C_WRITE(
I2C_WRITE( ).
). Si
Si se
se llama
llama a
a esta
esta funcin
funcin antes
antes de
de que
que
se
se llame
llame a
a la
la funcin
funcin I2C_stop(
I2C_stop( ),
), se
se genera
genera una
una condicin
condicin de
de repeticin
repeticin START
START (Restart)
(Restart)
I2C_stop(
I2C_stop( ))
Genera
Genera un
un bit
bit de
de STOP
STOP en
en el
el bus
bus I2C
I2C si
si el
el dispositivo
dispositivo es
es Maestro
Maestro
I2C_write(
I2C_write( )) ->
-> I2C_write(dato)
I2C_write(dato)
Enva
Enva un
un byte
byte a
a travs
travs del
del bus.
bus. Si
Si el
el dispositivo
dispositivo es
es Maestro,
Maestro, generar
generar lo
lo flancos
flancos en
en la
la lnea
lnea
de
de reloj
reloj SCL,
SCL, si
si es
es Esclavo
Esclavo esperar
esperar por
por la
la aparicin
aparicin de
de dichos
dichos flancos.
flancos. La
La funcin
funcin devuelve
devuelve
el
el bit
bit de
de ACK
ACK (0
(0 si
si hubo
hubo seal
seal de
de reconocimiento
reconocimiento y
y 11 si
si no
no la
la hubo)
hubo)
I2C_read(
I2C_read( )) ->
-> dato=I2C_read(
dato=I2C_read( )) o
o bien
bien dato=I2C_read(ack
dato=I2C_read(ack
Esta
Esta funcin
funcin sirve
sirve para
para leer
leer un
un byte
byte a
a travs
travs del
del bus
bus I2C.
I2C. En
En modo
modo Maestro,
Maestro, se
se generarn
generarn
los
los flancos
flancos en
en la
la seal
seal de
de reloj
reloj (SCL)
(SCL) y
y en
en modo
modo Esclavo
Esclavo esperar
esperar por
por la
la aparicin
aparicin de
de los
los
mismos.
mismos. No
No existe
existe lmite
lmite de
de tiempo
tiempo de
de espera
espera como
como Esclavo,
Esclavo, se
se deber
deber usar
usar la
la funcin
funcin
I2C_poll(
I2C_poll( )) para
para evitar
evitar el
el bloqueo
bloqueo del
del dispositivo.
dispositivo. El
El ack
ack es
es opcional
opcional y
y puede
puede ser
ser 11 (hay
(hay
reconocimiento,
reconocimiento, que
que es
es la
la opcin
opcin por
por defecto)
defecto)
0
0 (no
(no hay
hay reconocimiento)
reconocimiento)
I2C_poll(
I2C_poll( ))
Esta
Esta funcin
funcin slo
slo puede
puede utilizarse
utilizarse si
si el
el dispositivo
dispositivo dispone
dispone de
de mdulo
mdulo SSP
SSP y
y est
est
implementado
implementado el
el bus
bus I2C
I2C con
con su
su empleo.
empleo. Esta
Esta funcin
funcin devuelve
devuelve TRUE
TRUE si
si se
se ha
ha recibido
recibido un
un
byte
byte y
y ste
ste est
est disponible
disponible en
en el
el buffer.
buffer. Si
Si se
se devuelve
devuelve TRUE,
TRUE, la
la llamada
llamada a
a la
la funcin
funcin
I2C_read(
I2C_read( )) devuelve
devuelve de
de manera
manera inmediata
inmediata el
el byte
byte recibido.
recibido.

nterface I2C en el mdulo SSP


Ejemplos:
#USE I2C(MASTER, SDA=PIN_C4, SCL=PIN_C3)
//Dispositivo Maestro
Secuencia Lectura

i2c_start( );
//Se enva bit de START
i2c_write(0xA1);
//Direccin del Esclavo y peticin de lectura
dato_1=i2c_read( );
//Se generan flancos y se lee un dato
dato_2=i2c_read( 0 ); //se lee el siguiente dato y se enva NO ACK
i2c_stop( );
//Se manda bit de STOP

Sec. de Escritura
i2c_start( );
//Se enva bit de START
i2c_write(0xA0);
//Direccin del Esclavo y escritura posterior
i2c_write(hi(direccion));
//Se manda parte alta de una direccin
i2c_write(direccin);
//Se manda parte baja de la direccin
i2c_write(dato);
//Se enva el dato a grabar
i2c_stop( );
//Envo del bit de STOP

nterface I2C en el mdulo SSP


Un ejemplo como esclavo:
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xA0)

contador=0;
while (contador<10)
{
while(!i2c_poll( ));
buffer[contador++]=i2c_read( );
} //Espera y recibe 10 bytes como dispositivo esclavo
Otro ejemplo:
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3)
long comando;

i2c_start( );
//generacin de START
i2c_write(0xA0);
//Direccin de dispositivo y escritura
i2c_write(comando>>8); //envo de parte alta de comando
i2c_write(comando);
//envo de parte baja
i2c_stop( );
//envo de bit de STOP

nterface I2C en el mdulo SSP


Escritura/lectura de una EEPROM serie I2C.
Guarda y le los datos en las 10 primeras posiciones de memoria de una
EEPROM I2C. Representa los valores escritos y ledos en un Display LCD.

nterface I2C en el mdulo SSP


Escritura/lectura de una EEPROM serie I2C.
Guarda y le los datos en las 10 primeras posiciones de memoria de una
EEPROM iI2C. Representa los valores escritos y ledos en un Display LCD

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP


Ejemplo 2
Programa que lee la temperatura y hora de lectura y guarda los datos en una
EEPROM. Sensor de temperatura DS1621, reloj en tiemporeal Ds1307 y una
EEPROM M24512.

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

nterface I2C en el mdulo SSP

Anda mungkin juga menyukai