Hola,
leí tu inquietud y es fácil de trabajar con este RTC. El emplea el bus I2C para comunicarse con un dispositivo
"maestro", que en este caso es el microcontrolador. el bus I2C usa dos líneas, una de reloj: SCL y una de datos: SDA. La comunicación siempre la inicia un dispositivo con algo de inteligencia, en este caso el micro, y funciona como un "maestro". El periférico que quieres controlar actúa como "esclavo" y responde al llamado del maestro.
Las líneas SCL es controlada por el micro pues el manda los pulsos de sincronía, y el flujo de informacion en la lína SDA es determinado por el dispositivo que solicita o envia informacion.
Este tipo de bus no hace uso de un "chip Select" puesto que el primer byte que uno transmite es la dirección del periférico a controlar. Se transmiten octetos o grupo de 8 bits acompañados de la señal de reloj, que tambien son 8 pulsos mas uno de ACK; en total serían 9 pulsos de reloj para 8 bits de data mas uno de ACK.
Se transfiere el bit mas significativo primero.
La comunicación inicia con un BIT de START, que es un cambio de nivel en las lineas SCL y SDA; su estado inicial es HI (ambas) y la primera línea que va a LO es SDA, seguida de SCL. Seguido de esto, se transmite el primer byte de forma sincronica con los pulsos de reloj, donde hay dos condiciones: de CAMBIO PERMITIDO y de DATO VALIDO, establecidas por el cambio de la lína SCL (clock).
Cuando SCL es HI (1) el valor de la línea SDA (bit) será un bit válido, es decir, que si SDA = 0, ese bit tendrá un valor de 0. Cuando SCL es LO (0), el valor de SDA puede cambiar, solo en ese momento. De esta manera, a partir del bit de START, se deben generar 8 pulsos de reloj para transmitir el primer byte, y generar un 9° pulso de reloj para que el micro revise el estado de la línea SDA, es decir, debe mirar si hay un ACK o no por parte de un dispositivo esclavo; en este noveno pulso el micro debe cambiar el estado del pin SDA de salida a entrada para chequear si alguien en el bus recibió el byte de manera correcta.
bit START
SCL 1 ------ ----- ----- -----
\ / \ / \ /
0 ----- ----- -----
SDA 1 ---- ----- -----
\ / \ /
0 ------- ---------------
BIT_VALIDO CAMBIO
El primer byte que se transmite es la dirección del dispositivo esclavo. Para el RTC, el DS1307, este byte es 0xD0 (0b1101000x). El último bit especifíca que operación se quiere hacer, Escritura o Lectura (Read = 1, /Write = 0).
El segundo byte que se transmite es la dirección interna del dispositivo, que hace referencia a algún registro o a un mapa de memoria (si fuera una SE2PROM). Dependiendo del dispositivo, se transmiten tantas "palabras" o bytes de dirección interna como lo requiera este (algunas SE2PROM usan dos bytes - hi_addr y lo_addr -). PAra el RTC, basta un solo byte, que indica el registro al que se tendrá acceso (p.9, DS1307 64 x 8, Serial, I2C Real-Time Clock, Dallas-MAxim).
Despúes de enviar la dirección interna del dispositivo, el micro debe seguir transmitiendo información o recibir la data que debe esperar del dispositivo I2C (la hora o fecha para el RTC).
Para liberar el bus, el micro debe restablecer las líneas SCL y SDA a nivel HI(1) con un bit de STOP. Dicha condición se cumple después de revisar el último bit ACK; SCL debe llegar primero a nivel HI, y se hace válido cuando SDA hace la transición de LO a HI.
La secuencia de comunicacion con cualquier dispositivo I2C sería así:
ESCRITURA
BIT_START + DEVICE_ADDRESS(ultimo bit R/W = 0)
bitACK
WORD_ADDRESS_HI + bitACK
WORD_ADDRESS_LO + bitACK (si aplica)
DATA_1 + bitACK
DATA_2 + bitACK ....
DATA_n + bitACK
BIT_STOP
LECTURA
BIT_START + DEVICE_ADDRESS(ultimo bit R/W = 0) WRITE
bitACK
WORD_ADDRESS_HI + bitACK
WORD_ADDRESS_LO + bitACK (si aplica)
BIT_START + DEVICE_ADDRESS(ultimo bit R/W = 1) READ
bitACK(de disp. esclavo)
-- aqui el micro debe leer a través de la línea SDA
DATA_1_rx + bitACK=0 (generado por micro)
DATA_2_rx + bitACK=0 (generado por micro) ...
DATA_n_rx + bitNACK=1 (generado por micro)
BIT_STOP
Las dos líneas, SDA y SCL, deben estar conectadas con resistencias de pull-up, es decir, conectadas al mismo voltaje de alimentación del micro (para el JK3 sería 5V, el mismo que usaría el RTC).
Espero haya sido de ayuda este resumen. Recomiendo que busques la nota de aplicacion AN2509 y AN1820 de freescale, y este link de Phillips (NXP) que es el autor de este tipo de conexión, buscalo por google como "I2C specification" ( no me dejan poner links, que chafa
).
Mucha suerte y cualquier inquietud a
jedi_hyoga@hotmail.comGiovanni G.