/** \file Driver_24AA1025.c
* \brief Este fichero contiene funciones para el uso de las memorias Serial EEPROM mediante el bus I2C.
*
* Tiene capacidad para hasta 4 módulos de tipo 24AA1025 de Microchip,
* direcionadas individualmente mediante las constantes <b>deviceAddressX</b>
* correspondientes a las direcciones hardware de los chips.
*
* <b>¡Atención!</b> No inicia la comuniación I2C que debe ser iniciada externamente.
*
* \author Diego RedPic
*/
// baseControlByte24AA1025 = 8 bits which mean ...
//
// Fixed (4 bits) -> 1010
// EE internal Block (1 bit) -> 0 for 0000/FFFF, 1 for 10000/1FFFF
// Dev Hard Address (2 bits) -> 00 or 01 or 10 or 11
// R/W (1 bit) -> 0 -> Write / 1 -> Read
int8 const baseControlByte24AA1025 = 0b10100000;
// ----B10W
// Aux Function /////////////////////////////////////////////////////////////
/** \brief Función para la escritura de un byte dando su valor y su dirección absoluta.
*
* Esta función decodifica la Dirección Absoluta de memoria en Dirección Relatiba, Banco y Device en las 24AA1025.
* \param absAddress Dirección absoluta de 32 bits a escribir (rango de 000000h a 080000h).
* \param[out] relAddress Direccion interna relativa (rango de 0000h a FFFFh).
* \param[out] cByte Composición del byte de cabecera que incluye el Banco y el Device.
* \return void
*
*/
void absoluteAddress_to_relativeAddressAndControlByte24AA1025(int32 absAddress, int16 &relAddress, int8 &cByte){
int8 i;
// Relative Address (Copiar los primeros 16 bits)
relAddress = 0;
for(i=0;i<16;i++){
if(bit_test(absAddress,i)==1){
bit_set(relAddress,i);
}
}
// Inicializa Control Byte
cByte = baseControlByte24AA1025;
// Bank
if(bit_test(absAddress,16)==1){
bit_set(cByte,3);
}
// Device A0
if(bit_test(absAddress,17)==1){
bit_set(cByte,1);
}
// Device A1
if(bit_test(absAddress,18)==1){
bit_set(cByte,2);
}
}
// Main Functions /////////////////////////////////////////////////////////////
/** \brief Función para la escritura de un byte dando su valor y su dirección absoluta en las 24AA1025
*
* Esta función incluye \c <b>delay</b> de 5 milisegundos tras su ejecución ¡NO DISMINUIR!.
* \param Address Dirección absoluta de 32 bits a escribir (rango de 000000h a 080000h).
* \param data Valor del byte a escribir (rango de 00h a ffh).
* \return void
*/
void writeByte24AA1025(int32 Address, int8 data){
int8 controlByte;
int16 relativeAddress;
absoluteAddress_to_relativeAddressAndControlByte24AA1025(Address,relativeAddress,controlByte);
i2c_start();
i2c_write(controlByte);
i2c_write(relativeAddress>>8);
i2c_write(relativeAddress);
i2c_write(data);
i2c_stop();
delay_ms(5);
}
/** \brief Función para la lectura de un byte dando su dirección absoluta en las 24AA1025
*
* \param Address Dirección absoluta de 32 bits a leer (rango de 000000h a 080000h).
* \return Devuelve byte (int8) con el contenido de dicha dirección.
*/
int8 readByte24AA1025silent(int32 Address){
int8 returnByte=0;
int8 controlByte;
int16 relativeAddress;
absoluteAddress_to_relativeAddressAndControlByte24AA1025(Address,relativeAddress,controlByte);
i2c_start();
i2c_write(controlByte);
i2c_write(relativeAddress>>8);
i2c_write(relativeAddress);
i2c_start();
i2c_write(controlByte|1);
returnByte = i2c_read(0);
i2c_stop();
return returnByte;
}
/** \brief Función para la lectura de un string en las 24AA1025 dando su dirección absoluta y su longitud.
*
* \param Address Dirección absoluta de 32 bits a leer (rango de 000000h a 080000h).
* \param Len Longitud de 8 bits de datos a leer (rango de 00h a FFh).
* \param[out] pF Puntero con el contenido de lo leído. Se carga de pF[0] a pF[Len-1] y se fuerza pF[Len] a \\0.
* \return void
*/
void readString24AA1025(int32 Address, int8 Len, char* pF){
char c;
int32 m;
int8 i;
set_to_i2c_channel();
for(i=0,m=Address;i<Len;i++,m++){
c = readByte24AA1025silent(m);
pf[i]=c;
}
pf[Len]='\0';
set_to_ext_channel();
}
/** \brief Función para de escritura de un campo en las 24AA1025 dando su dirección absoluta y su contenido.
*
* \param Address Dirección absoluta de 32 bits del primer byte del campo a escribir (rango de 000000h a 080000h).
* \param Len Longitud de 8 bits de datos a leer (rango de 00h a FFh).
* \param pF Puntero con el contenido del string que hay que escribir.
* \return void
*/
void writeString24AA1025(int32 Address, int8 Len, char* pF){
int8 i;
int32 m;
for(i=0,m=Address;i<Len_string,i<Len;i++,m++){
writeByte24AA1025silent(m,pF[i]);
}
}
/** \brief Función que rellena las 24AA1025 desde una dirección absoluta de inicio hasta una de final y el carácter de relleno.
*
* \param Start_Address Dirección de inicio del volcado de momoria
* \param End_Address Dirección final del volcado de momoria
* \param FillChar Valor del Byte de relleno
*
* \return void
*/
void FillMemory24AA1025(int32 Start_Address, int32 End_Address, int8 FillChar){
int32 m;
for(m=Start_Address;m<End_Address+1;m++){
writeByte24AA1025silent(m,FillChar);
}
}
///////////////////////////////////////////////////////////////////////////////