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

📄 flash.c

📁 c8051f020微处理器与时钟PCF563
💻 C
字号:
#include <flash.h>

uchar xdata FlashBuf[FlashBufLen];
/*Write Enable (WREN) Instruction*/
void FlashWE(void)
{
	FlashCS = 0;
	_nop_();
	SPIF = 0;
	SPI0DAT = WREN;
	while(SPIF==0);
	SPIF = 0;
	FlashCS = 1;
}

/*Write Disable (WRDI) Instruction Sequence*/
void FlashWD(void)
{
	FlashCS = 0;
	_nop_();
	SPIF = 0;
	SPI0DAT = WRDI;
	while(SPIF==0);
	SPIF = 0;
	FlashCS = 1;
}

/*Read Status Register (RDSR) Instruction Sequence and Data-Out Sequence*/
/*Status Register :bit7-2 non-used; bit1 WEL(write enable latch); bit0 WIP(write in progress)*/
uchar FlashRDSR(void)
{
	uchar idata temp;
	FlashCS = 0;
	_nop_();
	SPIF = 0;
	SPI0DAT = RDSR;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = 0x00;
	while(SPIF==0);
	SPIF = 0;
	temp = SPI0DAT;
	FlashCS = 1;
	return temp;
}

/*Read Data Bytes (READ) Instruction Sequence and Data-Out Sequence*/
void FlashRDB(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf)
{
	uchar idata temp, i;
	FlashCS = 0;
	_nop_();
	/*write READ instruction*/
	SPIF = 0;
	SPI0DAT = READ;
	while(SPIF==0);
	SPIF = 0;

	/*write start address 23-0*/
	SPI0DAT = (PageAdr>>8)&0x0F;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = PageAdr;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = Colum;
	while(SPIF==0);
	SPIF = 0;

	/*read bytes*/
	for(i=0;i<length;i++)
	{
		SPI0DAT = 0x00;
		while(SPIF==0);
		SPIF = 0;
		temp = SPI0DAT;
		*(FlashBuf+i) = temp;
	}
	FlashCS = 1;
}

/*Read Data Bytes at Higher Speed (FAST_READ) Instruction Sequence and Data-Out Sequence*/
void FlashReadFast(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf)
{
	uchar idata temp, i;
	FlashCS = 0;
	_nop_();
	/*write READ instruction*/
	SPIF = 0;
	SPI0DAT = FAST_READ;
	while(SPIF==0);
	SPIF = 0;
	/*write 1 dummy byte*/
	SPI0DAT = 0x00;
	while(SPIF==0);
	SPIF = 0;

	/*write start address 23-0*/
	SPI0DAT = (PageAdr>>8)&0x0F;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = PageAdr;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = Colum;
	while(SPIF==0);
	SPIF = 0;

	/*read bytes*/
	for(i=0;i<length;i++)
	{
		SPI0DAT = 0x00;
		while(SPIF==0);
		SPIF = 0;
		temp = SPI0DAT;
		*(FlashBuf+i) = temp;
	}
	FlashCS = 1;
}

/*Page Write (PW) Instruction Sequence*/
void FlashPW(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf)
{
	uchar idata temp, i;
	FlashCS = 0;
	_nop_();
	/*write READ instruction*/
	SPIF = 0;
	SPI0DAT = PW;
	while(SPIF==0);
	SPIF = 0;

	/*write start address 23-0*/
	SPI0DAT = (PageAdr>>8)&0x0F;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = PageAdr;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = Colum;
	while(SPIF==0);
	SPIF = 0;

	/*read bytes*/
	for(i=0;i<length;i++)
	{
		temp = *(FlashBuf+i);
		SPI0DAT = temp;
		while(SPIF==0);
		SPIF = 0;
	}
	FlashCS = 1;

	/*read status register, waiting for WIP=0*/
	while((FlashRDSR()&0x01)==1);
}

/*Page Erase (PE) Instruction Sequence*/
void FlashPE(uint PageAdr, uchar Colum)
{
	FlashCS = 0;
	_nop_();
	/*write READ instruction*/
	SPIF = 0;
	SPI0DAT = PE;
	while(SPIF==0);
	SPIF = 0;

	/*write start address 23-0*/
	SPI0DAT = (PageAdr>>8)&0x0F;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = PageAdr;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = Colum;
	while(SPIF==0);
	SPIF = 0;

	/*read status register, waiting for WIP=0*/
	while((FlashRDSR()&0x01)==1);
}

/*Sector Erase (SE) Instruction Sequence*/
void FlashSE(uint PageAdr, uchar Colum)
{
	FlashCS = 0;
	_nop_();
	/*write READ instruction*/
	SPIF = 0;
	SPI0DAT = SE;
	while(SPIF==0);
	SPIF = 0;

	/*write start address 23-0*/
	SPI0DAT = (PageAdr>>8)&0x0F;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = PageAdr;
	while(SPIF==0);
	SPIF = 0;
	SPI0DAT = Colum;
	while(SPIF==0);
	SPIF = 0;

	/*read status register, waiting for WIP=0*/
	while((FlashRDSR()&0x01)==1);
}

⌨️ 快捷键说明

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