공부/8051 2012. 11. 12. 20:37

 

EEPROM

 

1    EEPROM 기본사항

 

ADUC831은 Flash/EE data memory 라고 하는 EEPROM을 4Kbyte를 가지고 있습니다. 그 처리방법은 ADUC812와 같습니다. 자세한 내용은 매뉴얼을 참고해 주시기 바랍니다. 본 문서에서는 www.keil.com 에서 제공하고 있는 관련 소스를 소개해 드리고 싶습니다. 사용하기에 편리하게 되어 있습니다.

 

2    EEPROM 사용(SOURCE)

 

Define 

#define ADI_EE_READ_PAGE 1
#define ADI_EE_WRITE_PAGE 2
#define ADI_EE_ERASE_PAGE 5
#define ADI_EE_ERASE_ALL 6
//#define ADI_EEMEM_SIZE 640UL //audc812
#define ADI_EEMEM_SIZE 4096UL //audc831

 

char flash_erase_all (void);

unsigned long flash_size (void);

unsigned long flash_read (
void *buffer, /* Buffer to fill */
unsigned long len, /* Bytes to read */
unsigned long address); /* FLASH address to read from */

unsigned long flash_write (
const void *buffer, /* Buffer to save */
unsigned long len, /* Buffer length */
unsigned long address); /* FLASH address to write to */

 

Source #1 플레쉬 전체영역 삭제

char flash_erase_all (void)
{
    ECON = ADI_EE_ERASE_ALL;
    return (0);
}

 

Source #2 플레쉬 전체 사이즈 확인

unsigned long flash_size (void)
{
    return (ADI_EEMEM_SIZE);
}

 

Source #3 플레쉬 에서 DATA 읽기

unsigned long flash_read ( void *buffer, unsigned long len, unsigned long address) /* Buffer to fill, Bytes to ,FLASH address to read from */
{
    unsigned char *s = buffer;
    unsigned long i;
    unsigned int addr;
    
    if (address >= ADI_EEMEM_SIZE) return (0UL);    
    addr = (unsigned int) address;    


    EADRL = addr >> 2;
    ECON = ADI_EE_READ_PAGE;

    for (i = 0; i < len; i++)
    {
         switch (addr & 0x03)
         {
             case 0: s[i] = EDATA1; break;
             case 1: s[i] = EDATA2; break;
             case 2: s[i] = EDATA3; break;
             case 3: s[i] = EDATA4; break;
         }

         if (++addr >= ADI_EEMEM_SIZE) break;

         if ((addr & 0x03) == 0)
         {
             EADRL = addr >> 2;
             ECON = ADI_EE_READ_PAGE;
         }
}
return (i);
}

 

 

 

Source #4 플레쉬 에서 DATA 쓰기

unsigned long flash_write ( const void *buffer, unsigned long len, unsigned long address)/*Buffer to save,Buffer length,FLASH address to write to */
{
    const unsigned char *s = buffer;
    unsigned int i;
    unsigned int addr;

    if (address >= ADI_EEMEM_SIZE)      return (0UL);
    addr = (unsigned int) address;
    for (i = 0; i < len; i++)
     {
     if ((i == 0) || (addr & 0x03) == 0)    //read page
     {
     EADRL = addr >> 2;
     ECON = ADI_EE_READ_PAGE;
     }
    //Update the data.
     switch ((addr++) & 0x03)     //data Àоî¿À±â
     {
     case 0: EDATA1 = s[i];
     break;
     case 1: EDATA2 = s[i];
     break;
     case 2: EDATA3 = s[i];
     break;
     case 3: EDATA4 = s[i];
     WRITE_EEPROM:
     ECON = ADI_EE_ERASE_PAGE;
     ECON = ADI_EE_WRITE_PAGE;
     break;
     }
    //Update the address.
     if (addr >= ADI_EEMEM_SIZE)
     break;
     }
    //Write the final page IFF address is not at the start of a new page.
    
if (addr & 0x03)
     {
         addr = ADI_EEMEM_SIZE;
         goto WRITE_EEPROM;
     }

    return (i);
}

 

Source #5 사용예

    unsigned char buf;

 

//내부flash 메모리에저장 Comm0.RxBuff[1]에 들어있는 값을 Flash/EEPROM 번지로 하고

// buf의 값을 저장한다. 1로 설정되어 1byte 저장된다.

 

    buf = Comm0.RxBuff[1] - 0x20;

    flash_write(&buf, 1, (unsigned long)Comm0.RxBuff[1]);        

 

//일정범위(system_set 사이즈) 만큼 DATA를 읽어 온다.

    flash_read (&system_set, sizeof(system_set), 0);

 

//일정주소에서 data를 한바이트 읽어 온다.

flash_read( &buf, 1, (unsigned long)Comm0.RxBuff[1]);

 

 

 

'공부 > 8051' 카테고리의 다른 글

[ADUC831] ADUC831 간단 매뉴얼 5  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 4  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 3  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 2  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 1  (0) 2012.11.12
[ADUC812] ADUC812 설명 8  (0) 2012.11.10
posted by 큰파도

댓글을 달아 주세요