N76E003 Flash

找到可用的N76e003Flash 这里注意 N76E003这种 51 内核 都是大端数据

 

MAIN

//=======================================================================================                                                                                                      */
// Copyright(c) 2017 Nuvoton(SH) Technology Corp. All rights reserved.                       
// Website: http://www.nuvoton.com
// Date   : 6/1/2017
//=======================================================================================                                                                                                      */
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Flash.h"

struct
{
    UINT16 a;
    UINT32 b;
    UINT8  c;
    
}StructData;

UINT8 ArrayData[4];    

/******************************************************************************************************************/    


void main (void) 
{
    ArrayData[0]=0x10;
    ArrayData[1]=0x21;
    ArrayData[2]=0x32;
    ArrayData[3]=0x43;
    
    StructData.a=0x1234;
    StructData.b=0x56784321;
    StructData.c=0x55;
    
    WriteDataFlash(0x3800,ArrayData+0,1);//write 1 byte to flash 
    WriteDataFlash(0x3801,ArrayData+1,3);//write 3 bytes
    WriteDataFlash(0x3804,(uint8_t *)&StructData,sizeof(StructData));//write structure
    
    ArrayData[0]=0;
    ArrayData[1]=0;
    ArrayData[2]=0;
    ArrayData[3]=0;
    
    StructData.a=0;
    StructData.b=0;
    StructData.c=0;
    
    ReadDataFlash(0x3800, ArrayData+0,4);
    ReadDataFlash (0x3804,(uint8_t *)&StructData,sizeof(StructData));
    
    
    if(ArrayData[0]!=0x10||ArrayData[1]!=0x21||ArrayData[2]!=0x32||ArrayData[3]!=0x43)
    {
        while(1);
    }        
    if(StructData.a!=0x1234||StructData.b!=0x56784321||StructData.c!=0x55)
    {
        while(1);
    }
    
    
    while(1);

}

 

 

 

H文件

#ifndef  __FLASH_H
#define  __FLASH_H

#define     CID_READ            0x0B
#define     DID_READ            0x0C

#define     PAGE_ERASE_AP       0x22
#define     BYTE_READ_AP        0x00
#define     BYTE_PROGRAM_AP     0x21
#define     PAGE_SIZE           128u

#define     ERASE_FAIL          0x70
#define     PROGRAM_FAIL        0x71
#define     IAPFF_FAIL          0x72
#define     IAP_PASS            0x00



//=======================================================================================
// 输入 u16_addr,  待写入APROM的起始地址
//      pDat,      待写数据的起始地址
//      num,       总共写入数据的字节数
//支持跨page写,写数据时不需要擦flash,函数内部会自己擦除
//=======================================================================================
void WriteDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num);

//=======================================================================================
// 输入 u16_addr,  待读出APROM的起始地址
//      pDat,      待读数据的起始地址
//      num,       总共读出数据的字节数
//支持跨page读
//=======================================================================================
void ReadDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num);
#endif //__FLASH_H

 

 

 

C文件

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jan/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 APROM program DATAFLASH as EEPROM way 
//***********************************************************************************************************
#include "N76E003.h"
#include "Flash.h"

static bit EA_Save_bit;

void Enable_IAP_Mode(void)
{
  EA_Save_bit=EA;
    EA=0;
    TA=0xAA;
    TA=0x55;
    CHPCON|=0x01 ;
    TA=0xAA;
    TA=0x55;
    IAPUEN|=0x01;
    EA=EA_Save_bit;
}
//-----------------------------------------------------------------------------------------------------------
void Disable_IAP_Mode(void)
{
  EA_Save_bit=EA;
  EA=0;
  TA=0xAA;
  TA=0x55;
  IAPUEN&=~0x01;
  TA=0xAA;
  TA=0x55;
  CHPCON&=~0x01;
  EA=EA_Save_bit;
}
//-----------------------------------------------------------------------------------------------------------
void Trigger_IAP(void)
{
    EA_Save_bit=EA;
    EA=0;
    TA=0xAA;
    TA=0x55;
    IAPTRG|=0x01;
    EA=EA_Save_bit;
}

    
uint8_t WriteDataToOnePage(uint16_t u16_addr,const uint8_t *pDat,uint8_t num)
{
  uint8_t i,offset;
  uint8_t code *pCode;
  uint8_t xdata xd_tmp[128];

    Enable_IAP_Mode(); 
    offset=u16_addr&0x007F;
    i = PAGE_SIZE - offset;
    if(num>i)num=i;
  pCode = (uint8_t code *)u16_addr;
  for(i=0;i<num;i++)
  {
    if(pCode[i]!=0xFF)break;
  }
    if(i==num)
    {
      IAPCN =BYTE_PROGRAM_AP;
        IAPAL = u16_addr;
        IAPAH = u16_addr>>8;
        for(i=0;i<num;i++)
        {
            IAPFD = pDat[i];
            Trigger_IAP();
            IAPAL++;
        }
        for(i=0;i<num;i++)
        {
            if(pCode[i]!=pDat[i])break;
        }
        if(i!=num) goto WriteDataToPage20;
    }
    else
    {
        WriteDataToPage20:
        pCode = (uint8_t code *)(u16_addr&0xff80);
        for(i=0;i<128;i++)
        {
            xd_tmp[i] = pCode[i];
        }
        for(i=0;i<num;i++)
        {
            xd_tmp[offset+i] = pDat[i];
        }
        do
        {
            IAPAL = (u16_addr&0xff80);
            IAPAH = u16_addr>>8;
            IAPCN = PAGE_ERASE_AP;
            IAPFD = 0xFF;    
            Trigger_IAP(); 
            IAPCN =BYTE_PROGRAM_AP;
            for(i=0;i<128;i++)
            {
                IAPFD = xd_tmp[i];
                Trigger_IAP();
                IAPAL++;
            }
            for(i=0;i<128;i++)
            {
                if(pCode[i]!=xd_tmp[i])break;
            }
        }while(i!=128);
        
    }
    Disable_IAP_Mode();
    
    return num;
}    

//-------------------------------------------------------------------------
void WriteDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num)
{
    uint8_t CPageAddr,EPageAddr,cnt;
    CPageAddr=u16_addr>>7;
    EPageAddr=(u16_addr+num)>>7;
    while(CPageAddr!=EPageAddr)
    {
        cnt=WriteDataToOnePage(u16_addr,pDat,128);
        u16_addr+=cnt;
        pDat+=cnt;
        num-=cnt;
        CPageAddr=u16_addr>>7;
    }
    if(num)
    {
        WriteDataToOnePage(u16_addr,pDat,num);
    }
}
//-------------------------------------------------------------------------
void ReadDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num)
{
    uint16_t i;
    for(i=0;i<num;i++)
    pDat[i] = *(uint8_t code *)(u16_addr+i);
}
//-----------------------------------------------------------------------------------------------------------

 

posted @ 2020-08-11 13:47  XZHDJH  阅读(530)  评论(0)    收藏  举报