Está en la página 1de 25

PROTOCOLO I2C

Las funcione del módulo MSSP son habilitadas seteando el bit SSPEN. El
registro SSPCON1 permite el control del I2C.los bits del SSPCON1
(SSPM3;SSPM0) permiten 4 modos de operación:
 I2C Master mode, cloc I2C Slave mode (7-bit address)I2C Slave mode (10-
bit address)
 I2C Slave mode (7-bit address) with Start and Stop bit interrupts enabled
 I2C Slave mode (10-bit address) with Start and Stop bit interrupts enabled
 I2C Firmware Controlled Master mode, slave is Idle

REGISTROS
El MSSP tiene 6 registros de control del I2C:
1. SSPCON1
2. SSPCON2
3. SSPSTAT
4. SSPBUF
5. SSPSR
6. SSPADD

OPERACIÓN
Las funciones del módulo MSSP son habilitadas cuando SSPEN=1.EL registro
SSPCON1 permite el control del I2C.los bits (SSPCON1<3:0>) permite elmodo
selección del I2c:
•I2C Master mode, clock
• I2C Slave mode (7-bit address)
• I2C Slave mode (10-bit address)
• I2C Slave mode (7-bit address) with Start and Stop bit interrupts enabled
• I2C Slave mode (10-bit address) with Start and Stop bit interrupts enabled
• I2C Firmware Controlled Master mode, slave is Idle

Eligiendo cualquier modo I2C y con SSPEN=1 fuerza a los pines SDA y SCL
Estar en estado alto, estos pines son programados como entrada con la
instrucción TRIS. Para asegurar el funcionamiento apropiado del modulo, se
debe conectar resistencias pull up en las líneas SDA y SCL.

MODO ESCLAVO

En modo esclavo los pines SDA y SCL son configurados como entrada. Cuando
una dirección coincide, o la transferencia de datos después de recibir una
coincidencia de dirección, el hardware generará automáticamente el impulso de
Reconocimiento (ACK) y cargará el registro SSPBUF con el valor recibido
actualmente en el registro SSPSR.

Cualquier combinación de las siguientes condiciones causará El módulo MSSP


no da este impulso ACK.
El bit de búfer lleno, BF (SSPSTAT <0>), se estableció antes de que se recibiera
la transferencia.
• El bit de desbordamiento, SSPOV (SSPCON1 <6>), se estableció antes de que
se recibiera la transferencia.
En este caso, el valor del registro SSPSR no se carga en el SSPBUF, pero se
establece el bit SSPIF. El bit BF se borra al leer el registro SSPBUF, mientras
que el bit SSPOV se borra a través del software.
La entrada de reloj SCL debe tener un mínimo alto y bajo para que funcione
correctamente. Los tiempos altos y bajos de la especificación I2C, así como el
requisito del módulo MSSP, se muestran en el parámetro de temporización 100
y el parámetro 101.
DIRECIONAMIENTO
Una vez que el módulo MSSP se ha habilitado, espera a que se produzca una
condición de inicio. Tras la condición de inicio, los 8 bits se desplazan al registro
SSPSR. Todos los bits entrantes se muestrean con el flanco ascendente de la
línea del reloj (SCL). El valor del registro SSPSR <7: 1> se compara con el valor
del registro SSPADD. La dirección se compara en el flanco descendente del
pulso del octavo reloj (SCL). Si las direcciones coinciden y los bits BF y SSPOV
están claros, se producen los siguientes eventos:
1. El valor del registro SSPSR se carga en el registro SSPBUF.
2. Se establece el bit de búfer lleno, BF.
3. Se genera un pulso ACK.
4. El bit de indicador de interrupción MSSP, SSPIF, se establece (y la
interrupción se genera, si está habilitada) en el flanco descendente del noveno
impulso SCL.
En el modo de dirección de 10 bits, el esclavo debe recibir dos bytes de dirección.
Los cinco bits más significativos (MSbs) del primer byte de dirección especifican
si se trata de una dirección de 10 bits. El bit R / W (SSPSTAT <2>) debe
especificar una escritura para que el dispositivo esclavo reciba el segundo byte
de dirección. Para una dirección de 10 bits, el primer byte sería igual a "11110
A9 A8 0", donde "A9" y "A8" son los dos MSbs de la dirección. La secuencia de
eventos para la dirección de 10 bits es la siguiente, con los pasos 7 a 9 para el
transmisor-esclavo:
1. Recibir el primer (alto) byte de dirección (los bits SSPIF, BF y UA (SSPSTAT
<1>) se configuran en la coincidencia de direcciones).
2. Actualice el registro SSPADD con el segundo (bajo) byte de dirección (borra
el bit UA y libera la línea SCL).
3. Lea el registro SSPBUF (borra el bit BF) y borre el bit indicador SSPIF.
4. Recibir el segundo (bajo) byte de dirección (se establecen los bits SSPIF, BF
y UA).
5. Actualice el registro SSPADD con el primer byte (alto) de dirección. Si el
partido libera la línea SCL, esto borrará el bit UA.
6. Lea el registro SSPBUF (borra el bit BF) y borre el bit indicador SSPIF.
7. Recibe la condición de inicio repetido.
8. Recibir el primer (alto) byte de dirección (se establecen los bits SSPIF y BF).
9. Lea el registro SSPBUF (borra el bit BF) y borre el bit indicador SSPIF.
Enmascaramiento de direcciones
Enmascarar un bit de dirección hace que ese bit se convierta en un "no importa".
Cuando se enmascara un bit de dirección, se reconocerán dos direcciones y se
producirá una interrupción. Es posible enmascarar más de un bit de dirección a
la vez, lo que permite reconocer hasta 31 direcciones en modo de 7 bits y hasta
63 direcciones en modo de 10 bits.

RECEPCION
Cuando el bit R / W del byte de dirección está despejado y se produce una
coincidencia de dirección, se borra el bit R / W del registro SSPSTAT. La
dirección recibida se carga en el registro SSPBUF y la línea SDA se mantiene
baja (ACK).
Cuando existe la condición de desbordamiento de bytes de dirección, entonces
se da el impulso de no reconocimiento (ACK). Una condición de desbordamiento
se define cuando se establece el bit BF (SSPSTAT <0>) o el bit SSPOV
(SSPCON1 <6>).
Se genera una interrupción de MSSP para cada byte de transferencia de datos.
El bit de indicador de interrupción, SSPIF, debe borrarse en el software. El
registro SSPSTAT se utiliza para determinar el estado del byte.
Si SEN está habilitado (SSPCON2 <0> = 1), RB1 / AN10 / INT1 / SCK / SCL se
mantendrá bajo (extensión de reloj) después de cada transferencia de datos. El
reloj debe liberarse ajustando el bit, CKP (SSPCON1 <4>). Consulte la Sección
19.4.4 "Estiramiento del reloj" para obtener más detalles.
TRANSMISION:
Cuando se establece el bit R / W del byte de dirección entrante y se produce una
coincidencia de dirección, se establece el bit R / W del registro SSPSTAT. La
dirección recibida se carga en el registro SSPBUF. El impulso ACK se enviará
en el noveno bit y el pin RB1 / AN10 / INT1 / SCK / SCL se mantendrá bajo
independientemente de SEN (consulte la Sección 19.4.4 “Estiramiento del reloj”
para obtener más detalles). Al estirar el reloj, el maestro no podrá hacer valer
otro impulso de reloj hasta que el esclavo haya terminado de preparar los datos
de transmisión. Los datos de transmisión deben cargarse en el registro SSPBUF
que también carga el registro SSPSR. Luego, el pin RB1 / AN10 / INT1 / SCK /
SCL se debe habilitar configurando el bit, CKP (SSPCON1 <4>). Los ocho bits
de datos se desplazan en el borde descendente de la entrada SCL. Esto
garantiza que la señal SDA sea válida durante el tiempo alto de SCL (Figura 19-
10).
El impulso ACK del receptor maestro está bloqueado en el flanco ascendente del
noveno impulso de entrada SCL. Si la línea SDA es alta (no ACK), entonces la
transferencia de datos está completa. En este caso, cuando el ACK es bloqueado
por el esclavo, la lógica del esclavo se restablece (restablece el registro
SSPSTAT) y el esclavo supervisa para otra aparición del bit de Inicio. Si la línea
SDA era baja (ACK), los siguientes datos de transmisión deben cargarse en el
registro SSPBUF. De nuevo, el pin RB1 / AN10 / INT1 / SCK / SCL debe
habilitarse estableciendo el bit CKP (SSPCON1 <4>).
Se genera una interrupción de MSSP para cada byte de transferencia de datos.
El bit SSPIF debe borrarse en el software y el registro SSPSTAT se utiliza para
determinar el estado del byte. El bit SSPIF se establece en el flanco descendente
del noveno impulso de reloj.
ESTIRAMIENTO DE RELOJ
Los modos esclavo de 7 bits y de 10 bits implementan el estiramiento automático
del reloj durante una secuencia de transmisión. El bit SEN (SSPCON2 <0>)
permite que el estiramiento del reloj se habilite durante las recepciones. La
configuración de SEN hará que el pin SCL se mantenga bajo al final de cada
secuencia de recepción de datos.
Estiramiento de reloj para el modo de recepción esclavo de 7 bits (SEN = 1)
En el modo de recepción de esclavos de 7 bits, en el flanco descendente del
noveno reloj al final de la secuencia ACK si se establece el bit BF, el bit CKP en
el registro SSPCON1 se borra automáticamente, lo que obliga a mantener baja
la salida SCL. El bit CKP que se borra a "0" hará valer la línea SCL baja. El bit
CKP debe establecerse en el ISR del usuario antes de que la recepción pueda
continuar. Al mantener baja la línea SCL, el usuario tiene tiempo para reparar el
ISR y leer el contenido de la SSPBUF antes de que el dispositivo maestro pueda
iniciar otra secuencia de recepción. Esto evitará que se produzcan
desbordamientos de búfer (consulte la Figura 19-15).
Nota
1: Si el usuario lee el contenido del SSPBUF antes del flanco descendente del
noveno reloj, borrando así el bit BF, el bit CKP no se borrará y el estiramiento del
reloj no se producirá.
2: El bit CKP se puede configurar en el software independientemente del estado
del bit BF. El usuario debe tener cuidado de borrar el bit BF en el ISR antes de
la siguiente secuencia de recepción para evitar una condición de
desbordamiento.
Estiramiento de reloj para el modo de recepción esclavo de 10 bits (SEN =
1)
En el modo de recepción de esclavos de 10 bits durante la secuencia de
direcciones, el alargamiento del reloj se realiza automáticamente pero no se
borra el CKP. Durante este tiempo, si el bit UA se establece después del noveno
reloj, se inicia el alargamiento del reloj. El bit UA se establece después de recibir
el byte superior de la dirección de 10 bits y después de la recepción del segundo
byte de la dirección de 10 bits con el bit R / W borrado a "0". El lanzamiento de
la línea de reloj se produce al actualizar SSPADD. El estiramiento del reloj se
producirá en cada secuencia de recepción de datos como se describe en el modo
de 7 bits
Nota:
Si el usuario sondea el bit UA y lo borra actualizando el registro SSPADD antes
de que se produzca el flanco descendente del noveno reloj y si el usuario no ha
borrado el bit BF leyendo el registro SSPBUF antes de esa hora, entonces el bit
CKP seguirá NO se afirmará bajo. El alargamiento del reloj en función del estado
del bit BF solo se produce durante una secuencia de datos, no una secuencia de
direcciones
Estiramiento de reloj para el modo de transmisión esclavo de 7 bits
El modo de transmisión de esclavo de 7 bits implementa el estiramiento del reloj
borrando el bit CKP después del flanco descendente del noveno reloj si el bit BF
está despejado. Esto ocurre independientemente del estado del bit SEN.
El ISR del usuario debe establecer el bit CKP antes de que la transmisión pueda
continuar. Al mantener baja la línea SCL, el usuario tiene tiempo para reparar el
ISR y cargar el contenido de la SSPBUF antes de que el dispositivo maestro
pueda iniciar otra secuencia de transmisión (consulte la Figura 19-10).
Nota
1: Si el usuario carga el contenido de SSPBUF, configurando el bit BF antes del
flanco descendente del noveno reloj, el bit CKP no se borrará y el estiramiento
del reloj no se producirá.
2: El bit CKP se puede configurar en el software independientemente del estado
del bit BF.
Estiramiento de reloj para el modo de transmisión esclavo de 10 bits
En el modo de transmisión de esclavos de 10 bits, el alargamiento del reloj se
controla durante las dos primeras secuencias de direcciones mediante el estado
del bit UA, al igual que en el modo de recepción de esclavos de 10 bits. Las dos
primeras direcciones son seguidas por
una tercera secuencia de direcciones que contiene los bits de orden superior
de la dirección de 10 bits y el bit R / W establecido en "1". Después de realizar la
tercera secuencia de direcciones, el bit UA no se establece, el módulo ahora está
configurado en el modo de transmisión y el alargamiento del reloj se controla
mediante el indicador BF como en el modo de transmisión de esclavos de 7 bits
(consulte la Figura 19-13).
Sincronización de reloj y el bit CKP
Cuando se borra el bit CKP, la salida de SCL se fuerza a "0". Sin embargo, borrar
el bit CKP no hará que la salida de SCL sea baja hasta que la salida de SCL ya
esté muestreada en baja. Por lo tanto, el bit CKP no activará la línea SCL hasta
que un dispositivo maestro I2C externo ya haya afirmado la línea SCL. La salida
de SCL permanecerá baja hasta que se establezca el bit CKP y todos los demás
dispositivos en el bus I2C hayan desactivado la SCL. Esto garantiza que una
escritura en el bit CKP no violará el requisito de tiempo mínimo mínimo para SCL
(consulte la Figura 19-14).
SOPORTE DE DIRECCIÓN DE LLAMADA GENERAL
El procedimiento de direccionamiento para el bus I2C es tal que el primer byte
después de la condición de inicio generalmente determina qué dispositivo será
el esclavo direccionado por el maestro. La excepción es la dirección de llamada
general que puede abordar todos los dispositivos. Cuando se usa esta dirección,
todos los dispositivos deberían, en teoría, responder con un Reconocimiento.
La dirección de llamada general es una de las ocho direcciones reservadas para
fines específicos por el protocolo I2C. Consiste en todos los '0' con R / W = 0.
La dirección de llamada general se reconoce cuando el bit de habilitación de
llamada general (GCEN) está habilitado (conjunto SSPCON2 <7>). Después de
una detección de bit de inicio, 8 bits se desplazan al SSPSR y la dirección se
compara con el SSPADD. También se compara con la dirección general de
llamada y se arregla en hardware.
Si la dirección general de la llamada coincide, el SSPSR se transfiere a la
SSPBUF, se establece el bit de bandera BF (octavo bit) y en el borde
descendente del noveno bit (bit ACK), se establece la bit de bandera de
interrupción SSPIF. Cuando se atiende la interrupción, se puede verificar la
fuente de la interrupción leyendo el contenido de la SSPBUF. El valor se puede
usar para determinar si la dirección era específica del dispositivo o una dirección
de llamada general.
En el modo de 10 bits, se requiere que el SSPADD se actualice para que la
segunda mitad de la dirección coincida y se establezca el bit UA (SSPSTAT <1>).
Si la dirección de llamada general se muestrea cuando se establece el bit GCEN,
mientras que el esclavo se configura en el modo de Dirección de 10 bits, la
segunda mitad de la dirección no es necesaria, el bit UA no se configurará y el
esclavo comenzará a recibir Datos después del Reconocimiento (Figura 19-17).
Modo maestro
l modo maestro se habilita configurando y borrando los bits SSPM apropiados en
SSPCON1 y configurando el bit SSPEN. En el modo Maestro, las líneas SCL y
SDA son manipuladas por el hardware de MSSP si se establecen los bits TRIS.
La operación de modo maestro es compatible con la generación de
interrupciones en la detección de las condiciones de inicio y parada. Los bits de
parada (P) e inicio (S) se borran de un reinicio o cuando el módulo MSSP está
deshabilitado. Se puede tomar el control del bus I2C cuando se establece el bit
P o el bus está inactivo, con los bits S y P libres.
En el Modo maestro controlado por firmware, el código de usuario realiza todas
las operaciones del bus I2C basadas en Inicio y
Condiciones de bit de parada.
Una vez habilitado el modo Maestro, el usuario tiene seis opciones:
1. Afirmar una condición de inicio en SDA y SCL.
2. Afirmar una condición de inicio repetido en SDA y SCL.
3. Escriba en el registro SSPBUF iniciando la transmisión de datos / dirección.
4. Configure el puerto I2C para recibir datos.
5. Generar una condición de Reconocimiento al final.
de un byte de datos recibido.
6. Generar una condición de parada en SDA y SCL

Nota:
El módulo MSSP, cuando está configurado en el modo maestro I2C, no
permite la puesta en cola de eventos. Por ejemplo, al usuario no se le
permite iniciar una condición de Inicio e inmediatamente escribir el registro
SSPBUF para iniciar la transmisión antes de que se complete la condición
de Inicio. En este caso, no se escribirá el SSPBUF y se establecerá el bit
WCOL, lo que indica que no se produjo una escritura en el SSPBUF.
Los siguientes eventos harán que se establezca el bit de indicador de
interrupción de MSSP, SSPIF (y la interrupción de MSSP, si está habilitado):
• Condición de inicio
• Detener la condición
• Byte de transferencia de datos transmitido / recibido
• Confirmar transmitir
• Inicio repetido

Operación del modo maestro I2C


El dispositivo maestro genera todos los pulsos de reloj serie y las condiciones de
Inicio y Parada. Una transferencia termina con una condición de detención o con
una condición de inicio repetido. Dado que la condición de inicio repetido también
es el comienzo de la próxima transferencia en serie, el bus I2C no se liberará.
En el modo Transmisor maestro, los datos en serie se emiten a través de SDA,
mientras que SCL envía el reloj en serie. El primer byte transmitido contiene la
dirección del esclavo del dispositivo receptor (siete bits) y el bit de lectura /
escritura (R / W). En este caso, el bit R / W será lógico "0". Los datos en serie se
transmiten ocho bits a la vez. Después de que se transmite cada byte, se recibe
un bit de acuse de recibo. Las condiciones de inicio y parada se emiten para
indicar el comienzo y el final de una transferencia en serie.
En el modo de recepción maestra, el primer byte transmitido contiene la dirección
del esclavo del dispositivo de transmisión (7 bits) y el bit R / W. En este caso, el
bit R / W será lógico "1". Por lo tanto, el primer byte transmitido es una dirección
de esclavo de 7 bits seguida de un "1" para indicar el bit de recepción.
Los datos en serie se reciben a través de SDA, mientras que SCL envía el reloj
en serie. Los datos en serie se reciben ocho bits a la vez. Después de recibir
cada byte, se transmite un bit de acuse de recibo. Las condiciones de inicio y
parada indican el comienzo y el final de la transmisión.
El generador de velocidad en baudios utilizado para la operación en modo SPI
se usa para configurar la frecuencia de reloj SCL para una operación I2C de 100
kHz, 400 kHz o 1 MHz. Consulte la Sección 19.4.7 "Velocidad de transmisión"
para obtener más detalles.
Una secuencia de transmisión típica sería la siguiente:
1. El usuario genera una condición de inicio configurando el bit de activación de
inicio, SEN (SSPCON2 <0>).
2. Se establece SSPIF. El módulo MSSP esperará la hora de inicio requerida
antes de que se realice cualquier otra operación.
3. El usuario carga el SSPBUF con la dirección del esclavo para transmitir.
4. La dirección se desplaza fuera del pin SDA hasta que se transmiten los ocho
bits.
5. El módulo MSSP cambia el bit ACK del dispositivo esclavo y escribe su valor
en el registro SSPCON2 (SSPCON2 <6>).
6. El módulo MSSP genera una interrupción al final del noveno ciclo de reloj al
configurar el bit SSPIF.
7. El usuario carga el SSPBUF con ocho bits de datos.
8. Los datos se desplazan fuera del pin SDA hasta que se transmiten los ocho
bits.
9. El módulo MSSP cambia el bit ACK del dispositivo esclavo y escribe su valor
en el registro SSPCON2 (SSPCON2 <6>).
10. El módulo MSSP genera una interrupción al final del noveno ciclo de reloj al
configurar el bit SSPIF.
11. El usuario genera una condición de parada al configurar el bit de habilitación
de parada, PEN (SSPCON2 <2>).
12. La interrupción se genera una vez que se completa la condición de detención.
BAUD RATE
n el modo maestro I2C, el valor de recarga del generador de velocidad en
baudios (BRG) se coloca en los siete bits más bajos del registro SSPADD (Figura
19-19). Cuando se produce una escritura en SSPBUF, el generador de velocidad
de transmisión comenzará automáticamente a contar. El BRG realiza una cuenta
regresiva a "0" y se detiene hasta que se haya producido otra recarga. El conteo
de BRG se reduce dos veces por ciclo de instrucción (TCY) en los relojes Q2 y
Q4. En el modo I2C Master, el BRG se vuelve a cargar automáticamente.
Una vez que se completa la operación dada (es decir, la transmisión del último
bit de datos es seguida por ACK), el reloj interno detendrá automáticamente el
conteo y el pin SCL permanecerá en su último estado.
La Tabla 19-3 muestra las velocidades de reloj basadas en los ciclos de
instrucción y el valor BRG cargado en SSPADD.

Reloj de arbitraje
El arbitraje de reloj ocurre cuando el maestro, durante cualquier condición de
recepción, transmisión o inicio / parada repetida, desactiva el pin SCL (se permite
que el SCL flote alto). Cuando se permite que el pin SCL flote alto, el generador
de velocidad en baudios (BRG) se suspende desde el conteo hasta que el pin
SCL realmente se muestrea alto. Cuando el pin SCL se muestrea alto, el
generador de velocidad de transmisión se vuelve a cargar con el contenido de
SSPADD <6: 0> y
comienza a contar. Esto garantiza que el tiempo alto de SCL siempre será al
menos un conteo de reinversión de BRG en el caso de que un dispositivo externo
mantenga el reloj bajo (Figura 19-20).
I2C MODO PRINCIPAL TIEMPO DE CONDICIÓN DE INICIO
Para iniciar una condición de inicio, el usuario establece el bit de activación de
inicio, SEN (SSPCON2 <0>). Si los pines SDA y SCL se muestrean alto, el
generador de velocidad en baudios se vuelve a cargar con el contenido de
SSPADD <6: 0> y comienza su conteo. Si SCL y SDA se muestrean alto cuando
el tiempo de espera del generador de velocidad de transmisión (TBRG), el pin
SDA está bajo. La acción de que el SDA sea controlado mientras SCL está alto
es la condición de Inicio y hace que se establezca el bit S (SSPSTAT <3>). A
continuación, el generador de velocidad en baudios se vuelve a cargar con el
contenido de
SSPADD <6: 0> y reanuda su conteo. Cuando el Generador de velocidad en
baudios se agota (TBRG), el bit SEN (SSPCON2 <0>) se borrará
automáticamente con el hardware, el Generador de velocidad en baudios se
suspenderá, dejando la línea SDA baja y la condición de inicio se habrá
completado.
Nota:
Si al comienzo de la condición de inicio, los pines SDA y SCL ya se han
muestreado bajo, o si durante la condición de inicio, la línea SCL se
muestrea bajo antes de que la línea SDA esté baja, se produce una colisión
del bus, el indicador de interrupción de colisión del bus , BCLIF, está
establecido, la condición de inicio se cancela y el módulo I2C se restablece
a su estado inactivo.
Bandera de estado de WCOL
Si el usuario escribe el SSPBUF cuando hay una secuencia de Inicio en curso,
el bit WCOL se establece y el contenido del búfer no cambia (la escritura no se
produce).
Nota:
Debido a que la cola de eventos no está permitida, la escritura en los cinco
bits inferiores de SSPCON2 se deshabilita hasta que se completa la
condición de Inicio.
I2C MODO PRINCIPAL REPETIÓ EL TIEMPO DE CONDICIÓN DE INICIO
Se produce una condición de inicio repetido cuando el bit RSEN (SSPCON2 <1>)
está programado alto y el módulo lógico I2C está en estado inactivo. Cuando se
establece el bit RSEN, el pin SCL se afirma bajo. Cuando el pin SCL se muestrea
bajo, el generador de velocidad en baudios se carga con el contenido de
SSPADD <5: 0> y comienza a contar. El pin SDA se libera (elevado) para un
recuento de generador de velocidad de transmisión (TBRG). Cuando el
Generador de velocidad en baudios se agota, si se extrae SDA, se desactiva
(fija) el pin SCL. Cuando se muestrea SCL
alto, el generador de velocidad en baudios se vuelve a cargar con el contenido
de SSPADD <6: 0> y comienza a contar. SDA y SCL deben muestrearse alto
para un TBRG. Esta acción es seguida por la afirmación del pin SDA (SDA = 0)
para un TBRG mientras SCL es alto. Después de esto, el bit RSEN (SSPCON2
<1>) se borrará automáticamente y el generador de velocidad en baudios no se
volverá a cargar, dejando el pin SDA bajo. Tan pronto como se detecte una
condición de inicio en los pines SDA y SCL, se establecerá el bit S (SSPSTAT
<3>). El bit SSPIF no se establecerá hasta que se agote el tiempo de espera del
generador de velocidad en baudios.
Nota
1: Si RSEN está programado mientras hay algún otro evento en curso, no
tendrá efecto.
2: se produce una colisión de bus durante la condición de inicio repetido
si:
• SDA se muestrea bajo cuando SCL va de bajo a alto.
• SCL baja antes de que SDA sea bajo. Esto puede indicar que otro maestro
está intentando transmitir un dato '1'.
Inmediatamente después de establecer el bit SSPIF, el usuario puede escribir el
SSPBUF con la dirección de 7 bits en el modo de 7 bits o la primera dirección
predeterminada en el modo de 10 bits. Después de que se transmiten los
primeros ocho bits y se recibe un ACK, el usuario puede transmitir otros ocho
bits de dirección (modo de 10 bits) u ocho bits de datos (modo de 7 bits).
Bandera de estado de WCOL
Si el usuario escribe el SSPBUF cuando se está ejecutando una secuencia de
inicio repetido, se establece el bit WCOL y el contenido del búfer no se modifica
(la escritura no se produce).
Nota:
Debido a que la cola de eventos no está permitida, la escritura de los cinco
bits inferiores de SSPCON2 se deshabilita hasta que se completa la
condición de inicio repetido.

TRANSMISIÓN DE MODO MAESTRA I2C


La transmisión de un byte de datos, una dirección de 7 bits o la otra mitad de una
dirección de 10 bits se realiza simplemente escribiendo un valor en el registro
SSPBUF. Esta acción establecerá el bit de bandera de Buffer Full, BF y permitirá
que el generador de velocidad de transmisión comience a contar y comience la
próxima transmisión. Cada bit de dirección / datos se desplazará hacia fuera en
el pin SDA después de que se confirme el flanco descendente de SCL (consulte
el parámetro de especificación de tiempo de retención de datos 106). SCL se
mantiene bajo para un recuento de reinversión del generador de velocidad de
transmisión (TBRG). Los datos deben ser válidos antes de que se lance SCL alto
(consulte el parámetro de especificación de tiempo de configuración de datos
107). Cuando el pin SCL se libera alto, se mantiene así para TBRG. Los datos
en el pin SDA deben permanecer estables durante ese tiempo y cierto tiempo de
espera después del siguiente flanco descendente de SCL. Una vez que se
desplaza el octavo bit (el borde descendente del octavo reloj), se borra el
indicador BF y el maestro libera SDA. Esto permite que el dispositivo esclavo
que está siendo direccionado responda con un bit ACK durante el noveno bit si
un
coincidencia de dirección se produjo, o si los datos se recibieron correctamente.
El estado de ACK se escribe en el bit ACKDT en el flanco descendente del
noveno reloj. Si el maestro recibe una confirmación, el bit de estado de
confirmación, ACKSTAT, se borra. Si no, el bit se establece. Después del noveno
reloj, el bit SSPIF se establece y el reloj maestro (Generador de velocidad en
baudios) se suspende hasta que el siguiente byte de datos se carga en el
SSPBUF, dejando SCL bajo y SDA sin cambios (Figura 19-23).
Después de la escritura en el SSPBUF, cada bit de la dirección se desplazará
hacia afuera en el borde descendente de SCL hasta que se completen los siete
bits de dirección y el bit R / W. En el flanco descendente del octavo reloj, el
maestro desactivará el pin SDA, permitiendo que el esclavo responda con un
Reconocimiento. En el borde descendente del noveno reloj, el maestro tomará
muestras del pin SDA para ver si la dirección fue reconocida por un esclavo. El
estado del bit ACK se carga en el bit de estado ACKSTAT (SSPCON2 <6>).
Después del borde descendente de la transmisión de la dirección del noveno
reloj, se establece el SSPIF, se borra el indicador BF y se desactiva el generador
de velocidad en baudios hasta que se realiza otra escritura en el SSPBUF,
manteniendo el SCL bajo y permitiendo que el SDA flote.
Bandera de estado BF
En el modo de transmisión, el bit BF (SSPSTAT <0>) se establece cuando la
CPU escribe en SSPBUF y se borra cuando se eliminan los ocho bits.
Bandera de estado de WCOL
Si el usuario escribe el SSPBUF cuando ya hay una transmisión en curso (es
decir, el SSPSR todavía está desplazando un byte de datos), se establece el bit
WCOL y el contenido del búfer no cambia (la escritura no ocurre) después de 2
TCY después de la escritura SSPBUF. Si SSPBUF se reescribe dentro de 2 TCY,
se establece el bit WCOL y se actualiza SSPBUF. Esto puede resultar en una
transferencia dañada. El usuario debe verificar que el WCOL esté despejado
después de cada escritura en SSPBUF para garantizar que la transferencia sea
correcta. En todos los casos, WCOL se debe borrar en el software.
Bandera de estado ACKSTAT
En el modo de Transmisión, el bit ACKSTAT (SSPCON2 <6>) se borra cuando
el esclavo envía un Reconocimiento (ACK = 0) y se establece cuando el esclavo
no Reconoce (ACK = 1). Un esclavo envía un Reconocimiento cuando ha
reconocido su dirección (incluida una llamada general), o cuando el esclavo ha
recibido correctamente sus datos.
2C RECEPCION MODO MASTER
La recepción del modo maestro se habilita mediante la programación del bit de
habilitación de recepción, RCEN (SSPCON2 <3>).
Nota:
El módulo MSSP debe estar en estado inactivo antes de que se establezca
el bit RCEN o se ignorará el bit RCEN.
El generador de velocidad en baudios comienza a contar y en cada reinversión,
el estado del pin SCL cambia (alto a bajo / bajo a alto) y los datos son cambiado
a la SSPSR. Después del flanco descendente del octavo reloj, el indicador de
habilitación de recepción se borra automáticamente, los contenidos del SSPSR
se cargan en el SSPBUF, se establece el bit del indicador BF, se establece el bit
del indicador SSPIF y se suspende el generador de velocidad en baudios. ,
manteniendo bajo SCL. El MSSP está ahora en estado inactivo en espera del
siguiente comando. Cuando la CPU lee el búfer, el bit de bandera BF se borra
automáticamente. Luego, el usuario puede enviar un bit de confirmación al final
de la recepción configurando el bit de activación de secuencia de confirmación,
ACKEN (SSPCON2 <4>).
Bandera de estado BF
En la operación de recepción, el bit BF se establece cuando una dirección o un
byte de datos se carga en SSPBUF desde SSPSR. Se borra cuando se lee el
registro SSPBUF.
Indicador de estado de SSPOV
En la operación de recepción, el bit SSPOV se establece cuando se reciben ocho
bits en el SSPSR y el bit de bandera BF ya está establecido desde una recepción
anterior.
Bandera de estado de WCOL
Si el usuario escribe el SSPBUF cuando ya hay una recepción en curso (es decir,
el SSPSR todavía está cambiando en un byte de datos), el bit WCOL se
establece y el contenido del búfer no cambia (la escritura no ocurre).
RECONOCIENDO EL TIEMPO DE LA SECUENCIA
Una secuencia de confirmación se habilita configurando el bit de activación de
secuencia de confirmación, ACKEN (SSPCON2 <4>). Cuando se establece este
bit, el pin SCL se baja y el contenido del bit de datos de reconocimiento se
presenta en el pin SDA. Si el usuario desea generar un reconocimiento, entonces
el bit ACKDT debe ser borrado. De lo contrario, el usuario debe establecer el bit
ACKDT antes de iniciar una secuencia de Reconocimiento. El generador de
velocidad en baudios luego cuenta para un período de reinversión (TBRG) y el
pin SCL se desactiva (se coloca alto). Cuando el pin SCL es muestreado alto
(arbitraje de reloj), el generador de velocidad en baudios cuenta para TBRG. El
pasador SCL se tira hacia abajo. Después de esto, el bit ACKEN se borra
automáticamente, el generador de velocidad en baudios se apaga y el módulo
MSSP entra en un estado inactivo (Figura 19-25)

Bandera de estado de WCOL


Si el usuario escribe el SSPBUF cuando se está ejecutando una secuencia de
Reconocimiento, entonces WCOL se establece y el contenido del búfer no
cambia (la escritura no se produce).
DETENER EL TIEMPO DE CONDICIÓN
Se establece un bit de parada en el pin SDA al final de una recepción /
transmisión al establecer el bit de habilitación de parada, PEN (SSPCON2 <2>).
Al final de una recepción / transmisión, la línea SCL se mantiene baja después
del borde descendente del noveno reloj. Cuando se establece el bit PEN, el
maestro afirmará que la línea SDA está baja. Cuando la línea SDA se muestrea
bajo, el generador de velocidad en baudios se vuelve a cargar y cuenta atrás
hasta "0". Cuando el Generador de velocidad en baudios se agote, el pin SCL
será elevado y un TBRG (Recuento de reinversión del generador de tasa en
baudios) más tarde, el pin SDA se desactivará. Cuando el pin SDA se muestra
alto mientras SCL es alto, se establece el bit P (SSPSTAT <4>). Un TBRG más
tarde, el bit PEN se borra y el bit SSPIF se establece (Figura 19-26).
Bandera de estado de WCOL
Si el usuario escribe el SSPBUF cuando se está ejecutando una secuencia de
detención, entonces se establece el bit WCOL y el contenido del búfer no se
modifica (la escritura no se produce).
Operacion del sueño
Mientras está en el modo de Suspensión, el módulo I2C puede recibir direcciones
o datos y, cuando se produce una coincidencia de direcciones o se realiza una
transferencia de bytes completa, active el procesador desde la Suspensión (si la
interrupción de MSSP está habilitada).
EFECTOS DE UN RESET
Un reinicio desactiva el módulo MSSP y termina la transferencia actual.
MODO MULTIMASTER
En el modo Multi-Master, la generación de interrupciones en la detección de las
condiciones de Inicio y Parada permite determinar cuándo está libre el bus. Los
bits de parada (P) e inicio (S) se borran de un reinicio o cuando el módulo MSSP
está deshabilitado. El control del bus I2C puede tomarse cuando se establece el
bit P (SSPSTAT <4>), o el bus está inactivo, con los bits S y P despejados.
Cuando el bus está ocupado, habilitar la interrupción MSSP generará la
interrupción cuando ocurra la condición de parada.
En la operación de maestro múltiple, la línea SDA debe ser monitoreada para
arbitraje para ver si el nivel de señal es el nivel de salida esperado. Esta
comprobación se realiza de forma incorrecta con el resultado colocado en el bit
BCLIF.
Los estados donde se puede perder el arbitraje son:
• Transferencia de dirección
• Transferencia de datos
• Una condición de inicio
• Una condición de inicio repetido
• Una condición de reconocimiento

COMUNICACIÓN MULTIMESTER, COLISIÓN DE AUTOBUSES Y ARBITRAJE DE AUTOBUS


El soporte del modo Multi-Master se logra mediante el arbitraje de bus. Cuando
el maestro emite bits de dirección / datos en el pin SDA, el arbitraje tiene lugar
cuando el maestro emite un "1" en SDA, al permitir que SDA flote alto y otro
maestro afirme un "0". Cuando el pin SCL flota alto, los datos deben ser estables.
Si los datos esperados en SDA son un '1' y los datos muestreados en el pin SDA
= 0, entonces se ha producido una colisión de bus. El maestro configurará el
indicador de interrupción de colisión del bus, BCLIF y restablecerá el puerto I2C
a su estado inactivo (Figura 19-27).
Si se produjo una transmisión cuando se produjo la colisión del bus, se detiene
la transmisión, se borra el indicador BF, se desactivan las líneas SDA y SCL y
se puede escribir en el SSPBUF. Cuando el usuario atiende la rutina del servicio
de interrupción por colisión del bus y si el bus I2C está libre, el usuario puede
reanudar la comunicación al afirmar una condición de inicio.
Si una condición de Inicio, Inicio repetido, Parada o Reconocimiento estaba en
curso cuando ocurrió la colisión del bus, la condición se cancela, las líneas SDA
y SCL se desactivan y los bits de control respectivos en el registro SSPCON2 se
borran. Cuando el usuario atiende la rutina del servicio de interrupción por
colisión del bus y si el bus I2C está libre, el usuario puede reanudar la
comunicación al afirmar una condición de inicio.
El maestro continuará monitoreando los pines SDA y SCL. Si se produce una
condición de parada, se establecerá el bit SSPIF.
La escritura TA en el bit SSPBUF iniciará la transmisión de datos en el primer bit
de datos, independientemente de dónde se detuvo el transmisor cuando ocurrió
la colisión del bus.
En el modo Multi-Master, la generación de interrupciones en la detección de las
condiciones de Inicio y Parada permite determinar cuándo está libre el bus. El
control del bus I2C se puede tomar cuando el bit P se establece en el registro
SSPSTAT, o el bus está inactivo y los bits S y P se borran.

Colisión de autobús durante una condición de arranque


Durante una condición de arranque, se produce una colisión de autobús si:
a) SDA o SCL se muestrean bajo al comienzo de la condición de Inicio (Figura
19-28).
b) Se toma una muestra baja de SCL antes de que se establezca SDA bajo
(Figura 19-29).
Durante una condición de inicio, se supervisan los pines SDA y SCL.
Si el pin SDA ya está bajo, o el pin SCL ya está bajo, entonces ocurrirá todo lo
siguiente:
• la condición de inicio es abortada,
• el indicador BCLIF está establecido y
• el módulo MSSP se restablece a su estado inactivo (Figura 19-28). La condición
de inicio comienza con los pines SDA y SCL desactivados. Cuando el pin SDA
se toma una muestra alta, el generador de velocidad en baudios se carga desde
SSPADD <6: 0> y cuenta regresiva hasta "0". Si el pin SCL se muestrea bajo
mientras el SDA es alto, se produce una colisión en el bus porque se supone que
otro maestro está intentando manejar un dato '1' durante la condición de inicio.
Si el pin SDA se muestrea bajo durante este conteo, el BRG se restablece y la
línea SDA se afirma antes (Figura 19-30). Sin embargo, si se muestrea un ‘1’ en
el pin SDA, el pin SDA se establece bajo al final del recuento BRG. El generador
de velocidad en baudios se vuelve a cargar y cuenta regresiva a "0". Si el pin
SCL se muestrea como "0", durante este tiempo no se produce una colisión de
bus. Al final de la cuenta de BRG, el pin SCL se afirma bajo.
Nota:
La razón por la que la colisión del bus no es un factor durante una
condición de inicio es que no hay dos maestros de bus que puedan afirmar
una condición de inicio al mismo tiempo. Por lo tanto, un maestro siempre
hará valer SDA antes que el otro. Esta condición no provoca una colisión
del bus porque se debe permitir que los dos maestros arbitren la primera
dirección después de la condición de inicio. Si la dirección es la misma, se
debe permitir que el arbitraje continúe en la parte de datos, las condiciones
de inicio repetido o parada.
Colisión en el autobús durante una condición de arranque repetido
Durante una condición de inicio repetido, se produce una colisión de bus si:
a) Se muestrea un nivel bajo en SDA cuando SCL pasa de nivel bajo a nivel alto.
b) SCL baja antes de que SDA sea bajo, lo que indica que otro maestro está
intentando transmitir un dato '1'.
Cuando el usuario desactiva SDA y se permite que el pin flote alto, el BRG se
carga con SSPADD <6: 0> y cuenta atrás hasta "0". El pin SCL luego se
desactiva y cuando se muestrea alto, se muestrea el pin SDA.
Si el SDA es bajo, se ha producido una colisión en el bus (es decir, otro maestro
está intentando transmitir un dato '0', consulte la Figura 19-31). Si SDA se toma
una muestra alta, el BRG se vuelve a cargar y comienza a contar. Si SDA pasa
de alto a bajo antes de que se agote el tiempo de espera de BRG, no se produce
una colisión de bus porque no hay dos maestros que puedan hacer valer SDA
exactamente al mismo tiempo.
Si SCL va de alto a bajo antes de que se agote el tiempo de espera de BRG y
no se haya confirmado la SDA, se produce una colisión de bus. En este caso,
otro maestro está intentando transmitir un ‘1’ durante la condición de inicio
repetido (consulte la Figura 19-32).
Si, al final del tiempo de espera de BRG, tanto el SCL como el SDA siguen siendo
altos, el pin SDA se baja y el BRG se vuelve a cargar y comienza a contar. Al
final del recuento, independientemente del estado del pin SCL, el pin SCL se
baja y se completa la condición de inicio repetido.
Colisión de autobús durante una condición de parada
La colisión del autobús ocurre durante una condición de parada si:
a) Una vez que el pin SDA se ha desensamblado y se le ha permitido flotar alto, se toma
una muestra baja de SDA después de que el BRG haya caducado.
b) Una vez que se ha desactivado el pin SCL, se muestrea bajo SCL antes de que el SDA
se ponga alto.
La condición de paro comienza con un SDA afirmado bajo. Cuando se muestrea bajo
SDA, se permite que el pin SCL flote. Cuando el pin se muestrea alto (arbitraje de reloj),
el generador de velocidad en baudios se carga con SSPADD <6: 0> y cuenta atrás hasta
"0". Después de que se agote el tiempo de espera de BRG, se muestrea SDA. Si el SDA
se muestrea bajo, se ha producido una colisión de bus. Esto se debe a que otro maestro
ha intentado controlar un ‘0’ (Figura 19-33). Si el pin SCL se muestrea bajo antes de que
se permita que SDA flote alto, un bus
se produce colisión Este es otro caso de otro maestro que intenta manejar un '0' de
datos (Figura 19-34).
SSPSTAT: MSSP STATUS REGISTER (I2C™ MODE)

SMP CKE D/A P S R/W UA BF

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)
1 = Indicates that a Stop bit has been detected last
0 = Stop bit was not detected last
bit 3 S: Start bit(1)
1 = Indicates that a Start bit has been detected last
0 = Start bit was not detected last
bit 2 R/W: Read/Write Information bit(2,3)
In Slave mode:
1 = Read
0 = Write
In Master mode:
1 = Transmit is in progress
0 = Transmit is not in progress
bit 1 UA: Update Address bit (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 = SSPBUF is full
0 = SSPBUF is empty
In Receive mode:
1 = SSPBUF is full (does not include the ACK and Stop bits)
0 = SSPBUF is empty (does not include the ACK and Stop bits)

Note 1: This bit is cleared on Reset and when SSPEN is cleared.


2: 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.
3: ORing this bit with SEN, RSEN, PEN, RCEN or ACKEN will indicate if the MSSP is in Active mode.

SSPCON1: MSSP CONTROL REGISTER 1 (I2C™ MODE)

WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

bit 7 WCOL: Write Collision Detect bit


In Master Transmit mode:
1 = A write to the SSPBUF register was attempted while the I2C conditions were not valid for a
transmission to be started (must be cleared in software)
0 = No collision
In Slave Transmit mode:
1 = The SSPBUF register is written while it is still transmitting the previous word (must be cleared in
software)
0 = No collision
In Receive mode (Master or Slave modes):
This is a “don’t care” bit.
bit 6 SSPOV: Receive Overflow Indicator bit
In Receive mode:
1 = A byte is received while the SSPBUF register is still holding the previous byte (must be cleared in
software)
0 = No overflow
In Transmit mode:
This is a “don’t care” bit in Transmit mode.
bit 5 SSPEN: Master Synchronous Serial Port Enable bit
1 = Enables the serial port and configures the SDA and SCL pins as the serial port pins(1)
0 = Disables serial port and configures these pins as I/O port pins(1)
bit 4 CKP: SCK Release Control bit
In Slave mode:
1 = Release clock
0 = Holds clock low (clock stretch), used to ensure data setup time
In Master mode:
Unused in this mode.
bit 3-0 SSPM3:SSPM0: Master Synchronous Serial Port Mode Select bits
1111 = I2C Slave mode, 10-bit address with Start and Stop bit interrupts enabled(2)
1110 = I2C Slave mode, 7-bit address with Start and Stop bit interrupts enabled(2)
1011 = I2C Firmware Controlled Master mode (slave Idle)(2)
1000 = I2C Master mode, clock = FOSC/(4 * (SSPADD + 1))(2)
0111 = I2C Slave mode, 10-bit address(2)
0110 = I2C Slave mode, 7-bit address(2)

Note 1: When enabled, the SDA and SCL pins must be properly configured as input or output.
2: Bit combinations not specifically listed here are either reserved or implemented in SPI mode only.
SSPCON2: MSSP CONTROL REGISTER 2 (I2C™ MASTER MODE)

GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

bit 7 GCEN: General Call Enable bit (Slave mode only)


Unused in Master mode.
bit 6 ACKSTAT: Acknowledge Status bit (Master Transmit mode only)
1 = Acknowledge was not received from slave
0 = Acknowledge was received from slave
bit 5 ACKDT: Acknowledge Data bit (Master Receive mode only)(1)
1 = Not Acknowledge
0 = Acknowledge
bit 4 ACKEN: Acknowledge Sequence Enable bit(2)
1 = Initiate Acknowledge sequence on SDA and SCL pins and transmit ACKDT data bit.
Automaticallycleared by hardware.
0 = Acknowledge sequence Idle
bit 3 RCEN: Receive Enable bit (Master Receive mode only)(2)
1 = Enables Receive mode for I2C
0 = Receive Idle
bit 2 PEN: Stop Condition Enable bit(2)
1 = Initiate Stop condition on SDA and SCL pins. Automatically cleared by hardware.
0 = Stop condition Idle
bit 1 RSEN: Repeated Start Condition Enable bit(2)
1 = Initiate Repeated Start condition on SDA and SCL pins. Automatically cleared by hardware.
0 = Repeated Start condition Idle
bit 0 SEN: Start Condition Enable/Stretch Enable bit(2)
1 = Initiate Start condition on SDA and SCL pins. Automatically cleared by hardware.
0 = Start condition Idle

Note 1: Value that will be transmitted when the user initiates an Acknowledge sequence at the end of a
receive.
2: If the I2C module is active, these bits may not be set (no spooling) and the SSPBUF may not be written
(or
writes to the SSPBUF are disabled).

También podría gustarte