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

📄 大容量串行false45db081 c51读写源程序.c

📁 串行大容量存储器的c51 读写源程序特点:占用io口线少
💻 C
📖 第 1 页 / 共 2 页
字号:
//DataFlash chip 型号为45DB081

#include <c8051f020.h>                 // SFR declarations
#include <stdio.h>
sbit  P37 = P3^7;
#define SYSCLK 11059200
#define DF_RESET  P5 &= ~(0x1); P5 |= 0x1; // P50 
DataFlash reset port pin (P20)
#define DF_RDY_BUSY P37=1; while(!(P3&0x80)); 
//P37 DataFlash rea
#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
#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]);
DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer2(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为84H  缓冲区2为87H
SendSPIByte(AUTO_PAGE_REWRITE_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;
}
sfr16 DP       = 0x82;                 // data pointer
sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
sfr16 TMR3     = 0x94;                 // Timer3 counter
sfr16 ADC0     = 0xbe;                 // ADC0 data

⌨️ 快捷键说明

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