Hola gente, pues lo que dice el título, que no hay manera de escribir en el bloque 1 de una eeprom 24AA1025.
El bloque 0 funciona bien, pero cuando intento acceder al bloque 1 se quede quieto despues de escribir la direccion por el I2C (supongo que no hace ni el acknowledge).
A continuacion les pongo las rutinas que estoy usando para escribir y leer de la eeprom, no les pongo las rutinas del I2C ya que he usado bastantes perifericos con ellas y dudo que sea ese el problema.
Como veran las rutinas de lectura y escritura estan pensadas para solucionar el problema de una lectura/escritura secuencial que passe de un banco a otro (es decir, que empiece en 0x0XXXX y termine en 0x1XXXX). Solo comentar que el acceso al bloque 1 no funciona ni al hacer una lectura/escritura que empiece en el bloque 0 i pase al bloque 1 ni si se empieza directamente en el bloque 1 (la unica que funciona es la que empieza y termina en el bloque 0), por lo tanto, dudo que el problema este en la forma en que gestiono el passo del banco 0 al 1.
Muchas gracias de antemano.
#include"TAD_EEP24AA.h"
void EEP24AA_read(long int addr, char* info, int bytes) { //This is the fuction in charge of writting data to the 24AA I2C eeprom.
//It will write "bytes" bytes of data starting at the eeproms address "addr",
char count; //the data written will be read starting at the "info" address.
int i; //The user should be carefull as "addr + bytes - 1" should not be higher than 0x1FFFF.
//Also, the same read instruction can not cross the page boundaries. Sequential
LEDS |= YELLOW_LED;
I2C_start();
if (addr&0x00010000) { I2C_write_byte(EEP24AA_WRITE | EEP24AA_BLK1); }
else { I2C_write_byte(EEP24AA_WRITE | EEP24AA_BLK0); }
I2C_write_byte((addr&0x0000FF00) >> 8);
I2C_write_byte(addr&0x000000FF);
I2C_start();
if (addr&0x00010000) { I2C_write_byte(EEP24AA_READ | EEP24AA_BLK1); }
else { I2C_write_byte(EEP24AA_READ | EEP24AA_BLK0); }
i = 0;
while (i < bytes) {
info[i] = I2C_read_byte();
i++;
if (i < bytes) {
if ((i+(addr&0x0000FFFF)) == 0x00010000) {
I2C_nack();
I2C_stop();
I2C_start();
I2C_write_byte(EEP24AA_WRITE | EEP24AA_BLK1);
I2C_write_byte(0x00); I2C_write_byte(0x00);
I2C_start();
I2C_write_byte(EEP24AA_READ | EEP24AA_BLK1);
}
else { I2C_ack(); }
}
else { I2C_nack(); }
}
I2C_stop();
LEDS &= nYELLOW_LED;
}
void EEP24AA_write(long int addr, char* info, int bytes) { //This is the fuction in charge of writting data to the 24AA I2C eeprom.
//It will write "bytes" bytes of data starting at the eeproms address "addr",
char count; //the data written will be read starting at the "info" address.
int i; //The user should be carefull as "addr + bytes - 1" should not be higher than 0x1FFFF
LEDS |= YELLOW_LED;
I2C_start();
if (addr&0x00010000) { I2C_write_byte(EEP24AA_WRITE | EEP24AA_BLK1); }
else { I2C_write_byte(EEP24AA_WRITE | EEP24AA_BLK0); }
I2C_write_byte((addr&0x0000FF00) >> 8);
I2C_write_byte(addr&0x000000FF);
i = 0;
while (i < bytes) {
if ((i+(addr&0x0000FFFF)) == 0x00010000) {
I2C_stop();
I2C_start();
I2C_write_byte(EEP24AA_WRITE | EEP24AA_BLK1);
I2C_write_byte(0x00); I2C_write_byte(0x00);
}
I2C_write_byte(info[i]);
i++;
}
I2C_stop();
LEDS &= nYELLOW_LED;
}