📄 at45db021.c
字号:
#include "AT45DB021.h"
#include <iom8.h>
#include <macros.h>
#include "M8Demo.h"
#include "Uart.h"
void SPI_MOSI(unsigned char flag)
{
if(flag)
PORTC|=0x02;
else
PORTC&=0x7D;
}
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|=0x01;
else
PORTC&=0x7E;
}
void SPI_Start(void)
{
DDRC|=0x7F;
DDRC&=0x7B;
PORTC=0x7F;
//Delay(100);
SPI_CS(1);
SPI_SCK(1);
SPI_MOSI(1);
SPI_CS(0);
}
void SPI_End(void)
{
DDRC|=0x7F;
DDRC&=0x79;
Delay(100);
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--)
{ Delay(DELAYTIMER );
SPI_SCK(0);
Delay(DELAYTIMER );
if((Send_data&0x80)==0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
Send_data=Send_data<<1;
Delay(DELAYTIMER );
SPI_SCK(1);
}
Delay(DELAYTIMER );
}
unsigned char SPI_Receive8BitData(void)
{
unsigned char i,receivedata;
receivedata=0;
for(i=0;i<7;i++)
{
Delay(DELAYTIMER );
SPI_SCK(0);
Delay(DELAYTIMER );
SPI_SCK(1);
Delay(DELAYTIMER );
if(SPI_MISO())
receivedata|=0x01;
receivedata=receivedata<<1;
}
Delay(DELAYTIMER );
SPI_SCK(0);
Delay(DELAYTIMER );
SPI_SCK(1);
Delay(DELAYTIMER );
if(SPI_MISO())
receivedata|=0x01;
Delay(DELAYTIMER );
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(5000);
}
}
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(100);
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(100);
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(100);
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
SPI_End();//disable spi
Delay(100);
}
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();
SPI_End();//disable spi
Delay(100);
}
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
SPI_End();//disable spi
Delay(100);
}
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
Delay(1000);
for(i=0;i<datalength;i++)
Read_data[i]=SPI_Receive8BitData();
SPI_End();//disable spi
Delay(100);
}
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();
SPI_End();//disable spi
Delay(100);
}
void WriteBlock(unsigned char Block_Add,unsigned char Block_Data)
{
unsigned char write_data[Buffer_Size];
unsigned char i;
for(i=0;i<Buffer_Size;i++)
write_data[i]=Block_Data;
//PutStr("write Data");
//PutInt(write_data[0]);
//EasingBlock(Block_Add);
WriteToBuffer( write_data,Buffer_Size, BUFFER_1, 0);
Delay(100);
//ReadBuffer(write_data,Buffer_Size, BUFFER_1,0);
//Delay(100);
//Block_Data=write_data[0];
//PutStr("Read Data");
//PutInt(Block_Data);
for(i=0;i<8;i++)
{
WriteToMemory(Block_Add*8+i, B1_TO_MM_PAGE_PROG_WITH_ERASE);
Delay(10000);
}
}
unsigned char ReadBlock(unsigned char Block_Add)
{
unsigned char Read_data[Buffer_Size];
unsigned int i,n,tempdata;
//MemoryToBuffer(Block_Add*8, BUFFER_1);
//Delay(100);
//ReadBuffer(Read_data,Buffer_Size, BUFFER_1,0);
//Delay(100);
MemoryPageRead(Read_data, Buffer_Size, Block_Add*8, 0);
tempdata=Read_data[0];
//PutStr("Read Block Addr");
//PutInt(Block_Add);
//PutInt(tempdata);
for(n=0;n<Buffer_Size;n++)
{
if(Read_data[i]!=tempdata)
{
PutStr("Error Address");
PutInt(i);
PutStr("Error Data");
PutInt(Read_data[i]);
Delay(100);
return 0x55;
}
}//if(Read_data[i]!=tempdata)
//return 0x55;
for(i=1;i<8;i++)
{
MemoryPageRead(Read_data, Buffer_Size, Block_Add*8+i, 0);
//Delay(10000);
for(n=0;n<Buffer_Size;n++)
if(Read_data[i]!=tempdata)
{
PutStr("Error Page");
PutInt(Block_Add*8+i);
PutStr("Error Address");
PutInt(n);
PutStr("Error Data");
PutInt(Read_data[i]);
Delay(100);
return 0x55;
}
}
Delay(100);
return tempdata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -