Comunicación Serie Síncrona I2C

Documents

eduardo-leon
  • 1 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 EMISOR RECEPTOR Datos Referencia de tensión ¿Reloj? t t Datos Reloj Bit i Bit i+1 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. Se envía la señal de reloj si la distancia entre Emisor y Receptor es corta. De los sucesivos bits. De cada paquete de bits (8 ó 9 bits) 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 / Nivel bajo: 0 NRZI: Cambio de nivel: 1 / Sin cambio de nivel: 0 RZ: Impulso: 1 / Sin impulso: 0 ...
  • 2 Comunicación Serie Síncrona I2C Transferencia síncrona 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. Maestro Esclavo Dato Clk Maestro Esclavo Dato Clk Maestro Emitiendo Maestro Recibiendo Ref. Ref. La comunicación síncrona entre dos dispositivos requiere que uno de ellos actúe como maestro y el otro, como esclavo. Comunicación Serie Síncrona I2C Comunicación serie síncrona en microcontroladores PIC Se implementa mediante el módulo SSP 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 .... Synchronous Serial Port : Interfaz de comunicación serie síncrona. 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 I2C (Inter-Integrated Circuit: Entre Circuitos Integrados) I2C: Es una Marca Registrada de Philips
  • 3 Comunicación Serie Síncrona I2C Características generales del bus I2C El bus Inter-Integrated-Circuit (I2C) fue creado por Philips. Para transferencia de datos entre CIs de una PCB. Soporta transmisión de datos de hasta 400kbd. El bus I2C consiste físicamente en dos líneas de colector abierto. Un bus I2C 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. SCL para el reloj (pin RC3). SDA para los datos (pin RC4). La comunicación es, por tanto, half-duplex. Es más lento que el módulo SPI. 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 I2C 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 I2C 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.
  • 4 Comunicación Serie Síncrona I2C Fácil inclusión de nuevos dispositivos I2C en el bus. Una vez disponible el microcontrolador con sus funciones de interface con bus I2C, la inclusión de un dispositivo I2C 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 I2C. Periférico SDA SCL Rp Rp Rs Rs Cbus=10 – 400pF VDD OL OLDD p i VV R - ³ Número máx. de dispositivos definidos por la capacidad en el bus: Cmax=400pF Comunicación Serie Síncrona I2C Direccionamiento de dispositivos en el bus I2C Formato de 7 bits: (A7-A6-...-A1) S A7 A6 A5 A4 A3 A2 A1 R/W ACK Start Dirección de 7 bits del esclavo En la línea SDA: Lectura (1) o Escritura (0) Reconocimiento (lo debe poner el Esclavo)Lo “pone” el Maestro Formato de 10 bits: (A9-A8-A7-...-A0) S 1 1 1 1 0 A9A8 RW ACKA7A6A5A4A3 A2 A1 A0 SACK ACK Start Lectura (1) o Escritura (0) Reconocimientos del Esclavo después de cada byte del Maestro Primer byte del Maestro 2º byte del Maestro En la línea SDA:
  • 5 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 I2C desde el Maestro. Secuencia de recepción I2C por parte del Maestro. “0” porque el Maestro quiere escribir (enviar) De Maestro a Esclavo De Esclavo a Maestro Reconocimiento (A) o no reconocimiento (A) SDA: S Dirección del Esclavo R/W A Dato A Dato A/A P “1” porque el Maestro quiere leer (recibir) Dirección del Esclavo R/W A Dato A Dato A P No reconocimiento por Maestro y Parada SSDA:
  • 6 Comunicación Serie Síncrona I2C Típica transmisión I2C para lectura desde el Esclavo. Pulso ACK 87654321 9 87654321 9 87654321 9 D5D6 D3D43 D1D2 D0D7A6A7 A4A5 A2A3 A1 D5D6 D3D4 D1D2 D0D7 Pulso ACK Pulso ACK ACK R/W ACK NACK Recibe la dirección Recibe el dato Recibe el dato S P Típica transmisión I2C por parte del Esclavo. Pulso ACK 87654321 9 87654321 9 A6A7 A4A5 A2A3 A1 D5D6 D3D4 D1D2 D0D7 Pulso ACK ACK R/W NACK Recibe la dirección Envía el dato S P El Esclavo pone SCL a 0 para darse tiempo de preparar el dato Puesto por el Esclavo Puesto por el Maestro 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.
  • 7 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). Características del interface I2C en el módulo MSSP. - Detecta condiciones START y STOP en el bus por interrupción. - Permite seleccionar tres modos de operación. Esclavo I2C con dirección de 7 bits. Esclavo I2C con dirección de 10 bits. Maestro I2C con reloj SCL de frecuencia fSCL = fOSC/[4·(SSPADD+1)] - Seis registros asociados al funcionamiento de este módulo. SSPCON SSPCON2 SSPSTAT SSPADD SSPBUF SSPSR 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. Comunicación Serie Síncrona I2C Diagrama de bloques del bus I2C en modo Esclavo Detección de START/STOP SSPSR Leer RC3 / SCL Detecta coincidencia en la dirección o llamada general Bus de datos RC4 / SDA SSPBUF Detector de dirección SSPADD Escribir Reloj MSb LSb Control de los bits S y P del registro SSPSTAT Buffer para envío y recepción Buffer para envío y recepción Registro E/S No accesible directamente Registro E/S No accesible directamente Dirección asignada al Esclavo Dirección asignada al Esclavo
  • 8 Comunicación Serie Síncrona I2C Diagrama de bloques del bus I2C en modo Maestro Generación de START/STOP ACK SSPSR Leer RC3 SCL S , P , WCOL (SSPSTAT) SSPIF , BCLIF ACKSTAT , PEN (SSPCON2) Bus de datos RC4 SDA SSPBUF Generador de baudios Escribir Reloj MSb LSb SSPM3:SSPM0 SSPADD Detección de START/STOP Detección de colisión Control de CLK SDA In H ab ili ta re ce pc ió n Colisión de bus SCL In Ct rl C LK Ct rl C LK (d et ie ne f ue nt e de C LK ) Comunicación Serie Síncrona I2C Registro SSPSTAT (94h) D/A P R/W UASCKESMP BF bit 6 CKE: Bit de selección de niveles umbral en los pines 0: Especificaciones I2C 1: Especificaciones SMBus bit 5 D/A: Información del último byte transmitido 0: Dirección 1: Dato bit 4 P: Bit de STOP Se pone a 1 si la última secuencia detectada es un bit de STOP bit 2 R/W: Información de lectura/escritura 0: Escritura 1: Lectura (Esclavo ) 0: No hay transmisión 1: Transmisión en progreso (Maestro) bit 1 UA: Actualización del byte de dirección 0: No hace falta 1: Es necesario actualizar la dirección bit 0 BF: Bit de estado del buffer 0: SSPBUF está vacío 1: SSPBUF está lleno Maestro bit 7 SMP: Bit de control de slew rate 0: Velocidad estándar 1: Alta velocidad (400kHz) bit 3 S: Bit de START Se pone a 1 si la última secuencia detectada es un bit de START
  • 9 Comunicación Serie Síncrona I2C Registro SSPCON (14h) SSPEN CKP SSPM2 SSPM1SSPM3SSPOVWCOL SSPM0 bit 6 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 0: Desabilitado 1: Habilitado (usa SCL y SDA) bit 4 CKP: Control de SCL 0: Mantiene SCL a “0” 1: Reloj habilitado bits 3:0 SSPM3:SSPM0: Modo de funcionamiento 0110: Esclavo con direcciones de 7 bits. 0111 : Esclavo con direcciones de 10 bits. 1000: Maestro con CLK=Fosc / [4·(SSPADD+1)]. 1011 : Modo Maestro controlado por firmware (Esclavo inactivo). 1110: Maestro controlado por Fw (dir. de 7 bits, interrup. por bits de START y STOP). 1111: Maestro controlado por Fw (dir. de 10 bits, interrup. por bits de START y STOP). bit 7 WCOL: Bit de detección de colisión 0: No ha habido colisión 1: Ha habido colisión Comunicación Serie Síncrona I2C Registro SSPCON2 (91h) ACKDT ACKEN PEN RSENRCENACKSTATGCEN SEN bit 6 ACKSTAT: Bit de reconocimiento (Maestro / Recepción) 0: Recibido ACK del Esclavo 1: No se ha recibido ACK del Esclavo bit 5 ACKDT: Valor a transmitir tras una recepción (Maestro / Recepción) 0: ACK 1: NACK bit 4 ACKEN: Habilitación de secuencia ACK (Maestro / Recepción) bit 2 PEN: Habilitación de una secuencia STOP (Maestro ) 0: Desactivada 1: Inicia situación de STOP en SDA y SCL bit 1 RSEN: Habilitación de START repetido (Maestro) 0: Desactivado 1: Inicia repetidas situaciones de START bit 0 SEN: Habilitación de una secuencia START (Maestro) 0: Desactivada 1: Inicia situación de START en SDA y SCL Esclavo bit 7 GCEN: Habilita Llamada General 0: Deshabilitada 1: Habilita interrupciones por Llamada General bit 3 RCEN: Bit de habilitación de recepción (Maestro) 0: Desactivada 1: Inicia secuencia de reconocimiento en SDA y SCL 0: Recepción desactivada 1: Activa modo recepción
  • 10 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) Interrupciones del módulo SSP (SSPIF – SSPIE). PIR2 – PIE2 (0Dh – 8Dh) 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 como entradas. Configurar el MSSP en el registro SSPCON. Esclavo I2C con direcciones de 7 bits o con direcciones de 10 bits. Esclavo I2C 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 - SSPADD=0 LSb se usa para determinar la operación solicitada por el Maestro Esperar por un suceso I2C. 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.
  • 11 Comunicación Serie Síncrona I2C Maestro solicita escritura. Último byte fue una dirección Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 0 El Maestro va a escribir datos en el Esclavo - D/A = 0 El último byte recibido fue una dirección - BF = 1 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. 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. Comunicación Serie Síncrona I2C Maestro solicita escritura. Último byte fue un dato Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 0 El Maestro escribe datos en el Esclavo - D/A = 1 El último byte recibido fue un dato - BF = 1 El buffer está lleno Debe leerse el registro SSPBUF. Tras el byte de dirección, el Maestro puede enviar uno o más bytes de datos al Esclavo. 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.
  • 12 Comunicación Serie Síncrona I2C Maestro solicita lectura. Último byte fue una dirección Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 1 El Maestro va a leer datos del Esclavo - D/A = 0 El último byte recibido fue una dirección - BF = 0 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 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. 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 Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 1 El Maestro lee datos del Esclavo - D/A = 1 El último byte recibido fue un dato - BF = 0 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. Maestro solicita lectura. Último byte fue un dato El Maestro ya ha leído un dato del Esclavo y quiere leer otro.
  • 13 Comunicación Serie Síncrona I2C Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 0 La lógica del Esclavo queda reseteada - D/A = 1 El último byte recibido fue un dato - BF = 0 El buffer está vacío El envío de un NACK queda identificado porque R/W ¬ 0. De este modo indica que ya no quiere recibir más datos. 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. Maestro envía NACK El Maestro ha enviado un NACK como respuesta al dato que ha recibido desde el Esclavo. 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.
  • 14 Comunicación Serie Síncrona I2C Funcionamiento en modo Maestro Configurar el MSSP para funcionar en modo Maestro I2C. - Definir líneas SDA y SCL como entradas. TRISC ¬ xxx11xxx - Configurar el modo I2C. SSPCON1 ¬ 00101000 - Seleccionar los baudios de la comunicación. SSPADD ¬ [(fosc/Bd) / 4] – 1 Control del slew rate (SSPSTAT) - Configurar interrupciones (si se necesitan) SSPIE / SSPIF - BCLIE / BCLIF Implementar alguno de los 6 eventos I2C. 1. START 5. Reconocer (tras una lectura) 2. RESTART * ACK 3. STOP * NACK 4. Leer (recibir datos) 6. Escribir (transmitir datos) 100kHz 400kHz 1MHzSólo se usan los bits 0 a 6 Comunicación Serie Síncrona I2C Funcionamiento del Maestro 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. 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. 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. Se s up on e qu e la di re cc ió n es d e 7 bi ts
  • 15 Comunicación Serie Síncrona I2C Hacer SEN ¬ 1 para habilitar la generación de START. Bit SSPCON2. 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 (SSPSTAT) SEN ¬ 0 (SSPCON2) SSPIF ¬ 1 (PIR1) Generación de una secuencia de START repetido Hacer RSEN ¬ 1 para habilitar la generación de RESTART. Bit SSPCON2. 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. Generación de una secuencia START Comunicación Serie Síncrona I2C Generación de una secuencia STOP Hacer PEN ¬ 1 para habilitar la generación de STOP. Bit SSPCON2. 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 (SSPSTAT) PEN ¬ 0 (SSPCON2) SSPIF ¬ 1 (PIR1) Generación de una lectura (recepción) Hacer RCEN ¬ 1 para habilitar una lectura. Bit SSPCON2. 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.
  • 16 Comunicación Serie Síncrona I2C Generación de un ACK Hacer ACKEN ¬ 1 para habilitar la generación de ACK. Bit SSPCON2. 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. Generación de una escritura (transmisión) Indicar en ACKDT si se va a generar un ACK (“0”) o un NACK (“1”). Bit SSPCON2. - 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. Basta con escribir el dato a enviar en SSPBUF. ¡¡IMPORTANTE!! Antes de iniciar un evento es necesario que el evento anterior haya finalizado. Conviene desarrollar rutinas que comprue- ben si el módulo está inactivo antes de lan- zar 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). 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 I2C 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.
  • 17 Comunicación Serie Síncrona I2C Configuración del módulo I2C #use i2c (opciones) opciones: MASTER Selecciona modo Maestro SLAVE Selecciona modo Esclavo SCL = pin Especifica el pin SCL (PIN_C3) SDA = pin Especifica el pinSCL (PIN_C4) ADDRESS = nn Especifica la dirección del Esclavo FAST Selecciona la especificación I2C rápida SLOW Selecciona la especificación I2C lenta NOFORCE_SW Utiliza funciones I2C hardware. RESTART_WDT Resetea el WDT mientras espera a hacer una lectura de bus Bus I2C en el compilador C de CCS Si no se indica NOFORCE_SW, implementará el protocolo I2C por software. - Pensado para aquellos microcontroladores PIC que no disponen de MSSP. - El modo Esclavo, sin embargo, deberá usarse con el MSSP. Si no se indica NOFORCE_SW, implementará el protocolo I2C por software. - Pensado para aquellos microcontroladores PIC que no disponen de 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.
  • 18 Comunicación Serie Síncrona I2C Escritura en el bus I2C i2c_write (dato); valor1 = i2c_write (dato); dato: Entero de 8 bits a sacar por el bus. valor1: 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 dato: Entero de 8 bits. ack: Bit opcional ® 0 indica no enviar ACK 1 indica enviar ACK (valor por defecto) Lectura del bus I2C dato = i2c_read([ack]); 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: 0 (FALSE) si no se ha recibido un byte en el buffer. 1 (TRUE) si se ha recibido un byte en el buffer. valor1 = i2_poll(); Sólo se usa en PICs que disponen de MSSP.
Please download to view
18
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Description
Text
  • 1 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 EMISOR RECEPTOR Datos Referencia de tensión ¿Reloj? t t Datos Reloj Bit i Bit i+1 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. Se envía la señal de reloj si la distancia entre Emisor y Receptor es corta. De los sucesivos bits. De cada paquete de bits (8 ó 9 bits) 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 / Nivel bajo: 0 NRZI: Cambio de nivel: 1 / Sin cambio de nivel: 0 RZ: Impulso: 1 / Sin impulso: 0 ...
  • 2 Comunicación Serie Síncrona I2C Transferencia síncrona 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. Maestro Esclavo Dato Clk Maestro Esclavo Dato Clk Maestro Emitiendo Maestro Recibiendo Ref. Ref. La comunicación síncrona entre dos dispositivos requiere que uno de ellos actúe como maestro y el otro, como esclavo. Comunicación Serie Síncrona I2C Comunicación serie síncrona en microcontroladores PIC Se implementa mediante el módulo SSP 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 .... Synchronous Serial Port : Interfaz de comunicación serie síncrona. 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 I2C (Inter-Integrated Circuit: Entre Circuitos Integrados) I2C: Es una Marca Registrada de Philips
  • 3 Comunicación Serie Síncrona I2C Características generales del bus I2C El bus Inter-Integrated-Circuit (I2C) fue creado por Philips. Para transferencia de datos entre CIs de una PCB. Soporta transmisión de datos de hasta 400kbd. El bus I2C consiste físicamente en dos líneas de colector abierto. Un bus I2C 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. SCL para el reloj (pin RC3). SDA para los datos (pin RC4). La comunicación es, por tanto, half-duplex. Es más lento que el módulo SPI. 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 I2C 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 I2C 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.
  • 4 Comunicación Serie Síncrona I2C Fácil inclusión de nuevos dispositivos I2C en el bus. Una vez disponible el microcontrolador con sus funciones de interface con bus I2C, la inclusión de un dispositivo I2C 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 I2C. Periférico SDA SCL Rp Rp Rs Rs Cbus=10 – 400pF VDD OL OLDD p i VV R - ³ Número máx. de dispositivos definidos por la capacidad en el bus: Cmax=400pF Comunicación Serie Síncrona I2C Direccionamiento de dispositivos en el bus I2C Formato de 7 bits: (A7-A6-...-A1) S A7 A6 A5 A4 A3 A2 A1 R/W ACK Start Dirección de 7 bits del esclavo En la línea SDA: Lectura (1) o Escritura (0) Reconocimiento (lo debe poner el Esclavo)Lo “pone” el Maestro Formato de 10 bits: (A9-A8-A7-...-A0) S 1 1 1 1 0 A9A8 RW ACKA7A6A5A4A3 A2 A1 A0 SACK ACK Start Lectura (1) o Escritura (0) Reconocimientos del Esclavo después de cada byte del Maestro Primer byte del Maestro 2º byte del Maestro En la línea SDA:
  • 5 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 I2C desde el Maestro. Secuencia de recepción I2C por parte del Maestro. “0” porque el Maestro quiere escribir (enviar) De Maestro a Esclavo De Esclavo a Maestro Reconocimiento (A) o no reconocimiento (A) SDA: S Dirección del Esclavo R/W A Dato A Dato A/A P “1” porque el Maestro quiere leer (recibir) Dirección del Esclavo R/W A Dato A Dato A P No reconocimiento por Maestro y Parada SSDA:
  • 6 Comunicación Serie Síncrona I2C Típica transmisión I2C para lectura desde el Esclavo. Pulso ACK 87654321 9 87654321 9 87654321 9 D5D6 D3D43 D1D2 D0D7A6A7 A4A5 A2A3 A1 D5D6 D3D4 D1D2 D0D7 Pulso ACK Pulso ACK ACK R/W ACK NACK Recibe la dirección Recibe el dato Recibe el dato S P Típica transmisión I2C por parte del Esclavo. Pulso ACK 87654321 9 87654321 9 A6A7 A4A5 A2A3 A1 D5D6 D3D4 D1D2 D0D7 Pulso ACK ACK R/W NACK Recibe la dirección Envía el dato S P El Esclavo pone SCL a 0 para darse tiempo de preparar el dato Puesto por el Esclavo Puesto por el Maestro 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.
  • 7 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). Características del interface I2C en el módulo MSSP. - Detecta condiciones START y STOP en el bus por interrupción. - Permite seleccionar tres modos de operación. Esclavo I2C con dirección de 7 bits. Esclavo I2C con dirección de 10 bits. Maestro I2C con reloj SCL de frecuencia fSCL = fOSC/[4·(SSPADD+1)] - Seis registros asociados al funcionamiento de este módulo. SSPCON SSPCON2 SSPSTAT SSPADD SSPBUF SSPSR 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. Comunicación Serie Síncrona I2C Diagrama de bloques del bus I2C en modo Esclavo Detección de START/STOP SSPSR Leer RC3 / SCL Detecta coincidencia en la dirección o llamada general Bus de datos RC4 / SDA SSPBUF Detector de dirección SSPADD Escribir Reloj MSb LSb Control de los bits S y P del registro SSPSTAT Buffer para envío y recepción Buffer para envío y recepción Registro E/S No accesible directamente Registro E/S No accesible directamente Dirección asignada al Esclavo Dirección asignada al Esclavo
  • 8 Comunicación Serie Síncrona I2C Diagrama de bloques del bus I2C en modo Maestro Generación de START/STOP ACK SSPSR Leer RC3 SCL S , P , WCOL (SSPSTAT) SSPIF , BCLIF ACKSTAT , PEN (SSPCON2) Bus de datos RC4 SDA SSPBUF Generador de baudios Escribir Reloj MSb LSb SSPM3:SSPM0 SSPADD Detección de START/STOP Detección de colisión Control de CLK SDA In H ab ili ta re ce pc ió n Colisión de bus SCL In Ct rl C LK Ct rl C LK (d et ie ne f ue nt e de C LK ) Comunicación Serie Síncrona I2C Registro SSPSTAT (94h) D/A P R/W UASCKESMP BF bit 6 CKE: Bit de selección de niveles umbral en los pines 0: Especificaciones I2C 1: Especificaciones SMBus bit 5 D/A: Información del último byte transmitido 0: Dirección 1: Dato bit 4 P: Bit de STOP Se pone a 1 si la última secuencia detectada es un bit de STOP bit 2 R/W: Información de lectura/escritura 0: Escritura 1: Lectura (Esclavo ) 0: No hay transmisión 1: Transmisión en progreso (Maestro) bit 1 UA: Actualización del byte de dirección 0: No hace falta 1: Es necesario actualizar la dirección bit 0 BF: Bit de estado del buffer 0: SSPBUF está vacío 1: SSPBUF está lleno Maestro bit 7 SMP: Bit de control de slew rate 0: Velocidad estándar 1: Alta velocidad (400kHz) bit 3 S: Bit de START Se pone a 1 si la última secuencia detectada es un bit de START
  • 9 Comunicación Serie Síncrona I2C Registro SSPCON (14h) SSPEN CKP SSPM2 SSPM1SSPM3SSPOVWCOL SSPM0 bit 6 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 0: Desabilitado 1: Habilitado (usa SCL y SDA) bit 4 CKP: Control de SCL 0: Mantiene SCL a “0” 1: Reloj habilitado bits 3:0 SSPM3:SSPM0: Modo de funcionamiento 0110: Esclavo con direcciones de 7 bits. 0111 : Esclavo con direcciones de 10 bits. 1000: Maestro con CLK=Fosc / [4·(SSPADD+1)]. 1011 : Modo Maestro controlado por firmware (Esclavo inactivo). 1110: Maestro controlado por Fw (dir. de 7 bits, interrup. por bits de START y STOP). 1111: Maestro controlado por Fw (dir. de 10 bits, interrup. por bits de START y STOP). bit 7 WCOL: Bit de detección de colisión 0: No ha habido colisión 1: Ha habido colisión Comunicación Serie Síncrona I2C Registro SSPCON2 (91h) ACKDT ACKEN PEN RSENRCENACKSTATGCEN SEN bit 6 ACKSTAT: Bit de reconocimiento (Maestro / Recepción) 0: Recibido ACK del Esclavo 1: No se ha recibido ACK del Esclavo bit 5 ACKDT: Valor a transmitir tras una recepción (Maestro / Recepción) 0: ACK 1: NACK bit 4 ACKEN: Habilitación de secuencia ACK (Maestro / Recepción) bit 2 PEN: Habilitación de una secuencia STOP (Maestro ) 0: Desactivada 1: Inicia situación de STOP en SDA y SCL bit 1 RSEN: Habilitación de START repetido (Maestro) 0: Desactivado 1: Inicia repetidas situaciones de START bit 0 SEN: Habilitación de una secuencia START (Maestro) 0: Desactivada 1: Inicia situación de START en SDA y SCL Esclavo bit 7 GCEN: Habilita Llamada General 0: Deshabilitada 1: Habilita interrupciones por Llamada General bit 3 RCEN: Bit de habilitación de recepción (Maestro) 0: Desactivada 1: Inicia secuencia de reconocimiento en SDA y SCL 0: Recepción desactivada 1: Activa modo recepción
  • 10 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) Interrupciones del módulo SSP (SSPIF – SSPIE). PIR2 – PIE2 (0Dh – 8Dh) 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 como entradas. Configurar el MSSP en el registro SSPCON. Esclavo I2C con direcciones de 7 bits o con direcciones de 10 bits. Esclavo I2C 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 - SSPADD=0 LSb se usa para determinar la operación solicitada por el Maestro Esperar por un suceso I2C. 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.
  • 11 Comunicación Serie Síncrona I2C Maestro solicita escritura. Último byte fue una dirección Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 0 El Maestro va a escribir datos en el Esclavo - D/A = 0 El último byte recibido fue una dirección - BF = 1 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. 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. Comunicación Serie Síncrona I2C Maestro solicita escritura. Último byte fue un dato Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 0 El Maestro escribe datos en el Esclavo - D/A = 1 El último byte recibido fue un dato - BF = 1 El buffer está lleno Debe leerse el registro SSPBUF. Tras el byte de dirección, el Maestro puede enviar uno o más bytes de datos al Esclavo. 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.
  • 12 Comunicación Serie Síncrona I2C Maestro solicita lectura. Último byte fue una dirección Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 1 El Maestro va a leer datos del Esclavo - D/A = 0 El último byte recibido fue una dirección - BF = 0 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 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. 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 Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 1 El Maestro lee datos del Esclavo - D/A = 1 El último byte recibido fue un dato - BF = 0 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. Maestro solicita lectura. Último byte fue un dato El Maestro ya ha leído un dato del Esclavo y quiere leer otro.
  • 13 Comunicación Serie Síncrona I2C Bits del registro SSPSTAT. - S = 1 La última secuencia detectada fue un START - R/W = 0 La lógica del Esclavo queda reseteada - D/A = 1 El último byte recibido fue un dato - BF = 0 El buffer está vacío El envío de un NACK queda identificado porque R/W ¬ 0. De este modo indica que ya no quiere recibir más datos. 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. Maestro envía NACK El Maestro ha enviado un NACK como respuesta al dato que ha recibido desde el Esclavo. 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.
  • 14 Comunicación Serie Síncrona I2C Funcionamiento en modo Maestro Configurar el MSSP para funcionar en modo Maestro I2C. - Definir líneas SDA y SCL como entradas. TRISC ¬ xxx11xxx - Configurar el modo I2C. SSPCON1 ¬ 00101000 - Seleccionar los baudios de la comunicación. SSPADD ¬ [(fosc/Bd) / 4] – 1 Control del slew rate (SSPSTAT) - Configurar interrupciones (si se necesitan) SSPIE / SSPIF - BCLIE / BCLIF Implementar alguno de los 6 eventos I2C. 1. START 5. Reconocer (tras una lectura) 2. RESTART * ACK 3. STOP * NACK 4. Leer (recibir datos) 6. Escribir (transmitir datos) 100kHz 400kHz 1MHzSólo se usan los bits 0 a 6 Comunicación Serie Síncrona I2C Funcionamiento del Maestro 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. 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. 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. Se s up on e qu e la di re cc ió n es d e 7 bi ts
  • 15 Comunicación Serie Síncrona I2C Hacer SEN ¬ 1 para habilitar la generación de START. Bit SSPCON2. 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 (SSPSTAT) SEN ¬ 0 (SSPCON2) SSPIF ¬ 1 (PIR1) Generación de una secuencia de START repetido Hacer RSEN ¬ 1 para habilitar la generación de RESTART. Bit SSPCON2. 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. Generación de una secuencia START Comunicación Serie Síncrona I2C Generación de una secuencia STOP Hacer PEN ¬ 1 para habilitar la generación de STOP. Bit SSPCON2. 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 (SSPSTAT) PEN ¬ 0 (SSPCON2) SSPIF ¬ 1 (PIR1) Generación de una lectura (recepción) Hacer RCEN ¬ 1 para habilitar una lectura. Bit SSPCON2. 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.
  • 16 Comunicación Serie Síncrona I2C Generación de un ACK Hacer ACKEN ¬ 1 para habilitar la generación de ACK. Bit SSPCON2. 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. Generación de una escritura (transmisión) Indicar en ACKDT si se va a generar un ACK (“0”) o un NACK (“1”). Bit SSPCON2. - 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. Basta con escribir el dato a enviar en SSPBUF. ¡¡IMPORTANTE!! Antes de iniciar un evento es necesario que el evento anterior haya finalizado. Conviene desarrollar rutinas que comprue- ben si el módulo está inactivo antes de lan- zar 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). 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 I2C 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.
  • 17 Comunicación Serie Síncrona I2C Configuración del módulo I2C #use i2c (opciones) opciones: MASTER Selecciona modo Maestro SLAVE Selecciona modo Esclavo SCL = pin Especifica el pin SCL (PIN_C3) SDA = pin Especifica el pinSCL (PIN_C4) ADDRESS = nn Especifica la dirección del Esclavo FAST Selecciona la especificación I2C rápida SLOW Selecciona la especificación I2C lenta NOFORCE_SW Utiliza funciones I2C hardware. RESTART_WDT Resetea el WDT mientras espera a hacer una lectura de bus Bus I2C en el compilador C de CCS Si no se indica NOFORCE_SW, implementará el protocolo I2C por software. - Pensado para aquellos microcontroladores PIC que no disponen de MSSP. - El modo Esclavo, sin embargo, deberá usarse con el MSSP. Si no se indica NOFORCE_SW, implementará el protocolo I2C por software. - Pensado para aquellos microcontroladores PIC que no disponen de 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.
  • 18 Comunicación Serie Síncrona I2C Escritura en el bus I2C i2c_write (dato); valor1 = i2c_write (dato); dato: Entero de 8 bits a sacar por el bus. valor1: 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 dato: Entero de 8 bits. ack: Bit opcional ® 0 indica no enviar ACK 1 indica enviar ACK (valor por defecto) Lectura del bus I2C dato = i2c_read([ack]); 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: 0 (FALSE) si no se ha recibido un byte en el buffer. 1 (TRUE) si se ha recibido un byte en el buffer. valor1 = i2_poll(); Sólo se usa en PICs que disponen de MSSP.
Comments
Top