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

📄 at45dbflash.c

📁 通过软件模拟SPI协议对存储器AT45DB进行读写函数
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include	"..\Include\FLASHDEF.h"

/*************************************************/
//at45db041 分为2048页,每页264个字节    总共4M BIT
//缓冲区 sram的大小   2个264字节的缓冲
/*************************************************/
#define nop()  _nop_();_nop_();_nop_();_nop_()
/********************************************************************/
//us 延时函数
extern void Delay10us(unsigned char time);
 

void AT45DB_FlashStart()
{
	CS=1;
	SI=1;
	SO=1;
	SCK=0;	
}
/********************************************************************/
/********************************************************************/
unsigned char  AT45DB_FlashByteWR()
{
	unsigned char  xdata  i,temp=0;
	for(i=0;i<8;i++)
	{		
		nop();
		SCK=1;
		nop();		
		SCK=0;	
		nop();	
		temp=temp<<1;
		if( SO )
			temp |=0x01;
		else
			temp  &=~0x01;
	}
	return temp;
}
/********************************************************************/
/********************************************************************/
void AT45DB_FlashByteRD(unsigned char ch)
{
	unsigned char  xdata  i,out=ch;
	SCK=0;
	nop();
	for(i=0;i<8;i++)
	{
		if(out&0x80)SI=1;
		else SI=0;
		nop();
		SCK=1;
		out=out<<1;
		nop();
		SCK=0;
		nop();
	}
}

/********************************************************************/
//读寄存器
/********************************************************************/
unsigned char AT45DB_Read_Reg()							//读状态寄存器
{
	unsigned char xdata temp;
   	CS=1;
	CS=0;
	nop();
	AT45DB_FlashByteRD(0x57);
	temp = AT45DB_FlashByteWR();
	CS=1;
	return temp;
}

/********************************************************************/
unsigned char Flash_Init(unsigned int ChipAddr, unsigned char *PageCount, unsigned char *ChipCount)
{
	unsigned char FlashType;
	ChipAddr  = ChipAddr;
	ChipCount = ChipCount;
	AT45DB_FlashStart();
	FlashType = AT45DB_Read_Reg();
	if( (FlashType & 0xbe) == 0x9c )		//if( (FlashType & 0xbc) == 0x9c )//0xb8 //0x98
		*PageCount=2048;		//041
	else if( (FlashType & 0xb8) == 0xa0 ) // else if( (FlashType & 0xbc) == 0xa4 )
		*PageCount=4096;		//081
	else
		return 1;
	return 0; 
}

/********************************************************************/
//缓存1读
/********************************************************************/ 
void AT45DB_Read_Rem1(unsigned char *rom_buf,unsigned char addr,unsigned int len)
{
	unsigned int xdata i;
	unsigned char xdata RCMD[4]; //命令寄存器 
	CS=1;
	CS=0;
	nop();
	RCMD[0]=0x54;									//读缓存1
	RCMD[1]=0x00;
	RCMD[2]=addr>>8;
	RCMD[3]=addr&0xff;
	for(i=0;i<4;i++)
		AT45DB_FlashByteRD(RCMD[i]);
	AT45DB_FlashByteRD(0xff);
	for(i=0;i<len;i++)
		rom_buf[i] = AT45DB_FlashByteWR();
	CS=1;
}
/********************************************************************/
//缓存1写
/********************************************************************/ 
void AT45DB_Write_Rem1(unsigned char *rom_buf,unsigned char addr,unsigned int len)
{
 	unsigned int  xdata  i;
	unsigned char  xdata  RCMD[4]; //命令寄存器 
	CS=1;
	CS=0;
	nop();
	RCMD[0]=0x84;									//写缓存1
	RCMD[1]=0x00;
	RCMD[2]=addr>>8;
	RCMD[3]=addr&0xff;
	for(i=0;i<4;i++)
		AT45DB_FlashByteRD(RCMD[i]);
	for(i=0;i<len;i++)
		AT45DB_FlashByteRD(rom_buf[i]);
	CS=1;
}

/********************************************************************/
//一页的数据从内存转到缓冲1
/********************************************************************/ 
void AT45DB_Rom_Rem1(unsigned int page)
{
	unsigned int xdata i;
	unsigned char xdata RCMD[4]; //命令寄存器 
	CS=1;
	CS=0;
	nop();
	RCMD[0]=0x53;									//主存储区到缓存1
	RCMD[1]=page>>7;
	RCMD[2]=(page<<1)&0xFF;
	for(i=0;i<4;i++)
		AT45DB_FlashByteRD(RCMD[i]);
	CS=1;
}


/********************************************************************/
//带擦除的缓冲1到页的编程
/********************************************************************/ 
void AT45DB_Rem1_Rom(unsigned int page)
{
	unsigned int xdata  i;
	unsigned char  xdata  RCMD[4]; //命令寄存器 
	CS=1;
	CS=0;
	nop();
	RCMD[0]=0x83;									//缓存1到主存储区
	RCMD[1]=page>>7;
	RCMD[2]=(page<<1)&0xFF;
	for(i=0;i<4;i++)AT45DB_FlashByteRD(RCMD[i]);
	CS=1;
}


/********************************************************************/
 //页与缓存1比较,比较结果在状态寄存器第6位
/********************************************************************/ 
 void AT45DB_Compare_Rem1(unsigned int page)		
{
    unsigned char xdata  i;
	unsigned char  xdata  RCMD[4]; //命令寄存器 
	CS=1;
	CS=0;
	nop();
	RCMD[0]=0x60;										//主存储区到缓存1的比较
	RCMD[1]=page>>7;
	RCMD[2]=(page<<1)&0xFF;
	for(i=0;i<4;i++)
		AT45DB_FlashByteRD(RCMD[i]);
	CS=1;
} 

/********************************************************************/
 //一个有8页的块可以一次被擦除,操作在写大量数据到设备时节约时间
/********************************************************************/ 

void AT45DB_Block_Erase(unsigned int page)
{
	unsigned char idata  i;
	unsigned char  idata  RCMD[4]; //命令寄存器 
	CS=1;
	CS=0;
	nop();
 	RCMD[0]=0x50;
	RCMD[1]=page>>7;
	RCMD[2]=(page<<1)&0xFF;
	for(i=0;i<4;i++)
		AT45DB_FlashByteRD(RCMD[i]);
	CS=1;
}
/********************************************************************/
 //擦除内存中的任何一页,为不带擦除的缓冲到页的编程作准备
/********************************************************************/ 

#ifndef FLASH_DIS_ERASESECTOR
void AT45DB_Clear_Page(unsigned int page)
{
 	unsigned char xdata  i;
	unsigned char  xdata  RCMD[4]; //命令寄存器 
	CS=1;
	CS=0;
	nop();
	RCMD[0]=0x81;										//页擦除
	RCMD[1]=page>>7;
	RCMD[2]=(page<<1)&0xFF;
	for(i=0;i<4;i++)AT45DB_FlashByteRD(RCMD[i]);
	CS=1;
}
#endif
 
/********************************************************************/ 
/********************************************************************/  
#ifdef FLASH_EN_ALLEraseChip
void Flash_EraseEntirChip(unsigned int ChipAddr)
{
	unsigned char page;
	ChipAddr=0;
	for(page=0;page<ALLPAGE;page+=8)
		AT45DB_Block_Erase( page);
}
#endif

/********************************************************************/  
#ifndef FLASH_DIS_ERASESECTOR
void Flash_EraseOneSector(unsigned char page,unsigned int ChipAddr)	
{
	AT45DB_Clear_Page(page);
	ChipAddr=0;
}
#endif

/********************************************************************/  
void Flash_ProgramData (unsigned char *bytedata, unsigned char page,unsigned  int addr, unsigned int len,unsigned int ChipAddr)
{
	ChipAddr = ChipAddr;
	AT45DB_Rom_Rem1(page);
	Delay10us(5);
	AT45DB_Compare_Rem1(page);
	while((AT45DB_Read_Reg() & 0x80) == 0x00)	//设备已空闲,
		;
	Delay10us(5);
	AT45DB_Write_Rem1(bytedata,addr,len);	
	Delay10us(5);
	AT45DB_Rem1_Rom(page);
}

/********************************************************************/  
void Flash_ReadData (unsigned char *bytedata, unsigned char page,unsigned  int addr, unsigned int len,unsigned int ChipAddr)
{
	ChipAddr = ChipAddr;
	AT45DB_Rom_Rem1(page);
	Delay10us(5);
	AT45DB_Read_Rem1(bytedata,addr,len);
}

⌨️ 快捷键说明

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