ATMEL 24C02 EEPROM - Problemas para entender cómo funciona el direccionamiento

Actualmente estoy escribiendo una biblioteca para las EEPROM de la serie 24C de ATMEL (no es una pregunta de programación) . La biblioteca funciona bien con una sola EEPROM en este momento y estoy tratando de admitir varias EEPROM ahora, ya que, según la hoja de datos, se pueden conectar hasta 8 EEPROM 24C02 al mismo tiempo. Sin embargo, no puedo entender cómo asignar una dirección a la EEPROM. Por lo que entiendo, puedo asignar una dirección entre 0x50 y 0x57 configurando los pines A0, A1 y A2 en ALTO o BAJO. Sin embargo, no importa a qué configuro estos pines. La EEPROM utiliza las 8 direcciones:

I2C scanner. Scanning ...
Found address: 80 (0x50)
Found address: 81 (0x51)
Found address: 82 (0x52)
Found address: 83 (0x53)
Found address: 84 (0x54)
Found address: 85 (0x55)
Found address: 86 (0x56)
Found address: 87 (0x57)
Done.
Found 8 device(s).

Esta salida es del escáner I2C. Puedo transmitir con todas las direcciones y la única EEPROM lo recibe todo. ¿Hay algo más que deba hacer?

Aquí está la hoja de datos de la EEPROM: https://www.rhydolabz.com/documents/24c04.pdf

Hay una variante de chip 24CXX que usa las ocho direcciones por sí mismo y, por lo tanto, parece 8 chips pequeños en el bus I²C. Compruebe las marcas de sus fichas.
No escribes las direcciones; los conectas .
@TurboJ El chip dice lo siguiente: "ATMEL 611, 24C02, PU27"
@PeterSmith Lo siento, soy completamente nuevo en I2C. ¿Puedes explicar qué es el cableado?
@pixelomer Conectarlos directamente a GND o VCC se llama cableado y no cambiarlos usando software

Respuestas (2)

¿Está confundido por el error común que muchas personas cometen al tratar incorrectamente la dirección de un I 2 C? Algunas partes se referirán a la dirección como una cantidad de 7 bits que no incluye el bit R/W. Otros se referirán a la dirección como una cantidad de 8 bits que incluye el bit R/W. Incluso la hoja de datos que vinculó puede generar confusión a este respecto. En la figura 4 se refieren a la dirección como una cantidad de 8 bits:

ingrese la descripción de la imagen aquí

Y en la figura 5 inmediatamente siguiente se refieren a la dirección como la cantidad de 7 bits de MSB a LSB:

ingrese la descripción de la imagen aquí

También tenga en cuenta que los pines A0 a A2 en el paquete del dispositivo deben permanecer estáticos en un diseño. Si se utiliza un total de ocho 24C02 en el diseño, cada uno de los dispositivos tendrá estos tres pines fuertemente sujetos en una combinación diferente del conjunto de 000b, 001b, 010b, 011b, 100b, 101b, 110b y 111b. Cuando dice que está "escribiendo" en los pines, esto no aclara exactamente lo que está haciendo. Normalmente no hay escritura en los pines 24C02. En cambio, los tres bits que proporciona en la interfaz en el campo de dirección del dispositivo deben coincidir con los valores fijos en los pines para que se seleccione el dispositivo.

Si por casualidad hubiera decidido agregar algunos otros MCU GPIO vinculados a los pines A0, A1 y A2 en un solo dispositivo, ese no sería un escenario de uso válido. Además de eso, nunca he estado seguro de que sea posible cambiar dinámicamente el valor ajustado en los pines A0, A1 y A2 de un 24C02 después de que se haya encendido.

Al escribir en pines, me refiero a establecer pines en ALTO o BAJO. En Arduino, la función que hace esto es digitalWrite. Por eso dije "escribir".
Pero como dije, normalmente nunca intentaría configurar un 24C02 para tener sus pines A0, A1 y A2 conectados a los GPIO. En su lugar, simplemente conéctelos a GND o a VCC. Si solo tiene un 24C02, entonces conectaría los tres pines a GND como 000b. Luego, cuando desee escribir en la parte, use un byte de dirección de 0xA0 y cuando desee leer, use un byte de dirección de 0xA1. (continuado)
(continuación de arriba) Si luego tuviera un segundo 24C02, conectaría su A0 a VCC y su A1 y A2 a GND para el valor 001b. Entonces, el byte de dirección que usa para escribir en el segundo chip sería 0xA2 y el byte de dirección para leer el segundo chip sería 0xA3. (continuado)
(continuación de arriba) Si luego tuviera un tercer 24C02, conectaría su A0 y A2 a GND y su A1 y A1 a VCC por el valor 010b. Entonces, el byte de dirección que usa para escribir en el tercer chip sería 0xA4 y el byte de dirección para leer el segundo chip sería 0xA5. Etcétera etcétera.
Lo intenté. No se pueden cambiar los valores dinámicamente. Responderá a la dirección que se configuró antes de encender.

Los pines A0:A2 se utilizan para crear la dirección.Esquema de direccionamiento

Entonces, por ejemplo, mantiene A0: bajo, A1: alto y A2: bajo, su dirección será 1010010 + R/W.

El dispositivo no responderá a la dirección que se establece dinámicamente. Considera el valor de A0, A1 y A2 antes del encendido y lo mantiene hasta que se reinicia.

¿Puedes darme mas información? Por ejemplo, ¿qué pin necesito cambiar ALTO/BAJO para que la EEPROM use solo una dirección?
si va a controlarlos usando el software, debe cambiar los tres, es decir, A0, A1 y A2. Pero mi sugerencia sería conectarlos directamente a tierra o VCC para el esquema de direccionamiento.
Después de que todos ustedes dijeron que cambiar la dirección EEPROM con GPIO no es una buena idea, decidí cablear de 5V y GND a A0, A1 y A2. Tal vez el problema sea configurar la dirección después de encender. Probaré en aproximadamente una hora.