Hi @Wei_Lang
You can refer to lpc1788 eeprom example.
/* Read data from non-volatile memory */
uint32_t Chip_EEPROM_ReadPage(LPC_EEPROM_T *pEEPROM,
uint16_t pageOffset,
uint16_t pageAddr,
uint8_t *pData,
uint8_t rsize,
uint32_t byteNum)
{
uint32_t i;
uint32_t mask = (1 << (8 * rsize)) - 1;
Chip_EEPROM_ClearIntStatus(pEEPROM, EEPROM_INT_ENDOFRW);
Chip_EEPROM_SetAddr(pEEPROM, pageAddr, pageOffset);
if (rsize == 1) {
Chip_EEPROM_SetCmd(pEEPROM, EEPROM_CMD_8BITS_READ | EEPROM_CMD_RDPREFETCH);
}
else if (rsize == 2) {
Chip_EEPROM_SetCmd(pEEPROM, EEPROM_CMD_16BITS_READ | EEPROM_CMD_RDPREFETCH);
}
else {
Chip_EEPROM_SetCmd(pEEPROM, EEPROM_CMD_32BITS_READ | EEPROM_CMD_RDPREFETCH);
}
/* read and store data in buffer */
for (i = 0; i < byteNum; i += rsize) {
(*(uint32_t *) (&pData[i]) ) &= ~mask;
(*(uint32_t *) (&pData[i]) ) |= (Chip_EEPROM_ReadData(pEEPROM) & mask);
Chip_EEPROM_WaitForIntStatus(pEEPROM, EEPROM_INT_ENDOFRW);
}
return i;
}
/* Read data to EEPROM at specific address */
void Chip_EEPROM_Read(LPC_EEPROM_T *pEEPROM,
uint16_t pageOffset,
uint16_t pageAddr,
void *pData,
EEPROM_RWSIZE_T rsize,
uint32_t byteNum)
{
uint32_t rTotalByteNum = 0;
uint32_t rOffset = (pageOffset & (EEPROM_PAGE_SIZE - 1));
uint32_t rByteNum = EEPROM_PAGE_SIZE - rOffset;
/* read and store data in buffer */
while (byteNum) {
if (rByteNum > byteNum) {
rByteNum = byteNum;
}
/* update data to page register */
Chip_EEPROM_ReadPage(pEEPROM, rOffset, pageAddr,
&((uint8_t *) pData)[rTotalByteNum], (uint8_t) rsize, rByteNum);
rTotalByteNum += rByteNum;
byteNum -= rByteNum;
/* Change to next page */
pageAddr++;
rOffset = 0;
rByteNum = EEPROM_PAGE_SIZE;
}
}
Hope this will help you.
BR
Hang