It works!!! Thanks!!! I posted bellow my code, for anyone who wants to use eeprom on NORMAL MODE.
/*on prm file*/
EEPROM_FC = NO_INIT 0xFC0800 TO 0xFC0BFF;
EEPROM_DATA INTO EEPROM_FC;
/*main.c*/
#pragma DATA_SEG EEPROM_DATA
tEEPROM_DATA EEPROM_Storage;
#pragma DATA_SEG DEFAULT
tEEPROM_DATA EEPROM_Image;
if(ECLKDIV_EDIVLD==0){ ECLKDIV_EDIV=0x14;}/* If clock not defined, define now */
EPAGE=0xFC; /* Define EEPROM Page */
/*eeprom.h*/
#define EEPROM_SECTOR_WORD_SIZE 2
#define EEPROM_SECTOR_BYTE_SIZE 4
BOOL WRITE_SECTOR_EEPROM(UINT8* far pEEPROMAddress, UINT8* pRAMAddress, INT16 Size);
void PROGRAM_SECTOR_EEPROM(UINT8* far pEEPROMAddress, UINT8* pRAMAddress);
void ERASE_SECTOR_EEPROM(UINT8* far pEEPROMAddress);
/*eeprom.c*/
BOOL WRITE_SECTOR_EEPROM(UINT8* far pEEPROMAddress, UINT8* pRAMAddress, INT16 Size)
{
UINT8* far pPointerDestination=pEEPROMAddress;
UINT8* pPointerOrigin=pRAMAddress;
UINT16 EndOffset=(((UINT8)pEEPROMAddress+Size) & 0x07FF)/EEPROM_SECTOR_WORD_SIZE;
UINT16 Offset=((UINT8)pEEPROMAddress & 0x07FF)/EEPROM_SECTOR_WORD_SIZE;
if((((UINT8)pEEPROMAddress+Size) & 0x07FF)%EEPROM_SECTOR_WORD_SIZE!=0){ return FALSE;}
if(Size<=0){ return FALSE;}
DisableInterrupts;
/* Program EEPROM Block */
while(Offset<EndOffset)
{
if(memcmp(pPointerDestination, pPointerOrigin, EEPROM_SECTOR_BYTE_SIZE)!=0)
{
/* Erase Sector Procedure */
ERASE_SECTOR_EEPROM((UINT8*)pPointerDestination);
/* Program Data Procedure */
PROGRAM_SECTOR_EEPROM((UINT8*)pPointerDestination, (UINT8*)pPointerOrigin);
}
pPointerOrigin+=EEPROM_SECTOR_BYTE_SIZE;
pPointerDestination+=EEPROM_SECTOR_BYTE_SIZE;
Offset+=EEPROM_SECTOR_WORD_SIZE;
}
EnableInterrupts;
return TRUE;
}
void PROGRAM_SECTOR_EEPROM(UINT8* far pEEPROMAddress, UINT8* pRAMAddress)
{
UINT8 i=0;
UINT16* far pEEPROMPointer=(UINT16*)pEEPROMAddress;
UINT16* pRAMPointer=(UINT16*)pRAMAddress;
/* Disable all interrupts */
DisableInterrupts;
/* Wait for buffer to be empty */
while(ESTAT_CBEIF==0);
/* Clear error flags */
if(ESTAT_ACCERR==1||ESTAT_PVIOL==1)
{
ESTAT=(ESTAT_ACCERR_MASK | ESTAT_PVIOL_MASK);
}
for(i=0; i<EEPROM_SECTOR_WORD_SIZE; i++)
{
*pEEPROMPointer=*pRAMPointer;
pEEPROMPointer++;
pRAMPointer++;
/* Run Program Command */
ECMD=0x20;
/* Run command */
ESTAT=ESTAT_CBEIF_MASK;
/* Wait for buffer to be empty */
while(ESTAT_CBEIF==0);
}
/* Wait for command to completed */
while(ESTAT_CCIF==0);
/* Enable all interrupts */
EnableInterrupts;
}
void ERASE_SECTOR_EEPROM(UINT8* far pEEPROMAddress)
{
UINT16* far pEEPROMPointer=(UINT16*)pEEPROMAddress;
/* Disable all interrupts */
DisableInterrupts;
/* Wait for buffer to be empty */
while(ESTAT_CBEIF==0);
/* Clear error flags */
if(ESTAT_ACCERR==1||ESTAT_PVIOL==1)
{
ESTAT=(ESTAT_ACCERR_MASK | ESTAT_PVIOL_MASK);
}
*pEEPROMPointer=0x0000;
pEEPROMPointer++;
/* Run Sector Erase Command */
ECMD=0x40;
/* Run command */
ESTAT=ESTAT_CBEIF_MASK;
/* Wait for command to completed */
while(ESTAT_CCIF==0);
/* Enable all interrupts */
EnableInterrupts;
}
Message Edited by Forsaken on 2009-05-21 12:14 PM
Message Edited by Forsaken on 2009-05-21 12:14 PM