
int8 init_ext_eeprom(void)
{
   //"Suelta" a los pines de SCL y SCL para que las resistencias de "pull-up" se encargen de ponerlos a estado logico alto y esten en un estado
   //de "bus libre" o en un "stop" continuo.
   output_float(PIN_B0);  
   output_float(PIN_B1);
   
   //Rutina para verificar que el dispositivo ha sido reconocido y esta listo para operar.//
   i2c_start(ExtEEprom);
   return (i2c_write(ExtEEprom, 0xa0));  //capturo bit ACK (Acknowldge).
}

void write_ext_eeprom(long int address, BYTE data)
{
   short int status;
   
   restart_wdt();
   
   i2c_start(ExtEEprom);
   i2c_write(ExtEEprom, 0xa0);        //Direcion del dispositivo e indicando, desde el primer bit, que se hara un operacion de escritura.
   i2c_write(ExtEEprom, address>>8);  //Escribo los 8 bits menos significativos.
   i2c_write(ExtEEprom, address);     //Escribo los 8 bits mas significativos.
   i2c_write(ExtEEprom, data);        //Escribo el dato.
   i2c_stop(ExtEEprom);

   //Rutina para verificar que la escritura dentro de la memoria se ha completado correctamente y esta listo para una nueva operacion.//
   i2c_start(ExtEEprom);
   status = i2c_write(ExtEEprom, 0xa0);
   
   while(status == true)
   {
      restart_wdt();
      i2c_start(ExtEEprom);
      status = i2c_write(ExtEEprom, 0xa0);
   }
}

int8 read_ext_eeprom(long int address) 
{
   int8 data;
   
   restart_wdt();
   
   i2c_start(ExtEEprom);
   i2c_write(ExtEEprom, 0xa0);
   i2c_write(ExtEEprom, address>>8);  //Escribo los 8 bits menos significativos.
   i2c_write(ExtEEprom, address);  //Escribo los 8 bits mas significativos.
   i2c_start(ExtEEprom);   //Esto especifica que lo anterior fue para un proceso obligatorio para realizar una operacion de lectura.
   i2c_write(ExtEEprom, 0xa1);  //Direcion del dispositivo e indicando, desde el primer bit, que se hara una operacion de lectura (ahora que recien se peude).
   data = i2c_read(ExtEEprom, 0);  //Espero hasta capturar algun dato, mandando un bit de NOACK(0) al dispositvo por necesidad del mismo, y lo guardo en "data". 
   i2c_stop(ExtEEprom);

   return(data);
}

void write_ext_eeprom_int16(int16 Direcion, int16 Dato)
{
   write_ext_eeprom(Direcion, Dato >> 8);  //Guarda el valor despues de los 8 bits mas significativos de "Dato".
   write_ext_eeprom(Direcion + 1, Dato);   //Guarda, en la direcion siguiente, los 8 bits mas significativos de "Dato".
}

int16 read_ext_eeprom_int16(int16 Direcion)
{ 
   int16 Dato;
  
   Dato = read_ext_eeprom(Direcion) << 8; //Lee la 1ra direcion y pone, ese valor, como los 8 bits menos significatios, quedando: xxxx xxxx 0000 0000.
   Dato += read_ext_eeprom(Direcion + 1); //Lee la 2da direcion y le suma dicho valor los 8 bits mas significativos, quedando: xxxx xxxx yyyy yyyy.
  
   return (Dato);
}

void read_ext_eeprom_seq(int8 *Dato, int16 DirecionIn, int16 DirecionMax) 
{
   unsigned int16 cnt;
   
   i2c_start(ExtEEprom);
   i2c_write(ExtEEprom, 0xA0);
   i2c_write(ExtEEprom, DirecionIn >> 8);
   i2c_write(ExtEEprom, DirecionIn);
   i2c_start(ExtEEprom);
   i2c_write(ExtEEprom, 0xA1);

   for (cnt = DirecionIn; cnt <= (DirecionMax - 1); cnt++)
   {
      *Dato = i2c_read(ExtEEprom);
      Dato++;
   }
   
   *Dato = i2c_read(ExtEEprom, 0);  //NO ACK.
   i2c_stop(ExtEEprom);
}


void write_ext_eeprom_seq(long int address, int8 dato)
{
   unsigned long i;
   
   i2c_start(ExtEEprom);
   i2c_write(ExtEEprom, 0xa0);
   i2c_write(ExtEEprom, address>>8);
   i2c_write(ExtEEprom, address);
      
   for (i = address; i <= (127 + address); i++)
   {
      i2c_write(ExtEEprom, dato);
   }
   
   i2c_stop(ExtEEprom);
}

