Bueno, aquí voy a colgar el codigo que me ha salido, es un poco mas escueto que el de RedPic porque he pasado de hacer tantas subrutinas y he puesto ya las variables a valores que no tuviese que tocar. Mañana lo probaré a ver que tal va.
código:
#ifndef EEPROM_SDA
#define EEPROM_SDA PIN_B1
#define EEPROM_SCL PIN_B0
#endif
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
#define EEPROM_ADDRESS long int
#define EEPROM_SIZE 32768
// device hardware address
int8 const deviceAddress1 = 0xa2; // #1
int8 const deviceAddress2 = 0xa4; // #2
int8 const deviceAddress4 = 0xa6; // #4 segons hardware les tinc intercambiades
int8 const deviceAddress3 = 0xa8; // #3
// baseAddress = 8 bits which mean ...
//
// Fixed (4 bits) -> 1010
// Dev Hard Address (3 bits) -> 000,001,010,011,100,101,110,111
// R/W (1 bit) -> 0 -> Write / 1 -> Read
////////////////////////////////////////////////////////////////////////////////
/* funcions per l'adreçament del chip de memòria corresponent */
////////////////////////////////////////////////////////////////////////////////
int8 BuscarAdrecaAdequada(int32 Address){
int8 DevAddress=0;
if(Address<0x8000)
DevAdress=deviceAddress1;
if((Address=>0x8000)&&(Address<0x16000))
DevAdress=deviceAddress2;
if((Address=>0x16000)&&(Address<0x240000))
DevAdress=deviceAddress3;
if((Address=>0x24000)&&(Address<0x320000))
DevAdress=deviceAddress4;
return DevAddress;
}
////////////////////////////////////////////////////////////////////////////////
/* PROGRAMA PRINCIPAL */
////////////////////////////////////////////////////////////////////////////////
void init_ext_eeprom()
{
output_float(EEPROM_SCL);
output_float(EEPROM_SDA);
}
void write_ext_eeprom(long int address, BYTE data)
{
short int status;
int8 BaseAddress;
BaseAdress = BuscarAdrecaAdequada(int32 Address);
i2c_start();
i2c_write(BaseAdress);
i2c_write(address>>
;
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
}
BYTE read_ext_eeprom(long int address) {
BYTE data;
BaseAdress = BuscarAdrecaAdequada(int32 Address);
i2c_start();
i2c_write(BaseAddress);
i2c_write(address>>
;
i2c_write(address);
i2c_start();
i2c_write(BaseAddress|1);
data=i2c_read(0);
i2c_stop();
return(data);
}