Comunicación Serie Síncrona I2C Características generales de la comunicación serie Los datos se envían bit a bit por una misma línea durante un tiempo fijo. La velocidad de transmisión se indica en baudios (número de bits enviados por segundo). La transferencia puede ser síncrona o asíncrona. Síncrona: Se envía la señal de reloj para sincronizar cada bit. Asíncrona: Se necesitan “relojes” en el emisor y el receptor de la misma frecuencia y en fase Datos Datos EMISOR
¿Reloj?
Bit i RECEPTOR
Bit i+1
Reloj
Referencia de tensión
t
t
Comunicación Serie Síncrona I2C Se emplean dos registros de desplazamiento (uno en el emisor y otro en el receptor) encadenados para la conversión paralelo/serie en la emisión y serie/paralelo en la recepción. Se puede llevar a cabo varios tipos de sincronización. De los sucesivos bits. De cada paquete de bits (8 ó 9 bits) Se envía la señal de reloj si la distancia entre Emisor y Receptor es corta. Así se consiguen menores retardos en las transiciones y mejores flancos en la señal de reloj recibida. Posibles codificaciones de cada bit. NRZ: Nivel alto: 1 / NRZI: Cambio de nivel: 1 / RZ: Impulso: 1 / ...
Nivel bajo: 0 Sin cambio de nivel: 0 Sin impulso: 0
1
Comunicación Serie Síncrona I2C Transferencia síncrona La comunicación síncrona entre dos dispositivos requiere que uno de ellos actúe como maestro y el otro, como esclavo. Dispositivo Maestro: Es el que genera la señal de reloj y el que tiene capacidad de iniciar o finalizar una transferencia. Dispositivo Esclavo: Recibe la señal de reloj y no tiene capacidad para iniciar una transferencia de información. Es posible efectuar una transmisión continua de bits de información. Dato
Maestro
Clk
Dato
Esclavo
Maestro
Ref. Maestro Emitiendo
Clk
Esclavo
Ref. Maestro Recibiendo
Comunicación Serie Síncrona I2C Comunicación serie síncrona en microcontroladores PIC Se implementa mediante el módulo SSP Synchronous Serial Port : Interfaz de comunicación serie síncrona. Está pensado para poder comunicarse con otros microcontroladores o periféricos mediante transmisión serie síncrona. EEPROM serie Almacenamiento de datos no volátiles Registros de Desplazamiento Expansión de entradas y/o salidas Drivers de Displays Reducción de conexiones Conversores A/D Digitalización externa de señales .... El módulo SSP tiene dos posibles modos de funcionamiento. SPI (Serial Peripheral Interface: Interface de Periféricos Serie) SPI: Es una Marca Registrada de Motorola Corporation
I 2C (Inter-Integrated Circuit: Entre Circuitos Integrados) I2C: Es una Marca Registrada de Philips
2
Comunicación Serie Síncrona I2C Características generales del bus I2C El bus Inter-Integrated-Circuit (I 2C) fue creado por Philips. Para transferencia de datos entre CIs de una PCB. Soporta transmisión de datos de hasta 400kbd.
Es más lento que el módulo SPI.
Un bus I 2C puede tener distintas configuraciones. Configuración de un Maestro y varios Esclavos. Configuración multiMaestro. En cualquiera de estas configuraciones, el dispositivo Maestro es el único que tiene capacidad de iniciar la transferencia, decidir con quién se realiza, el sentido de la misma (envío o recepción desde el punto de vista del Maestro) y cuándo se finaliza. El bus I 2C consiste físicamente en dos líneas de colector abierto. SCL para el reloj (pin RC3). SDA para los datos (pin RC4). La comunicación es, por tanto, half-duplex.
Comunicación Serie Síncrona I2C Las líneas necesitan resistencias externas de pull-up. Para poder implementar un wire-AND (Y cableado). Cuando el bus está inactivo, ambas líneas están a “1”. El protocolo I 2C puede usar direcciones de 7 ó de 10 bits. Puede haber hasta 128 ó hasta 1024 dispositivos colgados del bus. Con la dirección se informa si el Maestro quiere leer o escribir. El protocolo I 2C incluye un mecanismo de comprobación (handshaking). - Cada transferencia de 8 bits, el Maestro envía un 9º pulso de reloj. - En ese instante, el dispositivo “transmisor” suelta la línea SDA y el “receptor” reconoce el dato enviado mediante un ACK (SDA←0). - Se envía un NACK (deja SDA=1) para finalizar la transmisión. Todos los cambios en SDA deben ocurrir mientras SCL=0. Así se permite diferenciar dos condiciones únicas: Secuencia START (S). El Maestro hace SDA←0 mientras SCL=1. Secuencia STOP (P). El Maestro hace SDA←1 mientras SCL=1.
3
Comunicación Serie Síncrona I2C Fácil inclusión de nuevos dispositivos I 2C en el bus. Una vez disponible el microcontrolador con sus funciones de interface con bus I2C, la inclusión de un dispositivo I 2C adicional sólo precisa su conexión a las dos líneas del bus (SDA y SCL), que son las mismas para todos, y asignarle una dirección.
Conexiones en el bus I 2C.
VDD
Rp ≥ Rp
Rp
Periférico Rs
VDD − VOL iOL Número máx. de dispositivos definidos por la capacidad en el bus: C max=400pF
Rs
SDA SCL C bus=10 – 400pF
Comunicación Serie Síncrona I2C Direccionamiento de dispositivos en el bus I 2C Formato de 7 bits: (A7-A6-...-A1)
Reconocimiento (lo debe poner el Esclavo)
Lo “pone” el Maestro
En la línea SDA:
S
A7 A6 A5 A4 A3 A2 A1 R/W ACK Dirección de 7 bits del esclavo
Start
Lectura (1) o Escritura (0)
Formato de 10 bits: (A9-A8-A7-...-A0) En la línea SDA: Start
Primer byte del Maestro S 1
1
1
1 0 A9 A8
2º byte del Maestro
R ACK A7 A6 A5 A4 A3 A2 A1 A0 ACK W ACK S
Lectura (1) o Escritura (0)
Reconocimientos del Esclavo después de cada byte del Maestro
4
Comunicación Serie Síncrona I2C Reconocimiento de transferencia (ACK) Los datos se transmiten en paquetes de 8 bits (bytes). Tras cada byte el receptor debe intercalar un bit de reconocimiento (ACK). Si el receptor es el Esclavo y no genera el bit de reconocimiento después de cada byte, el Maestro debe abortar la transferencia generando un bit de fin (STOP).
En este caso, y dado que las etapas de salida son de drenador abierto, los niveles lógicos “0” son dominantes en las líneas, 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 continúe 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 envío del siguiente byte (porque no lo tiene todavía disponible, p.e.) situando la línea SCL en estado bajo, forzando así al Maestro a situarse en un estado de “Espera” puesto que no podrá generar flancos en SCL.
Comunicación Serie Síncrona I2C Secuencia de transmisión I 2C desde el Maestro. SDA:
S
Dirección del Esclavo
De Maestro a Esclavo De Esclavo a Maestro
R/W
A
Dato
A
Dato
A/A
P
Reconocimiento (A) o no reconocimiento (A)
“0” porque el Maestro quiere escribir (enviar)
Secuencia de recepción I 2C por parte del Maestro. SDA:
S Dirección del Esclavo
R/W
A
Dato
“1” porque el Maestro quiere leer (recibir)
A
Dato
A
P
No reconocimiento por Maestro y Parada
5
Comunicación Serie Síncrona I2C Típica transmisión I 2C para lectura desde el Esclavo. Recibe la dirección A7 A6 A5 A4 A3 A2
Recibe el dato ACK
A1
Puesto por el Esclavo
Recibe el dato
NACK
ACK D7 D6 D5 D43 D3 D2
D1 D0
D7 D6 D5 D4 D3 D2
D1 D0
R/W
1
S
2
3
4
5
6
7
8
9
1
2
Pulso ACK
3
4
5
6
7
8
9
1
2
3
5
6
7
Pulso ACK
8
9
P
Pulso ACK
Típica transmisión I 2C por parte del Esclavo.
Puesto por el Maestro
Recibe la dirección A7 A6 A5 A4 A3 A2
4
Envía el dato ACK
A1
NACK D7 D6 D5 D4 D3 D2
D1 D0
R/W
S
1
2
3
4
5
6
7
8
9
Pulso ACK
1
2
3
4
5
El Esclavo pone SCL a 0 para darse tiempo de preparar el dato
6
7
8
9
P
Pulso ACK
Comunicación Serie Síncrona I2C Repetición 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 Repetición de START (Sr). La Repetición de START es idéntica a la condición 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.
6
Comunicación Serie Síncrona I2C El interface I2C en los microcontroladores PIC Puede implementarse en dos módulos (según el tipo de PIC). BSSP (Basic Synchronous Serial Port )
Modo Esclavo: Completo por hardware. Modo Maestro: Detección de bits START y STOP por hardware. 16C64, 16C65, 16C73, 16C74, ...
MSSP (Master Synchronous Serial Port )
Modo Esclavo: Completo por hardware. Modo Maestro: Completo por hardware. 16F87x
Ambos módulos son idénticos en lo que se refiere al interface SPI. Características del interface I 2C en el módulo MSSP. - Detecta condiciones START y STOP en el bus por interrupción. - Permite seleccionar tres modos de operación. Esclavo I2 C con dirección de 7 bits. Esclavo I2 C con dirección de 10 bits. Maestro I2 C con reloj SCL de frecuencia fSCL = fOSC /[4·(SSPADD+1)]
- Seis registros asociados al funcionamiento de este módulo. SSPCON SSPADD
SSPCON2 SSPBUF
SSPSTAT SSPSR
Comunicación Serie Síncrona I2C Diagrama de bloques del bus I2C en modo Esclavo Bus de datos Leer
RC3 / SCL
Escribir
SSPBUF
Reloj
Registro Registro E/S E/S
SSPSR
RC4 / SDA MSb
Buffer Buffer para para envío envío yy recepción recepción
No Noaccesible accesible directamente directamente
LSb
Detector de dirección
Detecta coincidencia en la dirección o llamada general
SSPADD Detección de START/STOP
Control de los bits S y P del registro SSPSTAT
Dirección Dirección asignada asignada al al Esclavo Esclavo
7
Comunicación Serie Síncrona I2C Diagrama de bloques del bus I2C en modo Maestro Bus de datos Leer
SSPM3:SSPM0 SSPADD<6:0>
Escribir
SSPBUF SDA In
SSPSR
RC3 SCL
LSb
Generación de START/STOP ACK
Ctrl CLK (detiene fuente de CLK)
Habilita recepción
MSb
Generador de baudios
Reloj
Ctrl CLK
RC4 SDA
Detección de START/STOP SCL In Colisión de bus
Detección de colisión Control de CLK
S , P , WCOL SSPIF , BCLIF ACKSTAT , PEN
(SSPSTAT) (SSPCON2)
Comunicación Serie Síncrona I2C Registro SSPSTAT (94h) SMP
bit 7
CKE
D/A
S
R/W
SMP: Bit de control de slew rate 0: Velocidad estándar
bit 6
P
1 : Alta velocidad (400kHz)
UA
BF
Maestro
CKE: Bit de selección de niveles umbral en los pines 0: Especificaciones I2 C
1 : Especificaciones SMBus
bit 5
D/A: Información del último byte transmitido
bit 4
P: Bit de STOP
bit 3
S: Bit de START
bit 2
R/W: Información de lectura/escritura
0: Dirección
1 : Dato 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
0: Escritura 0: No hay transmisión
1 : Lectura 1 : Transmisión en progreso
bit 1
UA: Actualización del byte de dirección
bit 0
BF: Bit de estado del buffer
0: No hace falta 0: SSPBUF está vacío
(Esclavo ) (Maestro )
1 : Es necesario actualizar la dirección 1 : SSPBUF está lleno
8
Comunicación Serie Síncrona I2C Registro SSPCON (14h) WCOL
bit 7
SSPOV
SSPEN
SSPM3
SSPM2
SSPM1
SSPM0
WCOL: Bit de detección de colisión 0: No ha habido colisión
bit 6
CKP
1 : Ha habido colisión
SSPOV: Bit indicador de overflow en la recepción 0: No ha habido overflow
1 : Ha habido overflow
bit 5
SSPEN: Habilitación del puerto serie síncrono
bit 4
CKP: Control de SCL
0: Desabilitado
1 : Habilitado (usa SCL y SDA)
0: Mantiene SCL a “0”
1 : Reloj habilitado
bits 3:0 SSPM3:SSPM0: Modo de funcionamiento 0110: 0111 : 1000 : 1011 : 1110 : 1111:
Esclavo con direcciones de 7 bits. Esclavo con direcciones de 10 bits. Maestro con CLK=Fosc / [4·(SSPADD+1)]. Modo Maestro controlado por firmware (Esclavo inactivo). Maestro controlado por Fw (dir. de 7 bits, interrup. por bits de START y STOP). Maestro controlado por Fw (dir. de 10 bits, interrup. por bits de START y STOP).
Comunicación Serie Síncrona I2C Registro SSPCON2 (91h) GCEN
bit 7
ACKSTAT
ACKDT
bit 1 bit 0
(Maestro / Recepción) (Maestro )
1 : Activa modo recepción (Maestro )
1 : Inicia situación de STOP en SDA y SCL
RSEN: Habilitación de START repetido 0: Desactivado
(Maestro )
1 : Inicia repetidas situaciones de START
SEN: Habilitación de una secuencia START 0: Desactivada
(Maestro / Recepción)
1 : Inicia secuencia de reconocimiento en SDA y SCL
PEN: Habilitación de una secuencia STOP 0: Desactivada
Esclavo
1 : NACK
RCEN: Bit de habilitación de recepción 0: Recepción desactivada
bit 2
SEN
(Maestro / Recepción)
ACKEN: Habilitación de secuencia ACK 0: Desactivada
bit 3
RSEN
1 : No se ha recibido ACK del Esclavo
ACKDT: Valor a transmitir tras una recepción 0: ACK
bit 4
PEN
1 : Habilita interrupciones por Llamada General
ACKSTAT: Bit de reconocimiento 0: Recibido ACK del Esclavo
bit 5
RCEN
GCEN: Habilita Llamada General 0: Deshabilitada
bit 6
ACKEN
(Maestro )
1 : Inicia situación de START en SDA y SCL
9
Comunicación Serie Síncrona I2C Otros registros relacionados con el módulo MSSP TRISC
(87h)
Para definir RC3 y RC4 como entradas.
SSPBUF
(13h)
Buffer de transmisión/recepción serie.
SSPSR
Registro de desplazamiento SSP (no accesible directamente).
SSPADD
(93h)
Define la dirección del Esclavo o los baudios de la comunicación (Maestro).
PIR1 – PIE1
(0Ch – 8Ch)
PIR2 – PIE2
(0Dh – 8Dh)
Interrupciones del módulo SSP (SSPIF – SSPIE). Interrupción por colisión del bus (BCLIF – BCLIE).
INTCON
(0Bh , 8Bh , 10Bh , 18Bh)
Habilita interrupciones de periféricos.
Comunicación Serie Síncrona I2C Funcionamiento en modo Esclavo Antes de activar el módulo hay que configurar RC<3:4> como entradas. Configurar el MSSP en el registro SSPCON. Esclavo I 2C con direcciones de 7 bits o con direcciones de 10 bits. Esclavo I 2C con o sin interrupciones por bits de START y STOP. Lo más habitual es que no se usen interrupciones por START/STOP
Establecer la dirección del esclavo. Escribirla en el registro SSPADD.
La dirección viene indicada por SSPADD<7:1> - SSPADD<0>=0 LSb se usa para determinar la operación solicitada por el Maestro
Esperar por un suceso I 2C. Se puede determinar con la ayuda del bit SSPIF. La interrupción puede estar activada o no
Identificar el suceso y actuar en consecuencia. Los sucesos I2C que percibe el Esclavo pueden ser de 5 tipos.
10
Comunicación Serie Síncrona I2C Maestro solicita escritura. Último byte fue una dirección El Maestro ha comenzado una operación de escritura con el inicio de una secuencia START o RESTART en el bus, seguida del envío de la dirección del Esclavo. La dirección que hay en el bus pasa al registro SSPSR del Esclavo. Si coincide con la suya, la dirección recibida pasa a SSPBUF. Bits del registro SSPSTAT. -
S=1 R/W = 0 D/A = 0 BF = 1
La última secuencia detectada fue un START El Maestro va a escribir datos en el Esclavo El último byte recibido fue una dirección El buffer está lleno
Debe leerse el registro SSPBUF aunque no se vaya a usar la información que contiene. Esta acción borra el bit BF y evita posteriores overflows.
Comunicación Serie Síncrona I2C Maestro solicita escritura. Último byte fue un dato Tras el byte de dirección, el Maestro puede enviar uno o más bytes de datos al Esclavo. Bits del registro SSPSTAT. -
S=1 R/W = 0 D/A = 1 BF = 1
La última secuencia detectada fue un START El Maestro escribe datos en el Esclavo El último byte recibido fue un dato El buffer está lleno
Debe leerse el registro SSPBUF. Si SSPBUF no estaba lleno antes de la escritura, el Esclavo envía un reconocimiento ACK en el 9º pulso de reloj. Lo hace el MSSP automáticamente. Si ya estaba lleno, SSPOV ← 1 y se envía un NACK.
11
Comunicación Serie Síncrona I2C Maestro solicita lectura. Último byte fue una dirección El Maestro ha comenzado una operación de lectura con el inicio de una secuencia START o RESTART en el bus, seguida del envío de la dirección del Esclavo. Bits del registro SSPSTAT. -
S=1 R/W = 1 D/A = 0 BF = 0
La última secuencia detectada fue un START El Maestro va a leer datos del Esclavo El último byte recibido fue una dirección El buffer está vacío
El bit CKP se pone a 0 para que la línea 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 línea SCL.
Comunicación Serie Síncrona I2C Maestro solicita lectura. Último byte fue un dato El Maestro ya ha leído un dato del Esclavo y quiere leer otro.
Bits del registro SSPSTAT. -
S=1 R/W = 1 D/A = 1 BF = 0
La última secuencia detectada fue un START El Maestro lee datos del Esclavo El último byte recibido fue un dato El buffer está vacío
El bit CKP se pone a 0 para que la línea SCL pase a estado bajo, dando así tiempo al Esclavo para preparar el dato a enviar. El Esclavo manda el dato al Maestro escribiéndolo en el registro SSPBUF y haciendo CKP ← 1 para liberar la línea SCL.
12
Comunicación Serie Síncrona I2C Maestro envía NACK El Maestro ha enviado un NACK como respuesta al dato que ha recibido desde el Esclavo. De este modo indica que ya no quiere recibir más datos. Bits del registro SSPSTAT. -
S=1 R/W = 0 D/A = 1 BF = 0
La última secuencia detectada fue un START La lógica del Esclavo queda reseteada El último byte recibido fue un dato El buffer está vacío
El envío de un NACK queda identificado porque R/W ← 0. Debido a que la recepción de un NACK da lugar a un reset de la lógica I2C del Esclavo. Esta situación da lugar a que los bits del registro SSPSTAT reflejen una situación incoherente. Indican que se ha recibido un dato del Maestro pero que el buffer está vacío.
Comunicación Serie Síncrona I2C Control de errores en modo Esclavo Cada vez que se lee el SSPBUF, el usuario debe asegurarse de que no han ocurrido overflows. Comprobando el estado del bit SSPOV. Si ha ocurrido un overflow, será necesario hacer SSPOV ← 0 y leer SSPBUF para permitir nuevas recepciones. Los sucesos que tienen lugar tras un overflow dependen de cada caso. La lógica del Esclavo le enviará un NACK al Maestro. Típicamente el Maestro intentará volver a enviar el dato hasta que reciba un ACK. Tras escribir un dato en SSPBUF, el usuario debe comprobar el valor de WCOL para asegurar que no se ha producido una colisión. En la práctica, no habrá colisiones si únicamente se escribe en SSPBUF cuando BF=0 y el Esclavo está transmitiendo al Maestro.
13
Comunicación Serie Síncrona I2C Funcionamiento en modo Maestro Configurar el MSSP para funcionar en modo Maestro I 2C. - Definir líneas SDA y SCL como entradas. TRISC ← xxx11xxx
- Configurar el modo I2C.
SSPCON1 ← 00101000
- Seleccionar los baudios de la comunicación. Sólo se usan los bits 0 a 6
SSPADD ← [(f osc/Bd) / 4] – 1 Control del slew rate (SSPSTAT<7>)
100kHz 400kHz 1MHz
- Configurar interrupciones (si se necesitan) SSPIE / SSPIF
-
BCLIE / BCLIF
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)
Comunicación Serie Síncrona I2C Funcionamiento del Maestro
Se supone que la dirección es de 7 bits
Secuencia típica de transmisión de un byte por parte del Maestro a) Se genera una condición de START poniendo a 1 el bit de habilitación de START (SEN) del registro SSPCON2. b) Se esperará el tiempo necesario para detectar START, cuando se haya dado la condición, SSPIF=1 (se debe poner a 0 por software). c) Se carga SSPBUF con la dirección a enviar por el bus y el bit R/W=0. d) Los bits de la dirección salen por SDA hasta completar los 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 salen por SDA hasta completar la transmisión. 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 SSPIF a 1 (hay que ponerlo a 0). k) Se genera una condición de STOP poniendo a 1 el bit de habilitación de STOP (PEN) de SSPCON2. l) Una vez detectada la condición de STOP, se pone a 1 el flag SSPIF.
14
Comunicación Serie Síncrona I2C Generación de una secuencia START Hacer SEN ← 1 para habilitar la generación de START. Bit SSPCON2<0>. Esto da lugar a que la línea SDA pase a “0” mientras SCL está a “1”. Así se define una secuencia START, que da lugar a: S←1 SEN ← 0 SSPIF ← 1
(SSPSTAT<3>) (SSPCON2<0>) (PIR1<3>)
Generación de una secuencia de START repetido Hacer RSEN ← 1 para habilitar la generación de RESTART. Bit SSPCON2<1>. Esto da lugar a que se ejecuten secuencias de START sin ser precedidas de la correspondiente secuencia de STOP. De este modo, el Maestro no cede el control del bus en ningún momento.
Comunicación Serie Síncrona I2C Generación de una secuencia STOP Hacer PEN ← 1 para habilitar la generación de STOP. Bit SSPCON2<2>. Esto da lugar a que la línea SDA pase a “1” mientras SCL está a “1”. Se indica así que ha finalizado la recepción/transmisión. El bus I2C queda libre y se tiene: P←1 PEN ← 0 SSPIF ← 1
(SSPSTAT<4>) (SSPCON2<2>) (PIR1<3>)
Generación de una lectura (recepción) Hacer RCEN ← 1 para habilitar una lectura. Bit SSPCON2<3>. Entran bits cada pulso de SCL en SSPSR. Tras el 8º bit, RCEN ← 0, SSPSR ← SSPBUF, BF ← 1, SSPIF ← 1. En ese momento SCL=0 y hay que leer el buffer para hacer BF ← 0. A continuación se puede enviar un ACK.
15
Comunicación Serie Síncrona I2C Generación de un ACK Indicar en ACKDT si se va a generar un ACK (“0”) o un NACK (“1”). Bit SSPCON2<5>. Hacer ACKEN ← 1 para habilitar la generación de ACK. Bit SSPCON2<4>. Esto libera la línea de datos (SDA ← 1), para que el receptor la ponga a “0” durante un pulso de reloj. Tras este pulso de reloj, ACKEN ← 0 automáticamente. Es obligatorio mandar un ACK/NACK al final de cada transferencia. ¡¡IMPORTANTE!!
Generación de una escritura (transmisión) Basta con escribir el dato a enviar en SSPBUF. - BF ← 1 mientras se está enviando el dato. - Cuando se ha enviado el 8º bit, BF ← 0. - El Maestro libera entonces SDA para recibir ACK. - Tras el 9º pulso de reloj, SSPIF ← 1.
Antes de iniciar un evento es necesario que el evento anterior haya finalizado. Conviene desarrollar rutinas que comprueben si el módulo está inactivo antes de lanzar un nuevo evento
Comunicación Serie Síncrona I2C Control de errores en modo Maestro Las colisiones por escritura deben controlarse mediante observación del bit WCOL (SSPCON<7>). Una colisión de escritura sucede cuando se intenta escribir un dato en el buffer antes de que haya terminado el evento anterior. No tiene asociada ninguna interrupción. Las colisiones de bus sí tienen asociada una interrupción: BCLIF. Cuando SCL=1, el dato en SDA debe ser estable. Se produce colisión de bus cuando el dato cambia mientras SCL=1 o si se detecta SDA=0 cuando SDA debería ser 1 (estar libre). En ese caso se hace BCLIF ← 0 y se pone la lógica I 2C en reposo. La siguiente secuencia deberá ser un START. Un NACK puede indicar error o simplemente un estado de funcionamiento que debe ser detectado y procesado. El Maestro puede recibir un NACK si hay un error en el Esclavo o si éste está desbordado. Según la situación, el Maestro deberá generar un RESTART, un STOP o un STOP/START.
16
Comunicación Serie Síncrona I2C Bus I2C en el compilador C de CCS Configuración del módulo I 2C #use i2c (opciones) opciones: MASTER SLAVE SCL = pin SDA = pin ADDRESS = nn FAST SLOW NOFORCE_SW RESTART_WDT
Selecciona modo Maestro Selecciona modo Esclavo Especifica el pin SCL (PIN_C3) Especifica el pin SCL (PIN_C4) Especifica la dirección del Esclavo Selecciona la especificación I2C rápida Selecciona la especificación I2C lenta Utiliza funciones I2C hardware. Resetea el WDT mientras espera a hacer una lectura de bus
2 Si Sino nose seindica indica NOFORCE_SW, NOFORCE_SW,implementará implementaráelelprotocolo protocoloII2CCpor porsoftware. 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.
Comunicación Serie Síncrona I2C Secuencias de START y STOP i2c_start (); Si el PIC está en modo Maestro, esta instrucción genera una secuencia START, tras la cual la línea SCL se pone a “0” hasta que se escribe en el bus. Si se lanza otra secuencia START antes de que se produzca una secuencia STOP, se habrá ejecutado una secuencia RESTART.
i2c_stop (); Si el PIC está en modo Maestro, esta instrucción genera una secuencia STOP.
17
Comunicación Serie Síncrona I2C Escritura en el bus I 2C i2c_write (dato); dato: valor1:
valor1 = i2c_write (dato);
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 función generará además la señal de reloj que marca la velocidad de transmisión del dato; en modo Esclavo, se esperará por la señal de reloj que genere el Maestro. Esta función puede devolver el bit ACK que envía el receptor cuando la transmisión ha terminado. El LSb del primer dato transmitido tras una secuencia de START indica el sentido en que se pretende establecer la comunicación (si dicho LSb es “0”, la información se transmitirá de Maestro a Esclavo).
Comunicación Serie Síncrona I2C Lectura del bus I 2C dato = i2c_read([ack]); dato: ack:
Entero de 8 bits. Bit opcional →
0 indica no enviar ACK 1 indica enviar ACK (valor por defecto)
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 opción 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.
Sólo se usa en PICs que disponen de MSSP.
18