⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sst29sf040.c

📁 51单片机读写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 + -