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

📄 at45db021._c

📁 AVR系列被广泛应用的单片机MEGA8开发(原理图)及例程
💻 _C
字号:
#include "AT45DB021.h"
#include <iom8v.h>
#include <macros.h>
#include "M8Demo.h"
void SPI_MOSI(unsigned char   flag)
{if(flag)
PORTC|=0x02;
else
PORTC&=0xFD;
}
unsigned char   SPI_MISO(void)
{
if ((PINC & 0x04)) 

	return 1;
else
	return 0;

}
void SPI_SCK(unsigned char   flag)
{if(flag)
PORTC|=0x08;
else
PORTC&=0x77;
}
void SPI_CS(unsigned char   flag)
{
if(flag)
PORTC|=0x40;
else
PORTC&=0x3F;
}

void SPI_Start(void)
{
DDRC|=0x4A;
DDRC&=0x4D;
SPI_CS(1);
SPI_SCK(1);
SPI_MOSI(1);
SPI_CS(0);
}
void SPI_End(void)
{
DDRC|=0x7F;
SPI_CS(1);
SPI_SCK(1);
SPI_MOSI(1);
SPI_CS(1);
}
void SPI_Send8BitData(unsigned char Send_data)
{
unsigned char  i;
for(i=8;i>0;i--)
  {
	SPI_SCK(0);
	if((Send_data&0x80)==0x80)
                   SPI_MOSI(1);
	else
                   SPI_MOSI(0);
		    Delay(DELAYTIMER );
	   SPI_SCK(1);
	Send_data=Send_data<<1;
  }	
}
unsigned char SPI_Receive8BitData(void)
{
unsigned char  i,receivedata;
receivedata=0;
for(i=8;i>0;i--)
  {
	SPI_SCK(0);
	if(SPI_MISO())
                 receivedata|=0x01;
		    Delay(DELAYTIMER );
	   SPI_SCK(1);
	 receivedata=receivedata<<1;
  }	
return receivedata;
}


void erasing_flash(void)
{
unsigned int Block_Add = 0;

for (Block_Add=0;Block_Add<Block_Size;Block_Add++)
	{EasingBlock( Block_Add);
         Delay(1000);
}

}


void EasingBlock(unsigned char Block_Add)
{
SPI_Start();//enable spi
SPI_Send8BitData(BLOCK_ERASE ); //send  block erase command
SPI_Send8BitData((char)(Block_Add>>4) );//send block address MSB PA9 PA8 PA7 
SPI_Send8BitData((char)(Block_Add<<4 ));//send block address LSB PA6 ... PA3
SPI_Send8BitData(0x00); //do not  care
Delay(1000);
SPI_End();//disable spi
}

void EasingPage(unsigned int Page_Add)
{

SPI_Start();//enable spi
SPI_Send8BitData(PAGE_ERASE ); //send  page erase command
SPI_Send8BitData((char)(Page_Add>>7));//send block address MSB PA9 PA8 PA7 
SPI_Send8BitData((char)(Page_Add<<1));//send block address LSB PA6 ... PA0
SPI_Send8BitData(0x00); //do not  care
Delay(1000);
SPI_End();//disable spi
}

void WriteToBuffer(unsigned char * write_data,unsigned int datalength,unsigned char BufferSelect,unsigned int Buff_add)
{
unsigned int  i;
SPI_Start();//enable spi
switch( BufferSelect  ) 
	{case BUFFER_1: SPI_Send8BitData(BUFFER_1_WRITE );break;
	case BUFFER_2: SPI_Send8BitData(BUFFER_2_WRITE );break;
	default: return;
	}
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData((char)(Buff_add>>8));//send block address MSB BA8
SPI_Send8BitData((char)(Buff_add));//send block address LSB BA7 ... BA0
for(i=0;i<datalength;i++)
SPI_Send8BitData(write_data[i]); //write data
Delay(1000);
SPI_End();//disable spi
}


void WriteToMemory(unsigned int Page_Add,unsigned char WriteFlag)
{

SPI_Start();//enable spi
switch(WriteFlag)
{case B1_TO_MM_PAGE_PROG_WITH_ERASE:
	      SPI_Send8BitData(B1_TO_MM_PAGE_PROG_WITH_ERASE ); 
	      break;
  case B2_TO_MM_PAGE_PROG_WITH_ERASE:
	      SPI_Send8BitData(B2_TO_MM_PAGE_PROG_WITH_ERASE ); 
  		break;
  case B1_TO_MM_PAGE_PROG_WITHOUT_ERASE:
	      SPI_Send8BitData(B1_TO_MM_PAGE_PROG_WITHOUT_ERASE ); 
  		break;
  case  B2_TO_MM_PAGE_PROG_WITHOUT_ERASE:
	      SPI_Send8BitData(B2_TO_MM_PAGE_PROG_WITHOUT_ERASE ); 
  		break;
  default:break;
}

SPI_Send8BitData((char)(Page_Add>>7));//send block address MSB PA9 PA8 PA7 
SPI_Send8BitData((char)(Page_Add<<1));//send block address LSB PA6 ... PA0
SPI_Send8BitData(0x00); //do not  care
Delay(1000);
SPI_End();//disable spi

}
void ReadBuffer(unsigned char * Read_data,unsigned int datalength,unsigned char BufferSelect,unsigned int Buff_add)
{
unsigned int i;
SPI_Start();//enable spi
switch( BufferSelect  ) 
	{case BUFFER_1: SPI_Send8BitData(BUFFER_1_READ );break;
	  case BUFFER_2: SPI_Send8BitData(BUFFER_2_READ );break;
	 default: return;
	}
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData((char)(Buff_add>>8));//send block address MSB BA8
SPI_Send8BitData((char)(Buff_add));//send block address LSB BA7 ... BA0
SPI_Send8BitData(0x00); //do not  care
for(i=0;i<datalength;i++)
Read_data[i]=SPI_Receive8BitData();
Delay(1000);
SPI_End();//disable spi
}

void MemoryToBuffer(unsigned int Page_add,unsigned char BufferSelect )
{
unsigned int i;
SPI_Start();//enable spi
switch( BufferSelect  ) 
	{case BUFFER_1: SPI_Send8BitData(MM_PAGE_TO_B1_XFER );break;
	  case BUFFER_2: SPI_Send8BitData(MM_PAGE_TO_B2_XFER );break;
	 default: return;
	}
SPI_Send8BitData((char)(Page_add >> 7));
SPI_Send8BitData((char)(Page_add << 1));
SPI_Send8BitData(0x00); //do not  care
Delay(1000);
SPI_End();//disable spi

}

void  MemoryPageRead(unsigned char * Read_data,unsigned int datalength,unsigned int Page_add,unsigned int in_page_add)
{
unsigned int i, tempdata;
SPI_Start();//enable spi
SPI_Send8BitData(MAIN_MEMORY_PAGE_READ );
SPI_Send8BitData((char)(Page_add >> 7));
tempdata=(in_page_add>>8);
tempdata&=0x01;
tempdata|=(Page_add << 1);
SPI_Send8BitData((char)tempdata);
SPI_Send8BitData((char)(in_page_add));//send block address LSB BA7 ... BA0
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData(0x00); //do not  care
for(i=0;i<datalength;i++)
Read_data[i]=SPI_Receive8BitData();
Delay(1000);
SPI_End();//disable spi

}

void  ContinuousArraryRead(unsigned char * Read_data,unsigned int datalength,unsigned int Page_add,unsigned int in_page_add)
{
unsigned int i, tempdata;
SPI_Start();//enable spi
SPI_Send8BitData(Continuous_Array_Read );
SPI_Send8BitData((char)(Page_add >> 7));
tempdata=(in_page_add>>8);
tempdata&=0x01;
tempdata|=(Page_add << 1);
SPI_Send8BitData((char)tempdata);
SPI_Send8BitData((char)(in_page_add));//send block address LSB BA7 ... BA0
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData(0x00); //do not  care
SPI_Send8BitData(0x00); //do not  care
for(i=0;i<datalength;i++)
Read_data[i]=SPI_Receive8BitData();
Delay(1000);
SPI_End();//disable spi

}
void WriteBlock(unsigned char Block_Add,unsigned char Block_Data)
{unsigned char * write_data;
unsigned char i;
for(i=0;i<Buffer_Size;i++)
write_data[i]=Block_Data;
EasingBlock(Block_Add);
WriteToBuffer( write_data,Buffer_Size, BUFFER_1, 0);
for(i=0;i<8;i++)
WriteToMemory(Block_Add*8+i, B1_TO_MM_PAGE_PROG_WITHOUT_ERASE);
}

unsigned char  ReadBlock(unsigned char Block_Add)
{
unsigned char * Read_data;
unsigned char i,n,tempdata;

MemoryPageRead(Read_data, Buffer_Size, Block_Add*8, 0);
tempdata=Read_data[0];
for(n=0;n<Buffer_Size;n++)
if(Read_data[i]!=tempdata)
	return 0x55;


for(i=1;i<8;i++)
{
MemoryPageRead(Read_data, Buffer_Size, Block_Add*8+i, 0)
for(n=0;n<Buffer_Size;n++)
if(Read_data[i]!=tempdata)
	return 0x55;
}

return tempdata;
}

⌨️ 快捷键说明

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