Pues resulta que tengo una memoria eeprom como esta
en el arduino he cargado el siguiente código y no va, me devuelve FF. Creo que no está en write protected y que escribe bien, no se si igual esta el circuito mal o el codigo tiene error, pero en principio no se me ocurre que puede ser... igual es por muerte de sueño o algo, el circuito esta tal que asi
circuito corregido (explicacion de pullup abajo)
y el código es este:
IMPORTANTE EL DELAY
#include <Wire.h> // EEPROM 24LC256, bibliotecas i2c
#define eeprom 0x50 // direccion de la eeprom shift
void setup(void){
Wire.begin(); // Iniciar i2c
Serial.begin(9600); // serial
unsigned int address = 0;
Serial.println("escribimos 33 en los 10 primeros bytes!");
for(address = 0; address<10; address++) writeEEPROM(eeprom, address, '3'); // escribimos los 10 primeros bytes con 33
Serial.println("Vamos leer si esta todo ok, debes ver 33, 33, 33, 33... 10 veces 33");
for(address = 0; address<10; address++) {
Serial.print(readEEPROM(eeprom, address), HEX); //aqui me falla y da FF
Serial.print(", ");
}
}
void loop(){
}
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) {
delay(5);
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.send(data);
Wire.endTransmission();
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
delay(5);
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.receive();
return rdata;
}
editado:
La resistencia correcta para el pullup en un bus I2C depende de la capacitancia del bus y de la frecuencia de operación del mismo.
la formula extraida del datasheet del ATmega168 (no se si deriva de las especificaciones de I2C) es
Freq < 100KHz Rmin = (Vcc - 0.4V) / 3mA Rmax = 1000nS / Cbus
Freq > 100KHz Rmin = (Vcc - 0.4V) / 3mA Rmax = 300nS / Cbus
La EEPROM "Microchip 24LC256" specifica una capacitancia máxima por pin de 10pF .
Si utilizas alimentación por baterias es preferible utilizar resistencias que se aproximen a lo mas alto del rango. Si no existen limitaciones de consumo es preferible usar las más bajas.
parece ser que una configuración típica es 10 k? para 100 kHz, 2 k? para 400 kHz y 1 MHz.