关于SH79f1611芯片的EEPROM读写和擦除
读取成功,扇区擦除和字节编程失败,不知什么原因。
程序如下
#include "Define.H"
#include "intrins.h"
#include "Eeprom.h"
#include "Absacc.H"
/*****************************************************************************************************
* Function Name: u8 EEPromByteRead(UINT8 nAddrH,UINT8 nAddrL)
* Created By: GQ.quan
* Created Date: 2021.01.05
* Input: nAddrH, nAddrL
* Output: 无
* Return: nTemp
* Description: 从指定地址处读取1个字节返回
* History:
* Others:
*****************************************************************************************************/
unsigned char EEPromByteRead(u8 nAddrH,u8 nAddrL)// 字节读
{unsigned char nTemp;
unsigned int nInt;
_push_(IEN0);//
IEN0 &= 0x7F ;//关闭总中断
FLASHCON = 0x01;//访问EEPROM
nInt = nAddrH ; //读取地址为[nAddrH,nAddrL]
nInt <<= 8 ;nInt += nAddrL ;
nTemp = CBYTE[nInt];//将CBYTE[nAddrH+nAddrL]内数据存入nTemp变量
FLASHCON = 0x00 ;//将操作区域切换回Main Block
_pop_(IEN0);//
return (nTemp);//将读取值作为函数返回值
}
// 一个扇区256个字节,共8个扇区(EEPROM = 8*256B,总共 2KB)
/*****************************************************************************************************
* Function Name: void EEPromByteProgram(UINT8 nAddrH,UINT8 nAddrL, UINT8 nData)
* Input: nAddrH, nAddrL,nData
* Output: 无
* Return: 无
* Description: 向指定地址处写入1个字节
* History:
* Others:
*****************************************************************************************************/
void EEPromByteProgram(u8 nAddrH,u8 nAddrL, u8 nData) // 字节编程
{
_push_(IEN0);//
IEN0 &= 0x7F;
FLASHCON = 0x01;//访问EEPROM
XPAGE =(nAddrH);//个扇区256个字节,共8个扇区
IB_DATA = nData;
IB_OFFSET = nAddrL;
IB_CON1 = 0x6E;//开始编程操作
IB_CON2 = 0x05;
IB_CON3 = 0x0A;
IB_CON4 = 0x09;
IB_CON5 = 0x06;
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
XPAGE = 0 ;
FLASHCON = 0x00 ;//将编程区域切换回Main Block
_pop_(IEN0);//
}
/*****************************************************************************************************
* Function Name: void EEPromSectorErase(UINT8 nAddrH)
* Input: nAddrH
* Output: 无
* Return: 无
* Description: 擦除指定扇区
* History:
* Others:
*****************************************************************************************************/
void EEPromSectorErase(u8 nAddrH)//扇区擦除
{
_push_(IEN0);//
IEN0 &= 0x7F ;
FLASHCON = 0x01 ;
XPAGE = (nAddrH);//个扇区256个字节,共8个扇区
IB_CON1 = 0xE6 ;
IB_CON2 = 0x05 ;
IB_CON3 = 0x0A ;
IB_CON4 = 0x09 ;
IB_CON5 = 0x06 ;
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
XPAGE = 0 ;
FLASHCON = 0X00 ;
_pop_(IEN0);//
}
|