MARINA BENLLOCH VERDEGUER SONIA ESCRIVÁ IVÁÑEZ SABINA MANZANO RODRÍGUEZ JOSE T. MEDINA LUQUE JUAN SEGUÍ MORENO I.) INTRODUCCIÓN........................................................................................................................................................ 4 CARACTERÍSTICAS.............................................................................................................................................................4 DESCRIPCIÓN......................................................................................................................................................................5 II.) CARACTERÍSTICAS ELÉCTRICAS .................................................................................................................6 III.) DESCRIPCIONES DE PIN ................................................................................................................................... 9 1. SERIAL ATA (SDA).......................................................................................................................................................9 2. SERIAL CLOCK (SCL) ...................................................................................................................................................9 3. W RITE-PROTECT (WP).................................................................................................................................................9 IV.) CARACTERÍSTICAS DEL BUS .......................................................................................................................10 1. BUS NO OCUPADO (A).................................................................................................................................................10 2. COMIENZO DE TRANSFERENCIA DE DATOS (B) .......................................................................................................10 3. FINAL DE TRANSFERENCIA DE DATOS (C)................................................................................................................10 4. DATOS VÁLIDOS (D) ...................................................................................................................................................10 5. RECONOCIMENTO........................................................................................................................................................10 V.) DISPOSITIVO DE DIRECCIONAMIENTO ...................................................................................................10 1. DIRECCIONAMIENTO CONTIGUO A TRAVÉS DE MÚLTIPLES DISPOSITIVOS ..........................................................12 VI.) OPERACIONES DE ESCRITURA...................................................................................................................14 1. ESCRITURA DE BYTES.................................................................................................................................................14 2. ESCRITURA DE PÁGINA...............................................................................................................................................14 3. PROTECCIÓN DE ESCRITURA ......................................................................................................................................14 VII.) INTERROGACIÓN DE RECONOCIMIENTO. .........................................................................................16 VIII.) OPERACIÓN DE LECTURA. ........................................................................................................................17 1. LECTURA DE DIRECCIÓN DE CORRIENTE..................................................................................................................17 2. LECTURA ARBITRARIA ................................................................................................................................................17 3. LECTURA SECUENCIAL ...............................................................................................................................................18 IX.) BUS I2C: PRESENTACION DEL PROTOCOLO .......................................................................................24 1. INTRODUCCIÓN............................................................................................................................................................24 2. EVOLUCIÓN DEL BUS I2C..........................................................................................................................................24 2.1 Principales equipos con el bus incorporado.................................................................................................24 2.2 Características más salientes del bus I2C .....................................................................................................24 2.3 Criterios para Utilizar I2C...............................................................................................................................24 X.) PROTOCOLO I2C...................................................................................................................................................25 1. TERMINOLOGÍA BÁSICA DEL BUS I2C.....................................................................................................................25 2. GENERALIDADES DEL PROTOCOLO ..........................................................................................................................27 2.1 Características Generales.................................................................................................................................27 2.2 Transferencia Del Bit.........................................................................................................................................27 3. INSTRUCCIONES EN EL BUS I2C...............................................................................................................................28 3.1 Condiciones de Inicio (Start) y Stop...............................................................................................................28 3.2 Transfiriendo datos............................................................................................................................................28 3.3 Reconocimiento...................................................................................................................................................29 4. ARBITRAJE Y GENERACIÓN DE SEÑALES DE RELOJ .............................................................................30 4.1 Arbitraje ...............................................................................................................................................................30 4.2 Formato................................................................................................................................................................31 XI.) COMUNICACION I2C ENTRE MICROCONTROLADOR MSP430F149 Y MEMORIA EEPROM 24LC512.........................................................................................................................................................32 1. INTRODUCCION......................................................................................................................................................32 2. COMUNICACION I2 C EN MEMORIA EEPROM .............................................................................................32 2.1 Descripción De Memoria EEPROM. .............................................................................................................32 2.2 Descripción de Pines.........................................................................................................................................33 2.3 Características del Bus y Funcionamiento ....................................................................................................33 2.4 Pulso de Acuso de Recibos (ACK)...................................................................................................................34 2.5 Direccionamiento de Dispositivo.....................................................................................................................34 2.6 Escritura en Memoria........................................................................................................................................35 2.7 Lectura de Memoria...........................................................................................................................................35 3. COMUNICACIÓN I2C EN MICROCONTROLADOR.....................................................................................35 XII.) IMPLEMENTACIÓN DE I2C POR SOFTWARE EN LA TARJETA DE DESARROLLO EASYWEB II ....................................................................................................................................................................37 1. CONEXIÓN FÍSICA ENTRE MSP430F149 Y EEPROM 24LC512.................................................................37 2. ACCESO A LOS PUERTOS DE I/O......................................................................................................................38 3. FUNCIONES DE CONTROL DE LÍNEAS SDA Y SCL ...................................................................................39 3.1 SetLowSDA y SetHighSDA ..............................................................................................................................39 3.2 SetLowSCL y SetHighSCL...............................................................................................................................39 4. FUNCIONES DE TRANSFERENCIAS DE DATOS .........................................................................................40 4.1 Función i2cInit().................................................................................................................................................40 4.2 Función i2cStart() ..............................................................................................................................................41 4.3 Función i2cStop() ...............................................................................................................................................41 4.4 Función i2cWrite( ).............................................................................................................................................42 4.5 Función i2cRead() ..............................................................................................................................................43 XIII.) PROGRAMACION DE I2C............................................................................................................................ 44 1. DIAGRAMA DE FLUJO DE LA PROGRAMACIÓN DE I2C.........................................................................44 2. EJEMPLOS DE PROGRAMACIÓN......................................................................................................................46 2.1 Ejemplo de lectura secuencial..........................................................................................................................46 2.1 Ejemplo de escritura ..........................................................................................................................................47 XIV.) BIBLIOGRAFIA.................................................................................................................................................48 I.) INTRODUCCIÓN CARACTERÍSTICAS Tecnología de baja potencia del CMOS: - Corriente de escritura máxima 5 mA en 5.5V. - Corriente de lectura máxima 400µA en 5.5V. - Corriente de espera 100nA típica en 5.5V. - Interfaz de bús serie de dos hilos, I2C™ compatible. - Hasta ocho dispositivos en cascada. - Ciclo de lectura/escritura al mismo tiempo. - Modo disponible de escritura de página de 128-bytes. - Tiempo de ciclo de escritura máximo: 5ms. - Hardware de protección de escritura para todo el vector. - Entradas del trigger de Schmitt para la supresión del ruido - 1.000.000 ciclos de lectura/escritura - Protección electrostática de la descarga > 4000V - Retención de los datos > 200 años - 8-pin PDIP, SOIC (208 mil), y empaquetados DFN. - Paquete TSSOP de 14 plomos. - Disponibles estándares finales y libres de plomo -Rango de temperaturas: • Industrial: -40ºC a 85ºC • Automotor: -40ºC a 125ºC DESCRIPCIÓN El Microchip Technology Inc. 2AA512/24LC512/24FC512 (24XX512*) es de 64K x (512 Kbit). Es una memoria tipo EEPROM, capaz de borrar desde 1.8V a 5.5V. Se ha desarrollado para aplicaciones avanzazas, de baja potencia tales como comunicaciones personales y la adquisición de datos. La capacidad de escritura de página de este dispositivo es de hasta 128 bytes de datos. Este dispositivo es capaz de leer de forma aleatoria y secuencial has ta 512K. Las líneas de dirección permiten hasta ocho dispositivos en el mismo bus, para espacio de direccio namiento de hasta 4 Mbit. II.) Características Eléctricas Valores absolutos máximos: III.) Descripciones de PIN Las entradas A0.A1 y A2 son utilizadas por el 24XX512 para operaciones de varios dispositivos. Los niveles lógicos en estas entradas son comparadas con los correspondientes bits en la dirección del esclavo. El chip es seleccionado si coinciden. Hasta 8 dispositivos pueden ser conectados al mismo bus utilizando diferentes combinaciones de Bit escogidas. En muchas aplicaciones, las entradas A0,A1y A2 del chip de direccionamiento son difíciles de poner a ‘0’ o a ’1’. Para aplicaciones en las que estos pines son controlados por un microcontrolador u otro dispositivo lógico programable, los pines del chip de direccionamiento deben ser puestos a ‘0’ ó ‘1’ lógicos antes de que la operación del dispositivo normal proceda. 1. SERIAL ATA (SDA) Este es un pin bidireccional usado para trans ferencia de direcciones y entrada de datos y salida de datos del dispositivo. El bus SDA requiere una resistencia de subida a Vcc (típicamente 10k para 100kHz, 2k para 400kHz y 1Mhz). Para una transferencia de datos normal, el SDA permite cambiar solo durante bajo SCL. Los cambios durante SCL alto estan reservados para indicar las condiciones de inicio y fin. 2. SERIAL CLOCK (SCL) Este pin se utiliza para sincronizar la transferencia de datos hacia y desde el dispositivo. 3. WRITE-PROTECT (WP) Este pin tampoco puede conectar Vss o Vcc. El circuito interno de bajada en este pin mantendrá el dispositivo en estado desprotegido si la flotación izquierda, sin embargo, la flotación de este pin no esta recomendada para muchas aplicaciones. Si atamos a Vcc, las operaciones normales de la memoria son permitidas (read/write en la memoria entera 0000FFFF) Si atamos a Vcc, las operaciones de escritura son limitados.Las operaciones de lectura no se ven afectadas. IV.) Características del bus El protocolo del bus tiene las siguientes características: -La transferencia de datos puede ser iniciada solo cuando el bus no esté ocupado. -Durante la transferencia de datos, la línea de datos debe permanecer estable siempre que la línea del reloj esté a nivel alto. Los cambios en la línea de datos, mientras la línea de reloj, deberá ser interpretada como condición de Comienzo o de Parada. Las siguientes condiciones del bus están definidas en: FIGURA 4.1 1. BUS NO OCUPADO (A) Ambas líneas (reloj y datos) permanecen altos 2. COMIENZO DE TRANSFERENCIA DE DATOS (B) Una transición alta o baja de la linea SDA mientras el reloj (SCL) está a nivel alto determina una condición de comienzo. Todos los comandos deben ser precedidos por una condición de comienzo. 3. FINAL DE TRANSFERENCIA DE DATOS (C) Una transición baja o alta de la linea SDA mientras el reloj (SCL) está a nivel alto determina una condición de parada. Todas las operaciones deben acabar con una condición de parada. 4. DATOS VÁLIDOS (D) El estado de la línea de datos representa datos válidos cuando, después de la condición de comienzo, la linea de datos es estable para la duración alta del periodo de la señal de reloj. Los datos deben ser cambiados durante el periodo bajo de la señal de reloj. Hay un bit de datos por pulso de reloj. Cada transferencia de datos es iniciada con una condición de comienzo y fin con una condición de Parada. El número de bytes de datos transferidos entre las condiciones de comienzo y parada son determinadas por el dispositivo maestro. 5. RECONOCIMENTO Cada dispositivo receptor debe generar una señal de reconocimiento después de la recepción de cada byte. El dispositivo maestro debe generar un pulso de reloj extra el cual es asociado con este bit reconocido. Ver figura 4-2 para el tiempo de reconocimiento. NOTA: La memoria 24LC512 no genera ningún bit de reconocimiento si un ciclo de programa interno está en proceso. Un dispositivo de reconocimiento pone a nivel bajo la línea de SDA durante el reconocimiento del pulso de reloj. La línea de SDA está estable durante el periodo alto de reconocimiento relacionado con el pulso de reloj. Por supuesto, el sistema y el tiempo de mantenimiento deben ser tenidos en cuenta. Durante las lecturas, al finalizar la transmisión de datos, se genera un bit de reconocimiento en el último byte que ha sido contabilizado. En este caso, la memoria (24LC512) dejará a nivel alto la línea de datos para que se pueda generar la condición de Parada. V.) DISPOSITIVO DE DIRECCIONAMIENTO El primer byte recibido es el byte de control, seguido de la condición de Comienzo desde el dispositivo maestro (Figura 5-1). El byte de control consiste en un codigo de 4 bits de control; para el 24LC512 este es puesto como ‘1010’ binario para las operaciones de lectura y escritura. Los siguientes 3 bits del byte de control son bits de selección del Chip (A2,A1 y A0). Los bits de selección del chip permite el uso de hasta 8 dispositivos 24XX512 en el mismo bus y son usados para seleccionar qué dispositivo está accediendo. Los bits de selección del chip en el byte de control deben corresponder con los niveles lógicos en los correspondientes pines A0, A1 y A2 para la respuesta del dispositivo. Estos bits son en efecto los 3 bits más significativos de la dirección. El último bit del byte de control define la operación para ser realizada. Cuando se pone a 1 se selecciona la operación de lectura y cuando se pone 0 se selecciona la operación de escritura. Los siguientes 2 bytes recibidos definen la dirección del primer byte de datos (Figura 5-2). Puesto que todos A15…A0 son utilizados, no hay bits de dirección superior que son no preocupantes. Los bits de dirección superior son los primeros en transferirse, seguido por los bits menos significantes. Dependiendo del estado del bit R/W, la 24XX512 seleccionará una operación de lectura o escritura. 1. DIRECCIONAMIENTO DISPOSITIVOS CONTIGUO A TRAVÉS DE MÚLTIPLES Los bits de selección del Chip A2, A1 y A0 pueden ser usados para expandir el espacio de direc cionamiento contiguo para 4 Mbits mediante 8 24XX512s en el mismo bus. En ese caso, el software puede usar el bit A0 del byte de control como el bit de dirección A16; A1 como el bit de dirección A17; y A2 como el bit de dirección A18. No es posible una lectura secuencial a través de los límites del dispositivo. VI.) OPERACIONES DE ESCRITURA 1. ESCRITURA DE BYTES El control del código (cuatro bits), la selección del chip (tres bits) y el bit de lectura/escritura (que es un nivel lógico bajo) son cronometrados en el bus por el transmisor. Esto indica al receptor que la dirección de bit más alta seguirá después de haber generado un bit Acknowledge durante el noveno ciclo de reloj. Por lo tanto, el siguiente bit transmitido es el bit de orden de la dirección de palabra y debe ser escrita en el indicador de dirección de la memoria 24LC512. El siguiente byte es el bit de dirección menos significativo. Después de recibir otro Acknowledge de la memoria 24LC512, el dispositivo transmitirá los datos para ser escritos en la posición de memoria. La memoria 24LC512 reconoce otra vez y se genera una condición de parada. Esto inicia el ciclo de escritura interna y durante es te tiempo, la memoria 24LC512 no generará señal de reconocimiento (Figura 6-1). Si una tentativa está hecha para escribir con el pin WP más alto, el dispositivo reconocerá el orden, pero no se escribirán datos y el dispositivo aceptará inmediatamente un nuevo comando. Después de un comando de escritura de byte, el contador de dirección interno señalará a la posición de dirección después de que fuera escrito. 2. ESCRITURA DE PÁGI NA El bit de control de escritura, la dirección de palabra y los primeros datos del bit son transmitidos a la memoria 24LC512 de la misma manera que se escriben en un bit. Pero en vez de generar una condición de parada, el dispositivo transmite hasta 127 bytes adicionales, que temporalmente son almacenados en el buffer y serán escritos en la memoria después de que se transmitan una condición de parada. Después de recibir cada palabra, los siete bits del indicador de dirección inferiores son internamente incrementados por uno. Si se transmiten más de 128 bytes antes de la generación de la condición de parada, el contador de dirección dará una vuelta y los datos recibidos previamente serán sobreescritos. Como con la operación de escritura de byte, una vez que la condición de parada es recibida, un ciclo de escritura interno comenzará (Figura 6-2). Si se hace una tentativa para escribir con el pin alto de WP, el dispositivo reconocerá la orden, pero si no se escribe el ciclo ocurrirá que ningún dato será escrito y el dispositivo inmediatamente aceptará una nueva orden. 3. PROTECCIÓN DE ESCRITURA Los pins WP (write-protect ) permiten al usuario el rango (0000-FFFF) cuando el pin está a VCC. Si está conectado al VSS, la protección de escritura está desconectada. El pin del WP se muestrea en el bit de Parada para cada comando de Escribtura (Figura 1-1). VII.) INTERROGACIÓN DE RECONOCIMIENTO. Ya que el dispositivo no reconocerá al ACK durante un ciclo de escritura, este puede ser usado para determinar cuando el ciclo se ha completado (este rasgo puede ser usado para maximizar el rendimiento del bus). Primero la condición de Parada para comandos de escritura es emitida por el master, el dispositivo inicia el ciclo de tiempo de escritua internamente.La Interrogación ACK puede ser iniciada inmediatamente. Esto implica al master a mandar una condición de Comienzo, seguida por el byte de control para un comando de escritura (R/W=0). Si el dispositivo está todavía ocupado con el ciclo de escritura, entonces no será devuelto el ACK. Si no se devuelve el ACK, entonces el bit de Comienzo y el byte de control deben ser vueltos a enviar. Si el ciclo se completa, entonces el dispositivo devolverá el ACK y el master podrá proceder con el siguiente comanda de lectura o escritura. Ver Figura 7-1 para ver diagrama del flujo. VIII.) OPERACIÓN DE LECTURA. Las operaciones de lectura son iniciadas de la misma forma que las operaciones de escritura a excepción de que el bit R/W del byte de control se pone a 1. Hay 3 tipos básicos de operaciones de lectura: lectura de dirección de corriente, lecura arbitraria y lectura secuencial. 1. LECTURA DE DIRECCIÓN DE CORRIENTE La 24LC512 contiene un contador de dirección que mantiene la dirección de las últimas palabras accedidas, internamente incrementado por 1.Por lo tanto, si el acceso a la lectura anterior fuese n (n es cualquier dirección legal), la siguiente operación de lectura de dirección tendría acceso a datos desde la dirección n+1. Sobre recibo del byte de control con el bit R/W puesto a 1, la 24XX512 publica un reconocimiento y transmite la palabra de datos de 8-bits. El master no reconocerá la transferencia pero generará una condición de Parada y la 24LC512 cortará la trasmisión 2. LECTURA ARBITRARIA Las opresiones de lectura arbitraria permiten al master acceder a cualquier posición de memoria de manera arbitraria. Para hacer funcionar este tipo de operaciones de lectura, primero la dirección de palabra debe estar puesta. Esto se hace mandando la dirección de palabra a la 24LC512 como parte de la operación de escritura (el bit R/W pone a 0 ). Después de mandar las direcciones de palabra, el master generará una condición de Comienzo seguido del reconocimiento. Esto termina la operación de escritura, pero no antes de poner el indicador de dirección interno. Entonces, el master publica otra vez el byte de control pero con el bit R/W puesto a 1. La 24LC512 publicará entonces un reconocimiento y trasmitirá la palabra de datos de 8-bits. El master no reconocerá la transferencia pero generará una condición de Parada lo cual causará que la 24LC512 un corte en la transmisión (Figura 8-2). Después del comando de lectura arbitraria, el contador de direcciones internas indicará la localización de dirección siguiendo lo ya leído. 3. LECTURA SECUENCIAL Las lecturas secuenciales son iniciadas de la misma forma que la lectura arbitraria excepto que después la 24LC512 transmite el primer byte de datos, el master emitirá un reconocimiento como oposición a la condición de Parada usada en la lectura arbitraria. Este reconocimiento dirige la 24LC512a transmitir la siguiente palabra secuencialmente dirigida de 8 bit (Figura 8-3). Siguiendo el último byte transmitido al master, el master NO generará un reconocimiento, pero si una condición de Parada. Proveer lecturas secuenciales, la 24XX512 contiene un indicador de direcciones interno el cual se incrementa en 1 al completarse cada operación. El indicador de direcciones permite el contenido de memoria entero para ser leido en serie durante una operación. El indicador de direcciones interno irá desde la dirección FFFF a la dirección 0000 si el master reconoce el byte recibido de la dirección de serie FFFF. IX.) BUS I2C: PRESENTACION DEL PROTOCOLO 1. INTRODUCCIÓN El año 1980 Phillips inventa el Bus de 2 hilos I2C para la comunicación de circuitos integrados. Se han otorgado licencias a más de 50 compañías, encontrándonos con mas 1000 dispositivos electrónicos compatibles con I2C. Originalmente fue especificado para 100 kbits/s e intencionalmente para el control simple de señales, esto, sumado a su bajo costo, versatilidad técnica y simplicidad aseguraron su popularidad. 2. EVOLUCIÓN DEL BUS I2C Actualmente el Bus ha sido modificado para alcanzar velocidades de hasta 3.4 Megabits/s. Combinado con una función de desplazamiento del nivel de voltaje, en modo High-speed (Hs mode) ofrece una solución ideal para los sistemas de tecnología mezclada, donde las altas velocidades y la variedad de voltajes (5 V, 3 V o menor) son comúnmente usados. El modo Hs es compatible con todos los sistemas existentes del bus I2C, incluyendo el estándar original (S-mode) y el modo Fast (F-mode), actualización introducida en 1992, proveyendo 400 kbits/s en transferencia. Sistemas de distinta velocidad pueden ser mezclados fácilmente, con un dispositivo maestro en modo Hs especialmente desarrollado, la conexión en paralelo es usada para conectar las partes más lentas del sistema, todos los dispositivos en modo Hs se comunicarán bidireccionalmente a más velocidad mientras se utilicen los modos F/S (Fast/Standard) de velocidades con las partes más lentas del sistema. 2.1 PRINCIPALES EQUIPOS CON EL BUS INCORPORADO Algunos equipos que ocupan I2C: -Los procesadores de señal en televisores (LA7610, TA1223, DTC810,...) -Memorias 24LCxx -Codificadores de video de reproductores de DVD (SAA 7128, TC 90A32F,...) -Preamplificadores de video en monitores (KB2502 ) -Etc... 2.2 CARACTERÍSTICAS MÁS SALIENTES DEL BUS I2C -Se necesitan solame nte dos líneas, la de datos (SDA) y la de reloj (SCL). -Cada dispositivo conectado al bus tiene un código de dirección seleccionable mediante software. Habiendo permanentemente una relación Master/ Slave entre el micro y los dispositivos conectados -El bus permite la conexión de varios Masters, ya que incluye un detector de colisiones. -El protocolo de transferencia de datos y direcciones posibilita diseñar sistemas completamente definidos por software. -Los datos y direcciones se transmiten con palabras de 8 bits. 2.3 CRITERIOS PARA UTILIZAR I2C -Un sistema consiste en al menos un microcontrolador y varios sistemas periféricos como memorias o circuitos diversos -El costo de conexión entre los varios dispositivos dentro del sistema debe de ser el mínimo. -El sistema que utiliza este Bus no requiere una alta tasa de transferencia de datos. -La total eficacia del sistema depende de la correcta selección de la naturaleza de los dispositivos y de la interconexión de la estructura del bus. X.) PROTOCOLO I2C 1. TERMINOLOGÍA BÁSICA DEL BUS I2C Diseñado por Philips, este sistema de intercambio de información a través de tan solo dos hilos permite a circuitos integrados y módulos OEM interactuar entre sí a velocidades relativamente lentas. Emplea comunicación serie, utilizando un conductor para manejar el timming (pulsos de reloj) y otro para intercambiar datos. Este bus se basa en tres señales: SDA (System Data) por la cual viajan los datos entre los dispositivos. SCL (System Clock) por la cual transitan los pulsos de reloj que sincronizan el sistema. GND (Masa) Interconectada entre todos los dispositivos "enganchados" al bus. Las líneas SDA y SCL son del tipo drenado abierto, similares a las de colector abierto pero asociadas a un transistor de efecto de campo (ó FET). Se deben poner en estado alto (conectar a la alimentación por medio de resistores Pull-Up) para construir una estructura de bus tal que se permita conectar en paralelo múltiples entradas y salidas. En el diagrama se observa la configuración eléctrica básica del bus. Las dos líneas de comunicación disponen de niveles lógicos altos cuando están inactivas. Inicialmente el número de dispositivos que se puede conectar al bus es ilimitado, pero obsérvese que las líneas tienen una especificación máxima de 400pF en lo que respecta a capacidad de carga. La máxima velocidad de transmisión de datos que se puede obtener es de aproximadamente 100Kbits por segundo. 2 Las definiciones o términos utilizados en relación con las funciones del bus I C son las siguientes: TÉRMINOS DESCRIPCIÓN Transmisor Receptor El dispositivo que envía datos al Bus. El dispositivo que recibe datos desde el Bus. El dispositivo que inicia una transferencia, genera las señales del reloj y termina un envío de datos. El dispositivo direccionado por un master. Cualquier dispositivo conectado al bus incapaz de generar pulsos de reloj. Reciben señales de comando y de reloj proveniente del dispositivo maestro. Cuando se conectan varios dispositivos maestros a un mismo bus Más de un maestro puede controlarlo al mismo tiempo sin corrupción de los mensajes. Estado en el cual ambas líneas (SDA y SCL) están inactivas, presentando un estado lógico alto. Únicamente en este momento es cuando un dispositivo maestro puede comenzar a hacer uso del bus. Sucede cuando un dispositivo maestro hace ocupación del bus, generando esta condición. La línea de datos (SDA) toma un estado bajo mientras que la línea de reloj (SCL) permanece alta. Un dispositivo maestro puede generar esta condición dejando libre el bus. La línea de datos toma un estado lógico alto mientras que la de reloj permanece también en ese estado. Sucede cuando un dato presente en la línea SDA es estable mientras la línea SCL está a nivel lógico alto. La transmisión de datos a través de este bus consta de 8 bits de datos (ó 1 byte). A cada byte le sigue un noveno pulso de reloj durante el cual el dispositivo receptor del byte debe generar un pulso de reconocimiento, conocido como ACK (del inglés Acknowledge). Esto se logra situando la línea de datos a un nivel lógico bajo mientras transcurre el noveno pulso de reloj. Cada dispositivo diseñado para funcionar en este bus dispone de su propia y única dirección de acceso, que viene pre -establecida por el fabricante. Hay dispositivos que permiten establecer externamente parte de la dirección de acceso. Esto permite que una serie del mismo tipo de dispositivos se puedan conectar en un mismo bus sin problemas de identificación. La dirección 00 es la denominada "de acceso general", por la cual responden todos los dispositivos conectados al bus. Master (Maestro) Slave (Esclavo) Multi-Master Bus Desocupado (Bus Free): Comienzo (Start): Parada (Stop): Dato Válido (Valid Data): Formato de Datos (Data Format): Dirección (Address): Lectura/Escritura (Bit R/W): Arbitraje Sincronización Cada dispositivo dispone de una dirección de 7 bits. El octavo bit (el menos significativo ó LSB) enviado durante la operación de direccionamiento corresponde al bit que indica el tipo de operación a realizar. Si este bit es alto el dispositivo maestro lee información proveniente de un dispositivo esclavo. En cambio, si este bit fuese bajo el dispositivo maestro escribe información en un dispositivo esclavo. Procedimiento que asegura que si uno o más master deciden controlar el Bus sólo uno es permitido a controlarlo y el mensaje no es deteriorado. Procedimiento para sincronizar las señales del reloj de dos o más dispositivos. 2. GENERALIDADES DEL PROTOCOLO 2.1 CARACTERÍSTICAS GENERALES La línea de datos (SDA) y la señal de reloj (SCL) son bidireccionales y se conectan a una fuente de tensión positiva a través de un suministro común o resistencias de carga. 2.2 TRANSFERENCIA D EL BIT Los bits de datos transferidos en la línea SDA deben ser estables cuando la línea SCL esta a nivel "1". El estado de la línea SDA en "1" o "0" solo puede cambiar cuando en la línea SCL la señal es "0". Fig.1. Esquema de conexión de dispositivos a las líneas SDA y SCL. El Bus I2C soporta diversas tecnologías y por lo tanto los niveles lógicos "0" (Bajo) y "1" (Alto) no están fijados y dependen de la tensión de alimentación del circuito. Un pulso de reloj se genera por cada bit de datos transferidos. Cuando la señal de reloj está a 1 los datos transferidos en la SDA deben ser estables. El estado de la línea SDA solo puede cambiar cuando en la línea SCL la señal es 0. 3. INSTRUCCIONES EN EL BUS I2C Para operar un esclavo sobre el Bus I2C solo son necesarios seis códigos simples, suficientes para enviar o recibir información: 1. 2. 3. 4. 5. 6. Un bit de Inicio. 7bit o 10bit 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. 3.1 CONDICIONES DE INICIO (START) Y STOP Dentro del proceso de transferencia de datos en el Bus I2C hay dos situaciones básicas que son el Inicio y el Stop de toda transferencia de datos. Se define: INICIO (START): Una transición de "1" a "0" (caída) en la línea de datos (SDA) mientras la línea del reloj (SCL) esta a "1". PARADA (STOP): Una transición de "0" a "1" (ascenso) en la línea de datos (SDA) mientras la línea de reloj (SCL) está a "1". 3.2 TRANSFIRIENDO DATOS El número de bytes que se envíen a la línea SDA no tiene restricción. Cada byte debe ir seguido por un bit de reconocimiento (ACK), el byte de datos se transfiere empezando por el bit de más peso precedido por el ACK. 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 línea SCL a "0", lo que fuerza al master a permanecer en un estado de espera. Los datos continúan transfiriéndose cuando el dispositivo esclavo esta listo para otro byte de datos y desbloquea la línea de reloj SCL. 3.3 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 maestro. El Transmisor desbloquea la línea SDA ("1") durante el pulso de reconocimiento. El receptor debe poner a "0" la línea SDA durante el pulso ACK de modo que siga siendo "0" durante el tiempo que el master genera el pulso "1" de ACK. Normalmente un receptor cuando ha sido direccionado está obligado a generar un ACK después de que cada byte ha sido recibido. Cuando un dispositivo esclavo no genera el bit ACK (porque esta haciendo otra cosa y no puede atender el Bus) debe mantener el esclavo la línea SDA a nivel "1" durante el bit ACK. El maestro entonces puede generar una condición de STOP abortando la transferencia de datos o repetir la condición de Inicio enviando una nueva transferencia de datos. Si un Esclavo -receptor que esta direccionado no desea recibir más bytes, el master debe detectar la situación y no enviar más bytes. Esto se indica porque el esclavo no genera el bit ACK en el primer byte que sigue. El esclavo pone la línea SDA a "1" lo que es detectado por el master el cual genera la condición de Stop o repite la condición de Inicio. Si un master-receptor esta recibiendo datos de un esclavo-transmisor debe generar un bit ACK tras cada byte recibido de transmisor, para finalizar la transferencia de datos no debe generar el ACK tras el último byte enviado por el esclavo. El esclavo -transmisor debe permitir desbloquear la línea SDA generando el master la condición de Stop o de Inicio. 4. ARBITRAJE Y GENERACIÓN DE SEÑALES DE RELOJ 4.1 ARBITRAJE Un maestro puede iniciar una transmisión sólo si el bus esta libre. Dos o más maestros pueden generar una condición de Inicio en el bus lo que da como resultado una condición de Inicio general. Cada master debe comprobar si el bit de datos que transmite junto a su pulso de reloj, coincide con el nivel lógico en la línea de datos SDA. El sistema de arbitraje actúa sobre la línea de datos SDA, mientras la línea SCL esta a nivel "1", de una manera tal que el master que transmite un nivel "1", pierde el arbitraje sobre otro master que envía un nivel "0" a la línea de datos SDA. Esta situación continua hasta que se detecte la condición de Stop generada por el master que se hizo cargo del Bus. En esta figura se ve el arbitraje entre dos master, aunque más pueden estar involucrados dependiendo de cuantos microcontroladores hay conectados al bus. En el momento en que hay una diferencia entre el nivel interno de la línea de datos del master DATA1 y el actual nivel de la línea de datos SDA, su salida de datos es interrumpida, lo cual significa que un nivel "1" esta dominando en el Bus. Esto no afecta los datos transferidos inicialmente por el master ganador. El arbitraje puede continuar varios bits hasta que se de la circunstancia de control del Bus por uno de los master. Tras el arbitraje los master perdedores se deben poner inmediatamente en modo master-receptor y esclavo pues los datos que envíe el master dominante pueden ser para uno de ellos. Un master que pierde el arbitraje puede generar pulsos de reloj hasta el fin de byte en el cual el pierde el arbitraje. En el momento que un master toma el control solo este master toma las decisiones y genera los códigos de dirección, no existen master centrales, ni existen ordenes prioritarias en el Bus. Especial atención debe ponerse si durante una transferencia de datos el procedimiento de arbitraje esta todavía en proceso justo en el momento en el que se envía al Bus una condición de Stop. Es posible que esta situación pueda ocurrir en este caso el master afectado debe mandar códigos de Inicio o Stop. 4.2 FORMATO Los datos transferidos tienen la forma de la figura siguiente (esquema de transferencia de bytes en el protocolo I2C): Después de la condición de Start se envía un código con la dirección de un esclavo. Ésta dirección tiene 7 bits seguidos por un octavo código que corresponde a una dirección R/W (0-indica transmisión/1-indica solicitud de datos). Una transferencia de datos siempre acaba con una condición de Stop generado por el master, sin embargo si un master todavía desea comunicarse con el bus, puede generar repetidamente condiciones de Start y direccionar a otro esclavo sin generar primero la condición de stop. XI.) COMUNICACION I2C ENTRE MICROCONTROLADOR MSP430F149 Y MEMORIA EEPROM 24LC512 1. INTRODUCCION El protocolo I2C está diseñado para comunicar un dispositivo maestro con varios esclavos, a través de dos líneas de transmisión, una línea para datos (SDA) y otra para sincronizar (SCL). La comunicación es del ti po serial. En la tarjeta de desarrollo empleada en este ramo, el microcontrolador MSP430F149 está conectado a través de los pines P4.0 y P4.1, a una memoria EEPROM 24LC512 y a un puerto donde se puede conectar en paralelo otro dispositivo I2C, la figura 1 muestra un esquema de conexiones I2C de la tarjeta. 2. COMUNICACION I2C EN MEMORIA EEPROM 2.1 D ESCRIPCIÓN DE M EMORIA EEPROM. La memoria serial EEPROM 24LC512 está diseñada para aplicaciones avanzadas de bajo consumo, tales como adquisición de datos o comunicaciones personales. Es capaz de operar entre un rango de 1,8V a 5,5V y su capacidad es de 64 KBytes. La memoria está preparada para operar a 400KHz. Fig.1. Esquema de conexiones para comunicación I2C entre microcontrolador y memoria EEPROM. Posee capacidad de escritura por Byte o por conjunto de Bytes. La lectura de la memoria puede ser tanto secuencial como aleatoria. Se puede montar hasta cuatro dispositivos en paralelo sobre la misma línea de datos. Esto permite crear un sistema de cuatro EEPROM en paralelo con una capacidad máxima de 256 KByte. 2.2 DESCRIPCIÓN DE P INES La EEPROM tiene ocho pines, los cuales se señalan en la Tabla 1. Tabla 1 Pines de la memoria serial EEPROM 24LC512 y su función Nombre Pin A0 A1 A2 GND SDA SCL WP Vcc Función Direccionamiento Direccionamiento Alimentación Tierra Datos serial Sincronización Bloqueo escritura +2,5V a +5,5V Las entradas A0 y A1 sirven para direccionar el dispositivo esclavo, en este caso la EEPROM. Como son dos bits, existe la posibilidad de cuatro combinaciones posibles y por tanto, comunicación con cuatro dispositivos diferentes. Los niveles de estos dos pines de entrada son comparados con los bits de la dirección del esclavo (en este caso dirección 00, ver figura 1) si la comparación es “verdadera”, entonces el dispositivo se selecciona. El pin A2 no está disponible y como se ve en la figura 1, está conectado directamente a +Vcc, lo cual es un requerimiento para que la EEPROM funcione. Para la transmisión de datos y direcciones se emplea el pin SDA. Éste se comporta como un sumidero, para lo cual debe tener conectada una resistencia (usualmente de 2K) a +Vcc, tal como se muestra en la figura 1. La sincronización desde y hacia el dispositivo es realizada a través del pin SCL. Existe además un pin WP, que bloquea la escritura en la memoria si está conectado a +Vcc. Tal como se aprecia en la figura 1, en la tarjeta utilizada este pin está conectado a GND y por tanto no cuenta con la posibilidad de bloquear la escritura en memoria. 2.3 CARACTERÍSTICAS DEL BUS Y FUNCIONAMIENTO La comunicación entre el microcontrolador (maestro) y la EEPROM (esclavo), se hace a través de un bus de dos líneas bidireccionales (SDA y SCL). El Bus es controlado por el dispositivo maestro, el que genera una señal de reloj (SCL), controla el acceso al Bus y genera las condiciones de “partida” y “detención”, que serán explicadas más adelante. Tanto el maestro, como el esclavo pueden ser empleados como transmisor o receptor, lo cual es determinado por el microcontrolador. El Bus de comunicaciones se caracteriza por cuatro estados de interés, definidos en la tabla 2. De la tabla 2, apreciamos que tras estar el bus desocupado (ambos en alto), se produce un canto de bajada en la línea SDA (condición de partida), luego el reloj comienza su ciclo de trabajo. Para obtener un dato válido se debe haber dado la condición de partida y además durante el ciclo en alto de SCL se debe mantener SDA estable, es decir sólo se puede enviar dato cuando SCL está en su ciclo bajo. Si se cambiara SDA mientras está el reloj en alto se generaría la condición de parada. Esta situación genera que sólo se pueda escribir un BIT por cada ciclo de reloj. Por último, la condición de parada se genera cuando el ciclo de reloj está en alto y SDA genera un canto de subida. De esta manera vuelve el Bus a estar desocupado. Tabla 2 Características del Bus: Estados de interés de acuerdo a la definición del protocolo Estado Bus Desocupado Partida de Tx Detención de Tx Dato Válido SDA alto canto de bajada canto de subida datos SCL alto alto alto bajo 2.4 PULSO DE ACUSO DE RECIBOS (ACK) Una vez direccionado un dispositivo, este debe responder con un pulso acuso de recibo (ACK) tras la recepción de cada Byte, lo cual requiere que el maestro genere un ciclo de reloj extra. Tras enviar los ocho primeros bits (un Byte), el transmisor debe desocupar la línea de datos para permitir que el receptor mantenga estable en bajo la línea de datos, mientras se produce el ciclo alto del reloj. Nota: La EEPROM no genera el pulso si existe un ciclo interno programado activo. 2.5 DIRECCIONAMIENTO DE DISPOSITIVO Tras la condición de partida, el maestro envía un Byte de control (ver figura 2), el cual contiene en los 4 primeros bits un ‘1010’, código que indica operación de lectura y escritura habilitadas. Fig.2. Esquema temporal de Bytes enviados en secuencia de direccionamiento. Luego un bit (B0), que corresponde a la dirección de memoria A15 y que permite controlar el acceso a cada “mitad” del arreglo. Los siguientes dos bits corresponden a A0 y A1, los cuales deben coincidir con los niveles de los pines para que sea diseccionado el dispositivo. En nuestro caso, de acuerdo a la figura 1, A0 y A1 deben estar en ‘00’ para que se active el dispositivo. El último bit define si se escribirá (en 0) o se leerá (en 1). Luego de este Byte el esclavo envía un pulso de acuso de recibo. Tras el envío del Byte de control y el pulso de acuso, se envían los dos Bytes que definen la dirección del arreglo donde se realizará la operación. 2.6 ESCRITURA EN MEMORIA Existen dos maneras de escribir en memoria, escribiendo por Byte o escribiendo por página de Bytes (64 Bytes). Para realizar el primer tipo de escritura, se procede como se describe en la figura 2, y a continuación del Byte de Dirección Baja (tras recibir pulso de acuso), se envía el Byte que se desea escribir en memoria. La EEPROM envía el pulso de acuso de recibo, y luego se genera la señal de parada. Tras haber sido escrito un Byte, el puntero local de direccionamiento se encontrará en la dirección siguiente a la que fue escrita. Para escribir una página de Bytes, se procede de igual manera que para escribir un sólo Byte, pero en vez de generar la condición de parada se siguen enviando Bytes. Para finalizar se genera la condición de parada y luego comienza el proceso de escritura de la EEPROM. 2.7 LECTURA DE M EMORIA Existen tres maneras de leer la memoria, la lectura de dirección actual, la lectura aleatoria y la secuencial. Para realizar una lectura de dirección actual, se envía el Byte de control con R/W en uno, luego el dispositivo responde un pulso de acuso y envía el Byte que estaba siendo apuntado en ese momento por el puntero local de direccionamiento. (Cabe recordar que si la acción anterior operó con el Byte n, entonces en la siguiente operación el puntero estará apuntando a n+1) Para una lectura aleatoria, se debe primeramente realizar el proceso de escritura descrito en la figura 2, con la dirección de memoria que se desea acceder. Luego el maestro genera una condición de partida que permite terminar el ciclo de escritura, pero no mueve el puntero local. Así se envía el Byte al cual apuntaba el puntero. Luego de esto se genera la condición de parada y el puntero queda sobre la siguiente dirección. El modo de lectura secuencial funciona exactamente igual que para la lectura aleatoria, sólo que al transmitir la memoria el primer Byte, el maestro genera un pulso de acuso de recibo, esto hace que la EEPROM transmita la próxima dirección secuencial. Cuando se desee interrumpir la lectura, se envía en vez de un pulso de acuso de recibo, una condición de parada. El puntero sólo permite leer en serie la mitad del contenido de la memoria durante una sola operación. Esto se debe a que hay que cambiar el bit B0 para acceder a la otra mitad de la memoria. 3. COMUNICACIÓN I2C EN MICROCONTROLADOR Como se explicó anteriormente, el MSP430F149 no posee un módulo de hardware dedicado a generar I2C, por lo que se necesita que este sea implementado por software. Para dicho efecto hay dos pines dedicados, el P4.0 dedicado a transmitir datos (SDA) y el P4.1 empleado como reloj (SCL). Estos dos puertos deben ser configurados y inicializados dentro del código de programación del microcontrolador. Para configurar un puerto se necesita de ciertos registros, para nuestro caso estamos ocupando el puerto cuatro, para el cual sólo se deben configurar cuatro registros. Tabla 3 Registros para Configurar Puerto P4 Registro P4IN P4OUT P4DIR P4SEL Dirección 01Ch 01Dh 01Eh 01Fh Tipo de Registro Sólo Lectura Lectura/Escritura Lectura/Escritura Lectura/Escritura El registro P4IN almacena el bit recibido por la línea SDA y el P4OUT el bit enviado. Para controlar si se trabajará como receptor o como transmisor, se cuenta con el registro P4DIR, si está en alto el microcontrolador actuará como transmisor y utilizará el registro P4OUT para enviar bits, si esta en nivel bajo, se actuará como receptor y el registro P4IN se utilizará para almacenar los bits recibidos. El registro P4SEL selecciona el modo en que se ocuparán los pines, cada pin puede tener dos funciones, en nuestro caso necesitamos activar la función I/O para SDA/SCL, por lo que P4SEL debe permanecer en 0. XII.) EJEMPLO DE IMPLEMENTACIÓN DE I2C POR SOFTWARE (TARJETA DE DESARROLLO EASYWEB II ) 1. CONEXIÓN FÍSICA ENTRE MSP430F149 Y EEPROM 24LC512 En la tarjeta de desarrollo EasyWeb II el microcontrolador MSP430F149 está conectado a través de los pines P4.0 (SDA) y P4.1 (SCL) a una memoria EEPROM 24LC512. En la figura 1 se aprecia la conexión física. Nótese que las líneas de SDA y SCL también están conectadas a un puerto externo de tal forma que puede ser conectado otro u otros dispositivos esclavos en paralelo si es necesario. Nota: Solo podrán ser conectados 3 dispositivos más, ya que, la EEPROM posee dos bits de direccionamiento y esto limita a 4 esclavos en el bus. De lo contrario podría ocurrir un conflicto entre dispositivos direccionados. En el bus I2C las líneas SDA y SCL deben estar conectadas a Vcc mediante resistencias de pullup. Como se aprecia en la figura 1 solo SDA tiene la resistencia de pull-up, lo cual implica, como se verá mas adelante, que la forma en que se manejan ambas líneas es distinta una de la otra. Fig.1. Esquema de conexiones para comunicación I2C entre microcontrolador y memoria EEPROM. 2. ACCESO A LOS PUERTOS DE I/O Cada puerto del MSP posee 4 registros de 8 bits que permiten controlar la forma de trabajo de cada uno de los pines del puerto. Cada bit esta asociado a un pin del puerto. Estos registros son: Tabla 1 Registros de control de los puertos del MSP430F149 Registro PnSEL Bit x 0 1 PnDIR 0 1 PnOUT 0 1 PnIN 0 1 Función Indica modo del puerto como I/O la otra funcionalidad Indica la dirección como entrada como salida Indica el valor de salida salida baja salida alta Indica el valor de entrada entrada baja entrada alta Nota: la “n” representa el número del puerto que se desea controlar. La “x”representa cualquiera de los 8 bits (en el registro), o pines (en el puerto). 3. FUNCIONES DE CONTROL DE LÍNEAS SDA Y SCL Las siguientes son funciones que controlan el estado de las líneas SDA y SCL, es decir si se encuentran en alto “1” o bajo “0”. Tabla 2 Funciones de control de las líneas SDA y SCL Nombre Función SetLowSDA SetHighSDA SetLowSCL SetHighSCL Acción Lleva a 0 la línea SDA Lleva a 1 la línea SDA Lleva a 0 la línea SCL Lleva a 1 la línea SCL Se definirán como operaciones al bit en los registros de control de los puertos. Para esto será necesario definir antes: #define SDA 0x01 // 0000 0001 #define SCL 0x02 // 0000 0010 3.1 S ETLOW SDA Y S ETHIGHSDA // SDA o P4.0 como salida #define SetLowSDA P4DIR |= SDA; // SDA o P4.0 como entrada #define SetHighSDA P4DIR &= ~SDA; Con lo anterior se declara al pin P4.0 con dirección de salida o entrada respectivamente. En este caso solo se modifica el registro P4DIR ya que esta línea posee una resistencia de pull-up y estas definiciones provocarán el cambio de estado. Para la línea SCL la definición se hará de otra forma. 3.2 S ETLOW SCL Y S ETHIGHSCL // SCL o P4.1 arroja un 0 a la salida #define SetLowSCL P4OUT &= ~SCL; // SCL o P4.1 arroja un 1 a la salida #define SetHighSCL P4OUT |= SCL; En este caso, para cambiar el estado de SCL (P4.1) se modifica el registro P4OUT ya que esta línea no esta conectada a una resistencia de pull-up y por lo tanto debe especificarse lo que se desea que salga por el pin P4.1. 4. FUNCIONES DE TRANSFERENCIAS DE DATOS Las siguientes funciones permiten la transferencia de datos entre el MSP y la EEPROM: Nombre Función i2cInit i2cStart i2cStop i2cRead i2cWrite Acción Inicializa el bus. (SDA y SCL en 1) Establece condición de partida. Establece condición de término. El MSP lee bytes enviados por la EEPROM El MSP escribe bytes en la EEPROM. Antes es necesario definir dos constantes: #define NO_I2C_ACK 0 #define OK_I2C_ACK 1 4.1 F UNCIÓN I 2 CI NIT() void i2cInit(){ int j; P4SEL &= ~SDA; P4SEL &= ~SCL; // I/O para SDA Y SCL P4OUT &= ~SCL; // Salida a cero P4OUT &= ~SDA; // SDA Open Colector P4DIR |= SCL; // SCL COMO SALIDA P4DIR &= ~SDA; // SDA COMO ENTRADA SetHighSCL(); SetLowSDA(); SetHighSDA(); // Ambas líneas quedan en alto } La función anterior se encarga de inicializar el bus I2C de tal forma de asegurar que ambas líneas queden en alto para que después con una condición de partida empiece la transferencia de datos. En la figura 4 se puede apreciar está condición (A). 4.2 FUNCIÓN I 2CSTART() void i2cStart(){ SetHighSCL(); SetHighSDA(); SetHighSCL(); SetLowSDA(); SetLowSCL(); SetHighSDA(); // Visto en el analizador lógico como: // SCL ------------------_________________ // SDA -----____________________--------// 0 2.7 5.5 [µs] } Con esta función se genera la condición de partida necesaria para que los dispositivos esclavos del bus (en este caso la memoria) se preparen para ser direccionados y por ende establecer una posible “conexión” con el maestro (MSP). La condición de partida (B) se representa en la figura 4. Nótese que el código de la función asegura primero tener ambas líneas en alto para luego poder bajarlas en el instante correcto. 4.3 FUNCIÓN I2CSTOP() void i2cStop(){ int j; SetLowSCL(); SetLowSDA(); SetHighSCL(); SetLowSDA(); SetHighSCL(); SetHighSDA(); } Esta función genera la condición de término que “corta” la conexión establecida entre el maestro y el esclavo diseccionado. En la figura 4 se aprecia dicha condición (C). Al igual que la función en 3.2, el código de esta se asegura primero que ambas líneas estén en bajo para luego subirlas en los instantes correctos de tiempo. 4.4 FUNCIÓN I 2CWRITE() int i2cWrite(char a){ int i,j; int retorno; for (i=0; i<8; i++){ SetLowSCL(); if (a & 0x80) // 1º el MSB SetHighSDA(); else SetLowSDA(); SetHighSCL(); a <<= 1; } SetLowSCL(); /* ack Read */ SetHighSDA(); SetHighSCL(); if (P4IN & SDA) retorno = NO_I2C_ACK; // esclavo no ha // bajado la línea else retorno = OK_I2C_ACK; SetLowSCL(); return(retorno); } A esta función se le debe pasar como argumento un char el cual corresponde al byte que se transmitirá. A su ves, está retornará un entero de valor 1 que significa que el pulso de reconocimiento ACK fue enviado correctamente. El proceso de escritura de todo el byte lo hace con el ciclo for. Nótese que las sentencias dentro del ciclo for aseguran la condición de “Dato válido”, la cual, establece que un dato (SDA) será válido mientras este estable en el período alto de la señal de reloj (SCL). En la figura 4 (D) representa la condición de “Dato válido”. Estados del Bus I2C Fig. 2. Diferentes estados del bus I2C 4.5 FUNCIÓN I 2CREAD() 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){ //envía ACK al transmisor SetLowSDA(); } SetHighSCL(); SetLowSCL(); return(caracter); } La función i2cRead() permite al MSP leer bytes de datos desde la memoria EEPROM. Con está función se pueden implementar los tres tipos de lectura: De dirección actual, aleatoria y secuencial. Se le debe pasar como argumento un int cuya función principal es la de enviar un pulso ACK de reconocimiento a la memoria (transmisor ahora). Recuérdese que cuando se leen datos de la memoria, al finalizar la lectura, el maestro (MSP) no genera pulso de ACK (Ver figura 3) sino que solo la condición de parada. Por este motivo es que se le pasa este int de argumento, de tal forma que cuando se quiere dejar de leer el valor de este int es 0 y no se envía el ACK. Envíos de ACK por parte del MSP en un proceso de lectura Fig. 3. Envíos de ACK en un proceso de lectura Nótese que dentro del ciclo for se asegura la lectura válida de datos haciendo el reconocimiento del bit durante el período alto de SCL. XIII.) PROGRAMACION DE I2C 1. DIAGRAMA DE FLUJO DE LA PROGRAMACIÓN DE I2C El microcontrolador utilizado debe ser programado para la implementación del protocolo I2C. A continuación presentamos un diagrama de flujo, el cual nos ayudará a describir la programación de este protocolo. Fig.1. Diagrama de flujo de la programación de I2C. Lo primero que tenemos que definir en nuestro programa es una sección de Inicializaciones. En esta sección debemos configurar los puertos de nuestro microcontrolador, de manera de poder generar en la líneas de comunicación un valor estable (ambas en niveles altos). Una vez que se tiene esta configuración, se genera una condición de Start, la cual tal como se observa en el diagrama, equivale a un cambio (canto de bajada) en la línea de SDA, mientras se mantiene en alto SCL. Luego se deben enviar 8 bits (byte de control), en los cuales se encuentran valores característicos de nuestra memoria y el bit de R/W el cual tomará valor cero o uno dependiendo de si se quiere escribir o leer. En el caso en que el bit de R/W es cero, procedemos a hacer un llamado a la función de escritura, la cual debe enviar datos de 8 bits y verificar si se recibe un acuse de recibo (ACK), en el caso que ACK es igual a cero significa que continúe el proceso de escritura, de lo contrario pueden haber finalizado nuestros datos, y debemos generar una condición de Stop. Para producir esta “parada” en la comunicación es que debemos crear una función que genere esta condición (función Stop). Ahora, en el caso que el bit R/W es 1, debemos generar la rutina para lectura. Es importante recordar que existen tres tipos de lectura: Aleatoria, secuencial y lectura de la dirección actual. Es importante recordar que la memoria Eeprom posee una especie de puntero, el cual se queda en el último valor ya sea escrito o leído. Si optamos por la lectura de la dirección actual, solo es necesario llamar a la función de lectura, y estar verificando constantemente si hay generación de ACK, ya que tal como ocurre en el proceso de escritura, este bit nos indicará si debemos continuar o terminar el proceso generando la condición de parada (Stop ). Ahora bien, si queremos realizar una lectura secuencial o una aleatorio, debemos antes de comenzar a leer, mover el puntero interno de nuestra memoria. Para realizar esto debemos generar un proceso de escritura, donde se enviará la dirección a la cual queremos acceder, de manera de mover el apuntador hacia esa dirección. Una vez realizado este envío, al primer ACK igual a cero salimos de la rutina de escritura, sin generar una condición de Stop sino que entrando inmediatamente a la rutina de lectura. De esta forma realizamos el proceso de lectura desde la dirección en la cual hemos dejado el puntero interno. 2. EJEMPLOS DE PROGR AMACIÓN. 2.1 EJEMPLO DE LECTURA SECUENCIAL CÓDIGO #include "i2c.h" #define EEPROM 0xA0 COMENTARIOS main() { int i, accesEEPROM; // Arreglo del largo que se necesite char textoRead[64]; i2cStart(); // Retorno de la función i2cwrite () accesEEPROM = i2cWrite(EEPROM); while(!accesEEPROM) // Mientras el slave no haya bajado la línea. // Se espera ACK // Dirección a la cual queremos acceder accesEEPROM = i2cWrite(EEPROM); i2cWrite(0x00); . i2cWrite(0x00); i2cStart(); // EEPROM 0xA1 (lectura) accesEEPROM = i2cWrite(EEPROM | 1 ); for (i = 0; i < strlen(texto) - 1; i++) textoRead[i]= i2cRead(1); textoRead[i]=i2cRead(0); //Largo del texto que se escribió. i2cStop(); } 2.1 EJEMPLO DE ESCRITURA CÓDIGO #define EEPROM 0xA0 main() { int i; char writeText[] = "I2C la lleva"; i2cInit (); i2cStart (); i2cWrite(EEPROM); i2cWrite(0x00); i2cWrite(0x00); for(i = 0; i < strlen(writeText); i++) i2cWrite(writeText[i]); i2cStop(); } COMENTARIOS // Inicializamos los puertos // Se envía el byte de control de la EEPROM // Bits más significativos para direccionamiento // Bits menos significativos del direccionamiento // Se escriben los datos en la EEPROM XIV.) BIBLIOGRAFIA - www.semiconductors.philips.com/buses/i2c/ - www.elo.utfsm.cl/~lsb/elo325/datos/msp430x1xx.pdf - www.elo.utfsm.cl/~lsb/elo325/clases/Memoria%20Jaime %20Z.pdf - www.elo.utfsm.cl/~lsb/elo325/aplicaciones/ApplicatioNotes/ slaa115.pdf - www.elo.utfsm.cl/~lsb/elo325/datos/24LC512.pdf