#define control 0x0a
// Escribir un byte en Memoria EEPROM 24LC512
unsigned char write_ext_eeprom(unsigned int address,unsigned char data){
IdleI2C2(); // ensure module is idle
StartI2C2(); // initiate START condition
while(SSP2CON2bits.SEN); // wait until start condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
else{ // start condition successful
if(WriteI2C2(control)) // write byte - R/W bit should be 0
return(-3); // set error for write collision
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition received
if(WriteI2C2(*((char*)(&address+1)))) // write word address for EEPROM
return(-3); // set error for write collision
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition received
if(WriteI2C2(*((char*)(&address)))) // write word address for EEPROM
return(-3); // set error for write collision
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition received
if(WriteI2C2(data)) // data byte for EEPROM
return(-3); // set error for write collision
}
else
return(-2); // return with Not Ack error condition
}
}
else
return(-2); // return with Not Ack error condition
}
IdleI2C2(); // ensure module is idle
StopI2C2(); // send STOP condition
while(SSP2CON2bits.PEN); // wait until stop condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
return(0); // return with no error
}
// Escribir Pagina en Memoria EEPROM 24LC512 desde una Cadena
unsigned char write_string_eeprom(unsigned int address,unsigned char *wrptr){
IdleI2C2(); // ensure module is idle
StartI2C2(); // initiate START condition
while(SSP2CON2bits.SEN); // wait until start condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
else{ // start condition successful
if(WriteI2C2(control)) // write byte - R/W bit should be 0
return(-3); // set error for write collision
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition received
if(WriteI2C2(*((char*)(&address+1)))) // write word address for EEPROM
return(-3); // set error for write collision
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition received
if(WriteI2C2(*((char*)(&address)))) // write word address for EEPROM
return(-3); // set error for write collision
//*******************************************************************************
//*******************************************************************************
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition received
if(putsI2C2(wrptr)) // data byte for EEPROM
return(-4); // set error for write collision
}
//*******************************************************************************
//*******************************************************************************
else
return(-2); // return with Not Ack error condition
}
}
else
return(-2); // return with Not Ack error condition
}
IdleI2C2(); // ensure module is idle
StopI2C2(); // send STOP condition
while(SSP2CON2bits.PEN); // wait until stop condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
return(0); // return with no error
}
// Lectura de un byte en Memoria EEPROM 24LC512
unsigned char read_ext_eeprom(unsigned int address){
IdleI2C2(); // ensure module is idle
StartI2C2(); // initiate START condition
while(SSP2CON2bits.SEN); // wait until start condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
else{
if(WriteI2C2(control)) // write 1 byte
return(-3); // return with write collision error
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition, if received
if(WriteI2C2(*((char*)(&address+1)))) // WRITE word address for EEPROM
return(-3); // return with write collision error
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition, if received
if(WriteI2C2(*((char*)(&address)))) // WRITE word address for EEPROM
return(-3); // return with write collision error
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition, if received
RestartI2C2(); // generate I2C bus restart condition
while(SSP2CON2bits.RSEN);// wait until re-start condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
if(WriteI2C2(control+1)) // write 1 byte - R/W bit should be 1
return(-3); // return with write collision error
IdleI2C2(); // ensure module is idle
if(!SSP2CON2bits.ACKSTAT){ // test for ACK condition, if received
SSP2CON2bits.RCEN=1; // enable master for 1 byte reception
while(SSP2CON2bits.RCEN); // check that receive sequence is over
NotAckI2C2(); // send ACK condition
while(SSP2CON2bits.ACKEN);// wait until ACK sequence is over
StopI2C2(); // send STOP condition
while(SSP2CON2bits.PEN); // wait until stop condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
}
}
else
return(-2); // return with Not Ack error
}
else
return(-2); // return with Not Ack error
}
else
return(-2); // return with Not Ack error
}
return((unsigned int)SSP2BUF); // return with data
}
// Esperar Ack en Memoria EEPROM 24LC512
unsigned char ack_ext_eeprom(){
IdleI2C2(); // ensure module is idle
StartI2C2(); // initiate START condition
while(SSP2CON2bits.SEN); // wait until start condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
else{
if(WriteI2C2(control)) // write byte - R/W bit should be 0
return(-3); // set error for write collision
IdleI2C2(); // ensure module is idle
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
while(SSP2CON2bits.ACKSTAT){ // test for ACK condition received
RestartI2C2(); // initiate Restart condition
while(SSP2CON2bits.RSEN); // wait until re-start condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
if(WriteI2C2(control)) // write byte - R/W bit should be 0
return(-3); // set error for write collision
IdleI2C2(); // ensure module is idle
}
}
StopI2C2(); // send STOP condition
while(SSP2CON2bits.PEN); // wait until stop condition is over
if(PIR3bits.BCL2IF) // test for bus collision
return(-1); // return with Bus Collision error
return(0); // return with no error
}