/******************************************************************************
;  *   	@MCU				 : MC51F003A4
;  *   	@Create Date         : 2021.10.11
;  *   	@Author/Corporation  : Martin/SinoMCU
;  *   	@晟矽微技术支持QQ 	 : 2048615934
;  *    @晟矽微官网		     : http://www.sinomcu.com/
;  *   	@Copyright           : 2020 SINOMCU Corporation,All Rights Reserved.
;  *----------------------Abstract Description---------------------------------
;  *			          定义                              		
******************************************************************************/
#include "EEPROM.h"

/************************************************
;  *    @Function Name       : EEPROM_Init_Chip_Erase
;  *    @Description         : eeprom全擦除模式初始化
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void EEPROM_Chip_Erase()
{
    DISABLE_GIE();
    SET_IAPEN();
    SET_IAPEN(); //两遍有效，打开IAP功能

    SET_ECHIPERS();
    SET_ECHIPERS(); //两遍有效，全擦模式
    IAPKEY = 0x5a;
    IAPKEY = 0xa5; //必须操作，0x5a,0xa5
    SET_IAPSTR();  //IAPSTR位置一，启动IAP操作

    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG0(); //IAPTRIG0置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG1(); //IAPTRIG1置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG2(); //IAPTRIG1置一
    while (IAPCR & 0x80);
    ENABLE_GIE();
}
/************************************************
;  *    @Function Name       : EEPROM_Init_Page_Erase
;  *    @Description         : eeprom页擦除模式初始化
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void EEPROM_Page_Erase(uint8_t Page)
{
    uint8_t bytecnt;

    DISABLE_GIE();
    SET_IAPEN();
    SET_IAPEN(); //打开FALSH IAP功能，连续写两遍有效
    SET_EPAGEERS();
    SET_EPAGEERS(); //页擦模式
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPSTR(); //IAPSTR位置一，启动IAP操作
    IAPADH = (Page & 0x3f) >> 4;
    IAPADL = (Page & 0x0f) << 4;
    for (bytecnt = 0; bytecnt < 16; bytecnt++)
    {
        IAPADL &= 0xf0;
        IAPADL |= bytecnt;
        IAPDB = 0;
    }
    IAPADL &= 0xf0;
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG0(); //IAPTRIG0置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG1(); //IAPTRIG1置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG2(); //IAPTRIG1置一
    while (IAPCR & 0x80);
    ENABLE_GIE();
}
/************************************************
;  *    @Function Name       : EEPROM_Init_Page_Write
;  *    @Description         : eeprom页写  16字节
;  *    @IN_Parameter        : page 0-63   W_data 数据
;  *    @Return parameter    :
;  ***********************************************/
void EEPROM_Page_Write(uint8_t page, uint8_t *W_data)
{
    uint8_t cnt;

    DISABLE_GIE();

    SET_IAPEN();
    SET_IAPEN(); //打开FALSH IAP功能，连续写两遍有效
    SET_EPAGEWR();
    SET_EPAGEWR(); //页写模式
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPSTR(); //IAPSTR位置一,启动IAP操作
    IAPADH = (page & 0x3f) >> 4;
    IAPADL = (page & 0x0f) << 4;
    for (cnt = 0; cnt < 16; cnt++)
    {
        IAPADL &= 0xf0;
        IAPADL |= cnt;
        IAPDB = W_data[cnt];
    }
    IAPADL &= 0xf0;
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG0(); //IAPTRIG0置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG1(); //IAPTRIG1置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG2(); //IAPTRIG1置一
    while (IAPCR & 0x80); //IAPSTR
    ENABLE_GIE();
}
/************************************************
;  *    @Function Name       : EEPROM_Byte_Erase
;  *    @Description         : eeprom字擦除模式初始化
;  *    @IN_Parameter      	 :addar 0-0x3ff W_data 数据
;  *    @Return parameter    :
;  ***********************************************/
void EEPROM_Byte_Erase(uint16_t addar)
{
    DISABLE_GIE();
    SET_IAPEN();
    SET_IAPEN(); //打开FALSH IAP功能，连续写两遍有效
    SET_EPAGEERS();
    SET_EPAGEERS(); //页擦模式
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPSTR(); //IAPSTR位置一，启动IAP操作
    IAPADH = (addar >> 8) & 0xff;
    IAPADL = addar & 0xff;
    IAPDB = 0;
    IAPADL &= 0xf0;
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG0(); //IAPTRIG0置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG1(); //IAPTRIG1置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG2(); //IAPTRIG1置一
    while (IAPCR & 0x80);
    ENABLE_GIE();
}
/************************************************
;  *    @Function Name       : EEPROM_Init_Byte_Write
;  *    @Description         : eeprom字节写
;  *    @IN_Parameter        : addar 0-0x3ff W_data 数据
;  *    @Return parameter    :
;  ***********************************************/
void EEPROM_Byte_Write(uint16_t addar, uint8_t W_data)
{
    DISABLE_GIE();
    SET_IAPEN();
    SET_IAPEN(); //打开FALSH IAP功能，连续写两遍有效
    SET_EPAGEWR();
    SET_EPAGEWR(); //页写模式
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPSTR(); //IAPSTR位置一，启动IAP操作
    IAPADH = (addar >> 8) & 0xff;
    IAPADL = addar & 0xff;
    IAPDB = W_data; //W_data
    IAPADL &= 0xf0;
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG0(); //IAPTRIG0置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG1(); //IAPTRIG1置一
    IAPKEY = 0x5a;
    IAPKEY = 0xa5;
    SET_IAPTRIG2(); //IAPTRIG1置一
    while (IAPCR & 0x80);
    ENABLE_GIE();
}
/************************************************
;  *    @Function Name       : EEPROM_Byte_Read
;  *    @Description         : eeprom字节读
;  *    @IN_Parameter        : addar 0-0x3ff
;  *    @Return parameter    : 数据
;  ***********************************************/
uint8_t EEPROM_Byte_Read(uint16_t addr)
{
    uint8_t R_data;
    DISABLE_GIE();
    SET_EERD(); //EERD置1
    R_data = *(uint8_t __IO code *)addr;
	CLR_EERD(); //EERD清0
    ENABLE_GIE();
    return R_data;
}
/************************************************
;  *    @Function Name       : EEPROM_Read
;  *    @Description         : EEPROM按照长度读取
;  *    @IN_Parameter        :
;  *    @Return parameter    :
;  ***********************************************/
void EEPROM_Read(uint16_t addr, uint8_t idata *R_data, uint16_t len)
{
    uint16_t cnt;
    DISABLE_GIE();
    SET_EERD(); //EERD置1
    for (cnt = 0; cnt < len; cnt++)
    {
        R_data[cnt] = *(uint8_t __IO code *)addr;
        addr++;
    }
	CLR_EERD(); //EERD清0
    ENABLE_GIE();
}

/**************************** end of file *********************************************/
