Вы находитесь на странице: 1из 47

El Bus

2C I

Introduccin

1980: Philips desarrolla el Bus de 2 alambres I2C para la comunicacin de circuitos integrados. Se han otorgado licencias a mas de 50 compaas, encontrndonos con ms de 1000 dispositivos electrnicos compatibles con I2C. Originalmente fue especificado para 100 kbits/s, e intencionalmente, para el control simple de seales, esto, sumado a su bajo costo, versatilidad tcnica y simplicidad aseguraron su popularidad.

Evolucin Del Bus I2C

Actualmente el Bus ha sido modificado para alcanzar velocidades de hasta 3.4 Mbits/s.
Combinado con una funcin de desplazamiento del nivel de voltaje, en modo High-speed (Hs-mode) ofrece una solucin ideal para los sistemas de tecnologa mezclada, donde las altas velocidades y la variedad de voltajes (5 V, 3 V o menor) son comnmente usados.

El modo Hs es compatible con todos los sistemas existentes del bus I2C, incluyendo el estndar original (S-mode) y el modo Fast (F-mode), actualizacin introducida en 1992, proveyendo 400 kbits/s en transferencia. Diferentes sistemas de velocidad pueden ser mezclados fcilmente, con un dispositivo maestro en modo Hs especialmente desarrollado, la conexin en paralelo es usada para conectar las partes ms lentas del sistema, todos los dispositivos en modo Hs se comunicarn bidireccionalmente a toda velocidad mientras se utilicen los modos F/S (Fast/Standard) de velocidades con las partes ms lentas del sistema.

Principales Equipos Con El Bus Incorporado

Los procesadores de seal o "jungla" en televisores (LA7610, TA1223, DTC810,...) Memorias 24Cxx Codificadores de video de reproductores de DVD (SAA 7128, TC 90A32F,...) Preamplificadores de video en monitores (KB 2502 ) Etc...

Caractersticas ms salientes del bus I2C son:

Se necesitan solamente dos lneas, la de datos (SDA) y la de reloj (SCL).


Cada dispositivo conectado al bus tiene un cdigo de direccin seleccionable mediante software. Habiendo permanentemente una relacin Master/ Slave entre el micro y los dispositivos conectados.

El bus permite la conexin de varios Masters, ya que incluye un detector de colisiones. El protocolo de transferencia de datos y direcciones posibilita disear sistemas completamente definidos por software. Los datos y direcciones se transmiten con palabras de 8 bits.

Criterios para Utilizar I2C

Un sistema consiste en al menos un microcontrolador y varios sistemas perifricos como memorias o circuitos diversos.
El costo de conexin entre los varios dispositivos dentro del sistema debe de ser el mnimo.

El sistema que utiliza este Bus no requiere una alta tasa de transferencia de datos.

La total eficacia del sistema depende de la correcta seleccin de la naturaleza de los dispositivos y de la interconexin de la estructura del bus.

Protocolo

Terminologa bsica del Bus I2C


Trminos Transmisor Receptor Master (Maestro) Descripcin El dispositivo que enva datos al Bus El dispositivo que recibe datos desde el Bus El dispositivo que inicia una transferencia, genera las seales del reloj y termina un envo de datos

Slave (Esclavo) El dispositivo direccionado por un master Multi-Master Arbitraje Sincronizacin

Ms de un master puede controlar el bus al mismo tiempo sin corrupcin de los mensajes
Procedimiento que asegura que si uno o mas master simultneamente deciden controlar el Bus solo uno es permitido a controlarlo y el mensaje saliente no es deteriorado Procedimiento para sincronizar las seales del reloj de dos o mas dispositivos

Instrucciones en el I2C Bus

Para operar un esclavo sobre el Bus I2C solo son necesarios seis simples pasos, suficientes para enviar o recibir informacin. Un bit de Inicio 7-bit o 10-bit de direccionamiento Un R/W bit que define si el esclavo es transmisor o receptor Un bit de reconocimiento Mensaje dividido en bytes Un bit de Stop

Condiciones de Inicio (Start) y Stop


Dentro del proceso de transferencia de datos en el bus I2C hay dos situaciones bsicas que son el inicio y el Stop de toda transferencia de datos. Estas son:
- INICIO (START) - Una transicin de "1" a "0" (cada) en la lnea de datos (SDA) mientras la lnea del reloj (SCL) esta a "1". - PARADA (STOP) - Una transicin de "0" a "1" (ascenso) en la lnea de datos (SDA) mientras la lnea de reloj (SCL) esta a "1"

Las condiciones de Inicio y Stop son siempre generadas por el Master. El Bus I2C se considera ocupado despus de la condicin de Inicio. El Bus se considera libre de nuevo despus de un cierto tiempo tras la condicin de Stop.

Transfiriendo datos

El numero de bytes que se enven a la lnea SDA no tiene restriccin. Si un dispositivo esclavo no puede recibir o transmitir un byte de datos completo hasta que haya acabado alguno de los trabajos que realiza, puede mantener la lnea SCL a "0" lo que fuerza al Master a permanecer en un estado de espera. Los datos continan transfirindose cuando el dispositivo esclavo esta listo para otro byte de datos y desbloquea la lnea de reloj SCL.

Reconocimiento

El bit de reconocimiento es obligatorio en la transferencia de datos. El pulso de reloj correspondiente al bit de reconocimiento (ACK) es generado por el Master. El Transmisor desbloquea la lnea SDA ("1") durante el pulso de reconocimiento. El receptor debe poner a "0" la lnea SDA durante el pulso ACK de modo que siga siendo "0" durante el tiempo que el master genera el pulso "1" de ACK.

Arbitraje

Un master puede iniciar una transmisin solo si el bus esta libre. Dos o mas master pueden generar una condicin de Inicio en el bus lo que da como resultado una condicin de Inicio general. Cada Master debe comprobar si el bit de datos que transmite junto a su pulso de reloj, coincide con el nivel lgico en la lnea de datos SDA. El sistema de arbitraje acta sobre la lnea de datos SDA, mientras la lnea SCL esta a nivel "1", de una manera tal que el master que transmite un nivel "1", pierde el arbitraje sobre otro master que enva un nivel "0" a la lnea de datos SDA. Esta situacin continua hasta que se detecte la condicin de Stop generada por el master que se hizo cargo del Bus.

Procedimiento de Arbitraje entre dos Master

Formato

Los datos transferidos tienen la siguiente forma estndar:

Despus de la condicin de Start un cdigo de direccin de un esclavo es enviada, esta direccin tiene 7 bits seguidos por un octavo cdigo que corresponde a una direccin R/W (0-indica transmisin/1-indica solicitud de datos). Una transferencia de datos siempre acaba con una condicin de Stop generado por el master, sin embargo si un master todava desea comunicarse con el bus, puede generar repetidamente condiciones de Start y direccionar a otro esclavo sin generar primero la condicin de stop.

Comunicacin I2C entre Microcontrolador MSP430F149 y Memoria EEPROM 24LC515

Comunicacin I2C entre Microcontrolador MSP430F149 y Memoria EEPROM 24LC515

MSP430F149 no posee hardware para el protocolo I2C, entonces debe ser implementado por software. En la tarjeta EasyWeb se comunica el microcontrolador (maestro) y la memoria EEPROM (esclavo), a travs de I2C: -Comunicacin I2C en memoria EEPROM. -Comunicacin I2C en microcontrolador.

Esquema de conexiones I2C implementado en la tarjeta


ESQUEMA DE CONEXIONES

P2_0

/RESET RXD0 TXD0

+5V

+3,3V +3,6V GND

EXTERNO
SDA SCL

+Vcc
7 3 2 1 8 WP A2 A1 A0 GND 4

2K
VCC SDA SCL 5 6 P4.0 P4.1 SDA SCL

EEPROM MSP430F149

Comunicacin I2C en Memoria EEPROM

Capacidad 64KB y preparada para operar a 400KHz 8 pines en total:


A0 A1 A2 GND SDA SCL WP Vcc Direccionamiento Direccionamiento Conectado a +Vcc Tierra Seal Datos Serial Seal Reloj Bloque de escritura +2.5 [V] a +5.5 [V]

Comunicacin I2C en Memoria EEPROM


2 bits para direccionamiento 4 dispositivos esclavos en paralelo (ej: 4 EEPROM). Un Bus de dos lneas bi-direccionales SDA y SCL, el dispositivo maestro controla el Bus a travs de la seal SCL. Tanto maestro (microcontrolador) y esclavo (EEPROM) pueden transmitir o recibir.

Comunicacin I2C en Memoria EEPROM

Por cada Byte enviado correctamente el receptor debe generar un pulso de acuso de recibo (ACK). (Transmisor debe desocupar la lnea). Existen cuatro estados de inters del Bus:
Estado Bus Desocupado Partida de Tx Detencin de Tx Dato Vlido SDA Alto Canto de bajada Canto de subida Datos SCL Alto Alto Alto Bajo

Direccionamiento del Dispositivo

Byte de Control: - Cdigo control cdigo que indica modo de operar. (1010 = R/W). - Bit B0 para acceder a cada mitad de memoria. - A0 y A1 coincide con pines selecciona el dispositivo. - R/W un 1 si se lee y un 0 si se ecribe. Se enva en dos bytes la direccin de memoria con que se pretende operar.

Asignacin de Bits en Secuencia de Direccionamiento

Byte de Control

B 0

A 1

A 0

R/ W

Direccionamiento del Dispositivo

Cdigo de control

Byte Direccin Alta

A A A A A A 14 13 12 11 10 9

A 8

Byte Direccin Baja

A 7

A 6

A 5

A 4

A 3

A 2

A 1

A 0

X=Bit sin importancia

tiempo

Dir. Modo Bit Selector Disp. Escritura/ Lectura de Bloque

Escritura en Memoria

2 formas de escribir en memoria (el bit R/W del Byte de control debe estar en 0): - Escritura por byte. - Escritura por Pgina.

Escritura en Memoria

Escritura por Byte: -Se direcciona la parte de la memoria que ser escrita. -Se enva byte que se desea escribir. -Luego se genera condicin de parada y se detiene comunicacin. -Se escribe byte en memoria.

Escritura en Memoria

Escritura por Pgina: -Igual que escritura por byte, pero en ves de generar la parada se sigue enviando bytes. -Se genera condicin de parada. -Se escribe en memoria TODOS los bytes enviados.

Lectura en Memoria

Existe un puntero local de direccionamiento en la memoria. 3 maneras de leer la memoria EEPROM (bit R/W de Byte de control debe estar en 1): - Lectura de Direccin Actual. - Lectura Aleatoria. - Lectura Secuencial.

Lectura en Memoria

Lectura de Direccin Actual: -Se enva byte de control con bit R/W en 1. -Memoria responde con contenido de la direccin a la que apunta el puntero local de direccionamiento . -Condicin de parada

Lectura en Memoria

Lectura Aleatoria: -Se direcciona el Byte que ser ledo (bit R/W en escritura 0) . -Se genera condicin de partida nuevamente (no mueve puntero). -Se enva Byte de control con bit R/W en lectura 1. -EEPROM responde contenido de la direccin deseada. -Condicin de parada (puntero sobre siguiente direccin).

Lectura en Memoria

Lectura Secuencial: -Se direcciona el Byte que ser ledo (bit R/W en escritura 0) -Se genera condicin de partida nuevamente (no mueve puntero) -Se enva Byte de control con bit R/W en lectura 1 -EEPROM responde contenido de la direccin deseada. -Microcontrolador enva ACK -EEPROM transmite siguiente contenido de direccin secuencial -Para interrumpir, en vez de ACK se enva condicin de parada

Comunicacin I2C en Microcontrolador

Se utiliza los pines 0 y 1 del puerto 4: -Pin P4.0 es la lnea SDA (transmisin de datos) -Pin P4.1 es la lnea SCL (reloj) Configuracin de Puerto 4 necesita de 4 registros: -P4IN registro que almacena dato recibido (entrada). -P4OUT registro que almacena dato transmitido (salida). -P4DIR registro que controla si se actuar como receptor o transmisor. (Transmisor-> 1 Receptor->0). -P4SEL registro que indica que funcin cumplir el pin, para operar en modalidad I2C debe estar en 0

Implementacin de I2C por software para manejo de EEPROM en tarjeta Easy Web II

Diagrama de Flujo: Programacin.


SI

Inicializaciones

Start

Byte de Control

SI R/W=0 ? NO

Escribir Datos

ACK=0 ?
NO

Configuracin de Puertos para dejar SDA y SCL en niveles altos Lectura de Datos

Notar que para procesos de Lectura Aleatoria y Secuencial, se debe realizar una secuencia de escritura para direccionar.

SI
NO ACK=0 ? STOP=1 ? SI NO

Tres tipos: Lectura Aleatoria. Lectura Secuencial. Lectura Direccin Actual.

Stop

Funciones de control de las lneas del bus

SetLowSDA();
SetLowSCL();

SetHighSDA();
SetHighSCL();

Establece el pin SDA como salida (P4DIR=1). Baja la seal de SCL (P4OUT=0). Establece el pin SDA como entrada (P4DIR=0). Sube la seal de SCL (P4OUT=1).

Funciones de control de las lneas del bus


static void SetLowSDA(){ P4DIR |= SDA; } static void SetHighSDA(){ P4DIR &= ~SDA; }
static void SetLowSCL(){ P4OUT &= ~SCL; } static void SetHighSCL(){ P4OUT |= SCL; } // SDA Salida

// SDA Entrada

Funciones de transferencia de Datos

ic2Init();
ic2Start();

ic2Stop();
ic2Read();

ic2Write();

Inicializa el bus (SDA y SCL en alto). Establece una condicin de partida. Establece una condicin de termino. El micro empieza a leer bytes de datos que le enva la EEPROM. El micro empieza a escribir bytes en la EEPROM.

Funciones de transferencia de Datos


/*************************/ /* Inicializar las lineas*/ /* y el bus */ /*************************/ void i2cInit(){ int j; P4SEL &= P4SEL &= ~SDA; ~SCL;

// Funcion I/O para SDA Y SCL

P4OUT &= ~SCL; P4OUT &= ~SDA; P4DIR |= SCL; P4DIR &= ~SDA; SetHighSCL(); SetLowSDA(); SetHighSDA();

// Salida a cero // SDA Open Colector // SCL COMO SALIDA // SDA COMO ENTRADA

// visto en el analizador logico como un pulso de // 5 a 3.56 microsegundos aprox.

// Ambas lineas quedan en alto }

Funciones de transferencia de Datos


/*************************/ /* Start Data Transfer */ /*************************/ void i2cStart(){ SetHighSCL(); SetHighSDA(); SetHighSCL(); SetLowSDA(); SetLowSCL(); SetHighSDA(); /* Visto en el analizador lgico como: * SCL ------------------_________________ * SDA -----____________________--------* 0 2.7 5.5 microsegundos */ }

Funciones de transferencia de Datos


/*************************/ /* Stop Transfer */ /*************************/ void i2cStop(){ int j; SetLowSCL(); SetLowSDA(); SetHighSCL(); SetLowSDA(); SetHighSCL(); SetHighSDA(); }

Funciones de transferencia de Datos


/*************************/ /* Write Transfer */ /*************************/ int i2cWrite(char a){ int i,j; int retorno; for (i=0; i<8; i++){ SetLowSCL(); if (a & 0x80) SetHighSDA(); else SetLowSDA(); SetHighSCL(); a <<= 1; } SetLowSCL(); /* ack Read */ SetHighSDA(); SetHighSCL(); if (P4IN & SDA) retorno = NO_I2C_ACK; else retorno = OK_I2C_ACK; SetLowSCL(); return(retorno); } // el slave no ha bajado la linea

// Primero el bit mas significativo

Funciones de transferencia de Datos


/*************************/ /* Read Transfer */ /*************************/ char i2cRead(int ack){ int i,j; char caracter = 0x00; SetLowSCL(); SetHighSDA(); for (i=0; i<8; i++){ caracter = caracter << 1; SetHighSCL(); if (P4IN & SDA) caracter = caracter + 1; SetLowSCL(); } if (ack){ SetLowSDA(); } SetHighSCL(); SetLowSCL(); return (caracter); } //Send ACK to sender

Ejemplo de escritura.
#define EEPROM 0xA0 main(){ int i; char writeText[] = "I2C la lleva"; i2cInit (); //Inicializamos los puertos. i2cStart (); i2cWrite(EEPROM); //Se enva el byte de control de la EEPROM i2cWrite(0x00); //Bits ms significativos para direccionamiento. i2cWrite(0x00); //Bits menos significativos del direccionamiento. for(i = 0; i < strlen(writeText); i++) i2cWrite(writeText[i]); // Se escriben los datos en la EEPROM. i2cStop();

Ejemplo de Lectura Secuencial.


#include "i2c.h" #define EEPROM 0xA0

main() { int i, accesEEPROM; char textoRead[64];

// Arreglo del largo que se necesite

i2cStart(); accesEEPROM = i2cWrite(EEPROM); while(!accesEEPROM) accesEEPROM = i2cWrite(EEPROM); i2cWrite(0x00); i2cWrite(0x00); i2cStart(); accesEEPROM = i2cWrite(EEPROM | 1 ); for (i = 0; i < strlen(texto) - 1; i++) textoRead[i]= i2cRead(1); textoRead[i]=i2cRead(0); i2cStop(); }

//retorno de la funcin i2cwrite () //Mientras el slave no haya bajado la lnea. //Se espera ack //Direccin a la cual queremos acceder.

//EEPROM 0xA1 (lectura) //largo del texto que se escribi. // Lectura Secuencial, con envo de ack // Fin de la lectura secuencial

Вам также может понравиться