Memoria 24LC512 con Interfaz I2C

Anuncio
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
Descargar