📄 at45dbflash.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 + -