Hace poco compré un ZS-042 RTC module que se comunica mediante el protocolo I2C. El módulo incluye un DS3231 (RTC) y un AT24C32 (4k EEPROM) .
El módulo ZS-042 no tiene hoja de datos, pero el listado de Ebay (vinculado arriba) muestra cómo se ensamblan el DS3231 y el AT24C32 en el módulo (ZS-042 NO es un IC).
Cuando lo compré, no tenía idea de qué direcciones de I2C se encontraban en el dispositivo, por lo que ejecuté un escaneo rápido y las direcciones 0x57, 0x5F y 0x68 reconocidas.
Estoy un poco confundido porque el módulo solo incluye dos dispositivos I2C, pero recibo el ACK de tres. Investigué y las direcciones I2C 0x57 y 0x68 corresponden a DS3131 y AT24C32 respectivamente, pero no pude encontrar un solo dispositivo con la dirección 0x5F.
Intenté ejecutar la exploración con el módulo desconectado y las tres direcciones desaparecieron. Cuando se reconectaron, las tres direcciones reaparecieron. Para empeorar las cosas, cuando envío un byte al dispositivo fantasma, ¡el dispositivo ACKs!
Puedo ver físicamente solo dos circuitos integrados soldados al ZS-042.
¿Alguna idea de qué dispositivo responde a la dirección I2C 0x5F?
P.S. Estoy usando un Arduino UNO con una biblioteca personalizada para ejecutar las líneas I2C a 3.3V (no el estándar de 5V) desde cualquier par de pines digitales. Yo mismo escribí la biblioteca utilizando las pautas del protocolo I2C y la he probado exhaustivamente en EEPROM. Este es un enlace a los archivos de la biblioteca:
Estoy usando este simple boceto para buscar dispositivos:
#include <I2CDigital.h>
#define WRITE 0b00000000
#define READ 0b00000001
I2CDigital I2C(12,11);
void setup(){
Serial.begin(9600);
}
void loop() {
for(int i=16;i<120;i++){
if(I2C.startCom((byte)i,WRITE)){
Serial.print("Device detected at address: ");
Serial.println(i);
if(I2C.sendByte(0b00000000)){
Serial.println("Byte sent successfully");
}
I2C.stopCom();
delayMicroseconds(5);
}
}
delay(5000);
}
Gracias de antemano!
EDIT sugerido por @ChrisStratton:
Para poder usar cualquier par de pines digitales para la comunicación I2C, los pines solo se pueden ejecutar en pinMode(pin,INPUT)
(para lógica alta) o pinMode(pin,OUTPUT)
y digitalWrite(pin,LOW)
(para lógica baja). Luego, las líneas se pueden conectar a cualquier tensión de activación deseada (siempre que el dispositivo aún lo reconozca como lógica alta).
En mi caso particular, están conectados al regulador de 3.3V en el Arduino a través de resistencias de 4.7k.
EDIT sugerido por @ElliotAlderson:
EDIT sugerido por @Janka
DS3131
AT24C32