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

📄 sa25f020.c

📁 SA25F020 2MFLASH读写程序(SPI总线)
💻 C
字号:
#include<intrins.h>
#include "C8051f.h"
unsigned char bdata SPI_DUMP;
sbit SPI_D7=SPI_DUMP^7;
sbit SPI_D0=SPI_DUMP^0;


void SPI_Write(unsigned char dat)
{
	unsigned char temp;
	SPI_DUMP=dat;
	for(temp=0;temp<8;temp++)
		{

			SSI=SPI_D7;
			SSCK=1;
			SPI_DUMP=SPI_DUMP<<1;
			SSCK=0;
	
		}

}

unsigned char SPI_Read()
{	unsigned char temp;
	for(temp=0;temp<8;temp++)
		{
			
			SSCK=1;
			SPI_DUMP=SPI_DUMP<<1;
			SPI_D0=SSO;
			SSCK=0;
		

		}
	return(SPI_DUMP);
}

unsigned char SA_RDSR()
{	unsigned char temp;
	EA=0;

	SPI_Write(0x05);
	temp=SPI_Read();
	temp=SPI_Read();

	EA=1;
	return(temp);
	

}
void SA_WREN()
{
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	EA=0;

	SPI_Write(0x06);

	EA=1;
}

void SA_WRDI()
{	
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	EA=0;

	SPI_Write(0x04);

	EA=1;

}
void SA_WRSR(unsigned char da)
{
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	EA=0;

	SPI_Write(0x01);
	SPI_Write(da);

	EA=1;

}

void SA_Read(unsigned long addr,unsigned char *ptr,unsigned int size)
{
	unsigned char addr_hh,addr_h,addr_l;
	unsigned int si;
	addr_l=addr&0x0000ff;
	addr_h=(addr&0x00ff00)>>8;
	addr_hh=(addr&0xff0000)>>16;
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	EA=0;

	SPI_Write(0x03);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);
	for(si=0;si<size;si++)
		{
			ptr[si]=SPI_Read();
		}

	EA=1;
}

//ҳд
void SA_PP(unsigned long addr,unsigned char *ptr,unsigned int len)
{
	unsigned char addr_hh,addr_h,addr_l;
	unsigned int si;
	addr_l=addr&0x0000ff;
	addr_h=(addr&0x00ff00)>>8;
	addr_hh=(addr&0xff0000)>>16;
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	SA_WREN();
	EA=0;

	SPI_Write(0x02);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);
	for(si=0;si<len;si++)
		{
			SPI_Write(ptr[si]);
		}

	_nop_();
	_nop_();
	EA=1;
	do{
		if((SA_RDSR()&0x01)==0x01){
			_nop_();
			_nop_();

			}
		else{ break;}
		}while(1);

}

//page erase
void SA_PE(unsigned long addr)
{
	unsigned char addr_hh,addr_h,addr_l;
	addr_l=addr&0x0000ff;
	addr_h=(addr&0x00ff00)>>8;
	addr_hh=(addr&0xff0000)>>16;
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	SA_WREN();
	EA=0;

	SPI_Write(0x81);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);

	EA=1;
}

//Sector erase
void SA_SE(unsigned long addr)
{
	unsigned char addr_hh,addr_h,addr_l;
	addr_l=addr&0x0000ff;
	addr_h=(addr&0x00ff00)>>8;
	addr_hh=(addr&0xff0000)>>16;
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	SA_WREN();
	EA=0;

	SPI_Write(0xd8);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);

	EA=1;
}

// bulk erase

void SA_BE()
{
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	SA_WREN();
	EA=0;

	SPI_Write(0xc7);

	EA=1;

}

//software protection

void SA_SP()
{
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	EA=0;

	SPI_Write(0xb9);

	EA=1;
}
// release from software protect and read ID

unsigned char SA_RSP()
{	unsigned char temp;
	do{
		if((SA_RDSR()&0x01)==0) break;
		}while(1);
	EA=0;

	SPI_Write(0xab);
	SPI_Write(0x00);
	SPI_Write(0x00);
	SPI_Write(0x00);
	temp=SPI_Read();

	EA=1;
	return(temp);
}

unsigned char SA_Write(unsigned long addr,unsigned char *ptr)
{
/*
	unsigned long anum;
	unsigned int SA_temp;
	unsigned char tbuf[256];
		
*/
}

void SA_Init()
{	unsigned char temp;
	SSCK=0;
	SSI=1;
	SSO=1;

	
	SA_WRSR(0x03);
	SA_WREN();
	temp=SA_RSP();
	temp=SA_RDSR();
	temp=SA_RDSR();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -