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

📄 at45081.c

📁 这是新华龙(www.xhl.xom.xn)开发的
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "c8051f020.h"                 // SFR declarations
#include <stdio.h>
#include "TCPIP.h" 
#include "serial.h"

sbit   P20 = P2^0;
sbit   P21 = P2^1;
sbit   P22 = P2^2;
sbit   P23 = P2^3;
sbit   P24 = P2^4;
sbit   P25 = P2^5;
sbit   P26 = P2^6;
sbit   P27 = P2^7;
sbit 	P37 = P3^7;


#define DF_RESET 		P5 &= ~(0x1);	P5 |= 0x1;	// P50 DataFlash reset port pin (P20)
//#define DF_RDY_BUSY 	while(!(P4&0x10));		// P44 DataFlash ready/busy status port pin (P21)
#define DF_RDY_BUSY		P37=1; while(!(P3&0x80));		//P37 DataFlash rea
//#define DF_WRITE_PROTECT P51 	// DataFlash boot sector write protection (P22)
#define DF_CHIP_SELECT 	P5 &= ~(0x8); 	// P53 DataFlash chip select port pin (P23)
#define DF_CHIP_NOSELECT 	P5 |= 0x8; 	// P53 DataFlash chip select port pin (P23)

#define R8019_CHIP_SELECT 	ES0=0;P4 = 0xF8; 
#define RAM_CHIP_SELECT_BANK0 	ES0=1;P4 = 0xF4; 	
#define RAM_CHIP_SELECT_BANK1 	P4 = 0xF5; 	


#define BUFFER_1 0x00 			// buffer 1
#define BUFFER_2 0x01 			// buffer 2

#define BUFFER_1_WRITE 0x84 	// buffer 1 write
#define BUFFER_2_WRITE 0x87 	// buffer 2 write

#define BUFFER_1_READ  0x54		// buffer 1 read (change to 0xD4 for SPI mode 0,3)
#define BUFFER_2_READ  0x56		// buffer 2 read (change to 0xD6 for SPI mode 0,3)
#define B1_TO_PAGE_WITH_ERASE 0x83 		// buffer 1 to main memory page program with built-in erase
#define B2_TO_PAGE_WITH_ERASE 0x86 		// buffer 2 to main memory page program with built-in erase
#define B1_TO_PAGE_WITHOUT_ERASE 0x88 	// buffer 1 to main memory page program without built-in erase
#define B2_TO_PAGE_WITHOUT_ERASE 0x89 	// buffer 2 to main memory page program without built-in erase
#define PAGE_PROG_THROUGH_B1 0x82 		// main memory page program through buffer 1
#define PAGE_PROG_THROUGH_B2 0x85 		// main memory page program through buffer 2
#define AUTO_PAGE_REWRITE_THROUGH_B1 0x58 // auto page rewrite through buffer 1
#define AUTO_PAGE_REWRITE_THROUGH_B2 0x59 // auto page rewrite through buffer 2
#define PAGE_TO_B1_COMP 0x60 	// main memory page compare to buffer 1
#define PAGE_TO_B2_COMP 0x61 	// main memory page compare to buffer 2
#define PAGE_TO_B1_XFER 0x53 	// main memory page to buffer 1 transfer
#define PAGE_TO_B2_XFER 0x55 	// main memory page to buffer 2 transfer
// DataFlash status register for reading density, compare status,
// and ready/busy status (change to 0xD7 for SPI mode 0,3)
#define STATUS_REGISTER 0x57
#define MAIN_MEMORY_PAGE_READ 0x52 // main memory page read (change to 0xD2 for SPI mode 0,3)
#define PAGE_ERASE 0x81 	// erase a 528 byte page
#define BLOCK_ERASE 0x50 	// erase 512 pages

unsigned int AT450XXPageAddr;


void SendSPIByte(unsigned char ch)
{
		SPIF = 0;
		SPI0DAT = ch;
		while (SPIF == 0);	 // wait for data transfer to be completed   				       	
} 

unsigned char GetSPIByte(void)
{
        SPIF = 0;
		SPI0DAT = 0;
		while (SPIF == 0);
		return  SPI0DAT;                   // read data from SPI
}

/*整片擦除*/          //081 total 256 block  16sector per block 
void ErasingDataFlash(void)    //081 total 512 block  16sector per block
{
unsigned int block_counter = 0;
	DF_RDY_BUSY; 		// check if flash is busy
	while (block_counter < 512)
	{
	  	DF_CHIP_SELECT;                          // select DataFlash
		SendSPIByte(BLOCK_ERASE);				//0x50 erase 512 pages
		SendSPIByte((char)(block_counter>>4));    //r r r PA11 PA10 PA9 PA8 PA7 
		SendSPIByte((char)(block_counter<<4));     //PA6 PA5 PA4 PA3 X X X   0
		SendSPIByte(0x00); 
	  	DF_CHIP_NOSELECT;                          // unselect DataFlash
		block_counter++;
		DF_RDY_BUSY; // wait until block is erased
	}
}
//页擦除
void EraseFlashPage(void) 
{
		DF_RDY_BUSY; 		// check if flash is busy
	  	DF_CHIP_SELECT; 
        SendSPIByte(PAGE_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr>>7));
        SendSPIByte((unsigned char)(AT450XXPageAddr<<1));
        SendSPIByte(0x00);
	  	DF_CHIP_NOSELECT;
}
//读缓存
void FlashBuffer1Read(unsigned int star_addr,unsigned int len, unsigned char *buffer) //从缓冲区1的指定位置(0-263)中读入指定字节
{                                       
       unsigned int i;
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT; 			// enable DataFlash
		SendSPIByte(BUFFER_1_READ);		//缓冲区1为54H  缓冲区2为56H
		SendSPIByte(0);
		SendSPIByte((unsigned char)(star_addr>>8));
		SendSPIByte((unsigned char)star_addr);
		SendSPIByte(0);
		for (i=0;i<len;i++)
		{
   			buffer[i] = GetSPIByte();                   // read data from SPI
	    }
       	DF_CHIP_NOSELECT;
}
//读缓存
void FlashBuffer2Read(unsigned int star_addr,unsigned int len, unsigned char *buffer) //从缓冲区2的指定位置(0-263)中读入指定字节
{                                       
       unsigned int i;
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT; 			// enable DataFlash
		SendSPIByte(BUFFER_2_READ);		//缓冲区1为54H  缓冲区2为56H
		SendSPIByte(0);
		SendSPIByte((unsigned char)(star_addr>>8));
		SendSPIByte((unsigned char)star_addr);
		SendSPIByte(0);
		for (i=0;i<len;i++)
		{
   			buffer[i] = GetSPIByte();                   // read data from SPI
	    }
       	DF_CHIP_NOSELECT;
}
//写缓存
void FlashBuffer1Write(unsigned int start_addr, unsigned int len,unsigned char *buffer) //向缓冲区1的指定位置(0-263)写入指定字节
{
   		unsigned char  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为84H  缓冲区2为87H
		SendSPIByte(BUFFER_1_WRITE);
   		SendSPIByte(0x00);
   		SendSPIByte((unsigned char)(start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}
//写缓存
void FlashBuffer2Write(unsigned int start_addr, unsigned int len,unsigned char *buffer) //向缓冲区2的指定位置(0-263)写入指定字节
{
   		unsigned char  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为84H  缓冲区2为87H
		SendSPIByte(BUFFER_2_WRITE);
   		SendSPIByte(0x00);
   		SendSPIByte((unsigned char)(start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}
//读取状态
unsigned char GetFlashStatus() //读Flash当前状态Bit7=1:空闲 0:忙 Bit6=1:比较结果不匹配 0:匹配 Bit5Bit3Bit2:芯片标志 100:081 
{
        unsigned char idata ret;
		DF_CHIP_SELECT;
        SendSPIByte(STATUS_REGISTER);
        ret=GetSPIByte();
        DF_CHIP_NOSELECT;
        return ret;
}
//读主存至缓存
void PageToBuffer1(void)	 //从Flash读一页至缓存1
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT; 		// enable DataFlash
		SendSPIByte(PAGE_TO_B1_XFER); // transfer next page to buffer1
		SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
		SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
		SendSPIByte(0);				
		DF_CHIP_NOSELECT;
}
//读主存至缓存
void PageToBuffer2(void)    //从Flash读一页至缓存2
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT; 		// enable DataFlash
		SendSPIByte(PAGE_TO_B2_XFER); // transfer next page to buffer1
		SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
		SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
		SendSPIByte(0);				
		DF_CHIP_NOSELECT;
}
//缓存写主存
void FlashBuffer1ProgNoErase(void)  //直接将缓存1写入Flash一页(不擦除)
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT;
		SendSPIByte(B1_TO_PAGE_WITHOUT_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}
//缓存写主存
void FlashBuffer2ProgNoErase(void) //直接将缓存2写入Flash一页(不擦除)
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT;
		SendSPIByte(B2_TO_PAGE_WITHOUT_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}
//擦除+缓存写主存
void FlashBuffer1ProgAutoErase(void) //直接将缓存1写入Flash一页(先擦除)
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT;
		SendSPIByte(B1_TO_PAGE_WITH_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}

//擦除+缓存写主存
void FlashBuffer2ProgAutoErase(void) //直接将缓存2写入Flash一页(先擦除)
{
		DF_RDY_BUSY; 		// check if flash is busy
		DF_CHIP_SELECT;
		SendSPIByte(B2_TO_PAGE_WITH_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
		DF_CHIP_NOSELECT;
}

//写缓存+缓存写主存
void FlashProgViaBuffer1(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存1写入Flash指定位置(不擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为82H  缓冲区2为85H
		SendSPIByte(PAGE_PROG_THROUGH_B1);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}
//写缓存+缓存写主存
void FlashProgViaBuffer2(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存2写入Flash指定位置(不擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为82H  缓冲区2为85H
		SendSPIByte(PAGE_PROG_THROUGH_B2);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer1(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存1写入Flash指定位置(先擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为84H  缓冲区2为87H
		SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B1);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);

⌨️ 快捷键说明

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