📄 sst29sf040.c
字号:
// sst29sf040.c
#include "Bos.h"
#include "SST29SF040.h"
unsigned int SF_ReadID()
{
unsigned int nID;
A16 = A17 = A18 = 0;
FLASH_CS = gbSFNoInUse = false;
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[0x555] = 0x90;
_nop_(); _nop_(); // 375nS (150nS)
nID = XBYTE[0] << 8;
nID += XBYTE[1];
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[0x555] = 0xf0;
FLASH_CS = gbSFNoInUse = true;
_nop_(); _nop_();
return nID;
}
void SF_UnSDP()
{
// FLASH_CS = gbSFNoInUse = false; // 修改OK
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[0x555] = 0xa0;
// FLASH_CS = gbSFNoInUse = true;
}
unsigned int SF_SetAdr(unsigned int nPage)
{
A18 = (unsigned char)(nPage >> 8) & 0x08;
A17 = (unsigned char)(nPage >> 8) & 0x04;
A16 = (unsigned char)(nPage >> 8) & 0x02;
return nPage << 7;
}
unsigned char SF_ReadByte(unsigned int nPage, unsigned char cAdr)
{
unsigned int nAdr;
unsigned char cData;
nAdr = SF_SetAdr(nPage);
nAdr += cAdr;
FLASH_CS = gbSFNoInUse = false;
cData = XBYTE[nAdr];
FLASH_CS = gbSFNoInUse = true;
return cData;
}
bool SF_Read(unsigned int nPage, unsigned char cAdr, unsigned char *pDatas, unsigned char cCount)
{
unsigned int nAdr;
unsigned char i, cData;
if (cAdr + cCount > SST29040_PAGESIZE)
return false;
nAdr = SF_SetAdr(nPage);
for(i=0; i < cCount; i++)
{
FLASH_CS = gbSFNoInUse = false;
cData = XBYTE[nAdr + cAdr + i];
FLASH_CS = gbSFNoInUse = true;
pDatas[i] = cData;
}
return true;
}
bool SF_Write(unsigned int nPage, unsigned char cAdr, unsigned char *pDatas, unsigned char cCount)
{
static unsigned char xdata cSRAMBuf[128]; //
unsigned int nAdr;
unsigned char cData, i,cCountOfErr;
bool bOK;
cCount = (cCount) ? cCount : 128;
if (cAdr + cCount > SST29040_PAGESIZE)
return false;
nAdr = SF_SetAdr(nPage);
for(i = 0; i < SST29040_PAGESIZE; i++)
{
FLASH_CS = gbSFNoInUse = false;
cData = XBYTE[nAdr + i];
FLASH_CS = gbSFNoInUse = true;
cSRAMBuf[i] = cData;
}
for(i = 0; i < cCount; i++)
cSRAMBuf[cAdr + i] = pDatas[i];
bOK = 0x00;
cCountOfErr = 0x00;
while(!bOK && cCountOfErr < 2)
{
SF_ErasePage(nPage);
bOK = SF_WritePage(nPage, cSRAMBuf);
cCountOfErr++;
}
return bOK;
}
bool SF_WritePage(unsigned int nPage, unsigned char *pDatas)
{
unsigned int nAdr;
unsigned char i,cData,cCountOfErr;
bool bOK;
cCountOfErr = 0x00;
nAdr = SF_SetAdr(nPage);
for(i = 0,bOK = true;i < SST29040_PAGESIZE;i++)
{
FLASH_CS = gbSFNoInUse = true;
cData = pDatas[i];
FLASH_CS = gbSFNoInUse = false;
SF_UnSDP();
XBYTE[i + nAdr] = cData;
Check_Toggle_Bit(i + nAdr);
bOK = XBYTE[i + nAdr] == cData;
if(!bOK)
cCountOfErr++;
}
FLASH_CS = gbSFNoInUse = true;
bOK = cCountOfErr == 0x00;
return bOK ;
}
void Check_Toggle_Bit(unsigned int nAdr)
{
bool Loop = true;
unsigned char PreData;
unsigned char CurrData;
unsigned int TimeOut = 0;
PreData = XBYTE[nAdr];
PreData = PreData & 0x40;
while ((TimeOut < 65530 ) && (Loop))
{
CurrData = XBYTE[nAdr]; // 修改XBYTE[0]
CurrData = CurrData & 0x40;
if (PreData == CurrData)
Loop = false;
PreData = CurrData;
//WDTReflash(); // 增加软狗
TimeOut++;
}
}
bool SF_ErasePage(unsigned int nPage)
{
unsigned int nAdr;
nAdr = SF_SetAdr(nPage);
FLASH_CS = gbSFNoInUse = false;
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[0x555] = 0x80;
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[nAdr] = 0x20;
DelayNms(25); // 25mS
//Check_Toggle_Bit();
FLASH_CS = gbSFNoInUse = true;
return true;
}
/*bool SF_ChipErase()
{
FLASH_CS = gbSFNoInUse = false;
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[0x555] = 0x80;
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[nAdr] = 0x10;
FLASH_CS = gbSFNoInUse = true;
DelayNms(100); // 100mS
EnRegExRam();
return true;
}*/
// ----------------------------------------- t e s t -------------------------------------------------
/*bool SF_WriteByte(unsigned int nPage, unsigned char cAdr, unsigned char cData,unsigned char *cTemp)
{
unsigned int nAdr;
unsigned int xdata nn;
nAdr = SF_SetAdr(nPage);
nn = nAdr;
nAdr += cAdr;
FLASH_CS = gbSFNoInUse = false;
SF_ErasePage(nPage);
XBYTE[0x555] = 0xaa;
XBYTE[0x2aa] = 0x55;
XBYTE[0x555] = 0xa0;
_nop_(); _nop_();
XBYTE[nAdr] = cData;
Check_Toggle_Bit(nAdr);
FLASH_CS = gbSFNoInUse = true;
_nop_(); _nop_();
SF_Read(nPage,nn,cTemp,8);
// if(XBYTE[nAdr] == cData)
// return true;
// else
return false;
}*/
//-------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -