Microchip Technology MA240017 Data Sheet

Page of 278
 2008-2011 Microchip Technology Inc.
DS39927C-page 55
PIC24F16KA102 FAMILY
6.4.1.1
Data EEPROM Bulk Erase
To erase the entire data EEPROM (bulk erase), the
address registers do not need to be configured
because this operation affects the entire data
EEPROM. The following sequence helps in performing
bulk erase:
1.
Configure NVMCON to Bulk Erase mode.
2.
Clear NVMIF status bit and enable NVM
interrupt (optional).
3.
Write the key sequence to NVMKEY.
4.
Set the WR bit to begin erase cycle.
5.
Either poll the WR bit or wait for the NVM
interrupt (NVMIF is set).
A typical bulk erase sequence is provided in
.
6.4.2
SINGLE-WORD WRITE
To write a single word in the data EEPROM, the
following sequence must be followed:
1.
Erase one data EEPROM word (as mentioned in
) if the
PGMONLY bit (NVMCON<12>) is set to ‘1’.
2.
Write the data word into the data EEPROM
latch.
3.
Program the data word into the EEPROM:
- Configure the NVMCON register to program one 
EEPROM word (NVMCON<5:0> = 0001xx).
- Clear NVMIF status bit and enable NVM 
interrupt (optional).
- Write the key sequence to NVMKEY.
- Set the WR bit to begin erase cycle.
- Either poll the WR bit or wait for the NVM 
interrupt (NVMIF is set).
- To get cleared, wait until NVMIF is set.
A typical single-word write sequence is provided in
.
EXAMPLE 6-3:
DATA EEPROM BULK ERASE
EXAMPLE 6-4:
SINGLE-WORD WRITE TO DATA EEPROM
// Set up NVMCON to bulk erase the data EEPROM
NVMCON = 0x4050;
// Disable Interrupts For 5 Instructions 
asm volatile ("disi #5");
// Issue Unlock Sequence and Start Erase Cycle
__builtin_write_NVM();
int __attribute__ ((space(eedata))) eeData = 0x1234;
// Variable located in EEPROM,declared as a 
   global variable.
int newData;
// New data to write to EEPROM
unsigned int offset;
// Set up NVMCON to erase one word of data EEPROM
NVMCON = 0x4004;
// Set up a pointer to the EEPROM location to be erased
TBLPAG = __builtin_tblpage(&eeData);
// Initialize EE Data page pointer
offset = __builtin_tbloffset(&eeData);
// Initizlize lower word of address
__builtin_tblwtl(offset, newData);
// Write EEPROM data to write latch
asm volatile ("disi #5");
// Disable Interrupts For 5 Instructions
__builtin_write_NVM();
// Issue Unlock Sequence & Start Write Cycle