📄 at45081.c
字号:
#include "c8051f020.h" // SFR declarations
#include <stdio.h>
#include "TCPIP.h"
#include "serial.h"
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit P37 = P3^7;
#define DF_RESET P5 &= ~(0x1); P5 |= 0x1; // P50 DataFlash reset port pin (P20)
//#define DF_RDY_BUSY while(!(P4&0x10)); // P44 DataFlash ready/busy status port pin (P21)
#define DF_RDY_BUSY P37=1; while(!(P3&0x80)); //P37 DataFlash rea
//#define DF_WRITE_PROTECT P51 // DataFlash boot sector write protection (P22)
#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
// DataFlash status register for reading density, compare status,
// and ready/busy status (change to 0xD7 for SPI mode 0,3)
#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]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -