📄 at45db081.c
字号:
#include "at45db081.h"
void SendSPIByte(uchar ch)//finish
{
SPIF = 0;
SPI0DAT = ch;
while (SPIF == 0); // wait for data transfer to be completed
}
uchar GetSPIByte(void)//finish
{
SPIF = 0;
SPI0DAT = 0;
while (SPIF == 0);
return SPI0DAT; // read data from SPI
}
/*
BUFFER_1_READ
BUFFER_2_READ
*/
void FlashBufferRead(uint addr, uchar choice, uint len, uchar * buffer)//finish
{
uint i;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte(0);
SendSPIByte((uchar)(addr>>8));
SendSPIByte((uchar)addr);
SendSPIByte(0);
for(i=0;i<len;i++)
buffer[i]=GetSPIByte();
DF_CHIP_NOSELECT
}
/*
BUFFER_1_WRITE
BUFFER_2_WRITE
*/
void FlashBufferWrite(uint addr, uchar choice, uint len, uchar * buffer)//finish
{
uint i;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte(0);
SendSPIByte((uchar)(addr>>8));
SendSPIByte((uchar)addr);
for(i=0;i<len;i++)
SendSPIByte(buffer[i]);
DF_CHIP_NOSELECT
}
uchar ReadStatus()//finish
{
uchar status;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(STATUS_REGISTER);
status=GetSPIByte();
DF_CHIP_NOSELECT
return status;
}
/*
PAGE_TO_B1_XFER
PAGE_TO_B2_XFER
*/
void PageToBuffer(uchar choice,uint page)//finish
{
//DF_RDY_BUSY
uchar status;
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte((uchar)(page>>7));
SendSPIByte((uchar)(page<<1));
SendSPIByte(0);
DF_CHIP_NOSELECT
status=ReadStatus();
while(!(status&0x80))
{
status=ReadStatus();
}
}
void PageRead(uint page, uint addr, uint len, uchar * buffer)//finish
{
uint i;
uchar status;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(MAIN_MEMORY_PAGE_READ);
SendSPIByte((uchar)(page>>7));
SendSPIByte(((uchar)(page<<1)|(uchar)(addr>>8)));
SendSPIByte((uchar)(addr));
SendSPIByte(0);
SendSPIByte(0);
SendSPIByte(0);
SendSPIByte(0);
for(i=0;i<len;i++)
buffer[i]=GetSPIByte();
DF_CHIP_NOSELECT
status=ReadStatus();
while(!(status&0x80))
{
status=ReadStatus();
}
}
/*
PAGE_TO_B1_COMP
PAGE_TO_B2_COMP
*/
bit PageToBufferComp(uchar choice, uint page)
{
uchar status;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte((uchar)(page>>7));
SendSPIByte((uchar)(page<<1));
SendSPIByte(0);
DF_CHIP_NOSELECT
DF_RDY_BUSY
status=ReadStatus();
while(!(status&0x80))
{
status=ReadStatus();
}
return (status&0x40)?1:0;
}
/*
B1_TO_PAGE_WITH_ERASE
B2_TO_PAGE_WITH_ERASE
*/
void BufferToPageWithErase(uchar choice, uint page)//finish
{
uchar status;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte((uchar)(page>>7));
SendSPIByte((uchar)(page<<1));
SendSPIByte(0);
DF_CHIP_NOSELECT
status=ReadStatus();
while(!(status&0x80))
{
status=ReadStatus();
}
}
/*
B1_TO_PAGE_WITHOUT_ERASE
B2_TO_PAGE_WITHOUT_ERASE
*/
void BufferToPageWithOutErase(uchar choice, uint page)
{
uchar status;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte((uchar)(page>>7));
SendSPIByte((uchar)(page<<1));
SendSPIByte(0);
DF_CHIP_NOSELECT
status=ReadStatus();
while(!(status&0x80))
{
status=ReadStatus();
}
}
/*
PAGE_PROG_THROUGH_B1
PAGE_PROG_THROUGH_B2
*/
void PageProgViaBuffer(uchar choice, uint page, uint addr,uint len,uchar* buffer)
{
uint i;
uchar status;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte((uchar)(page>>7));
SendSPIByte(((uchar)(page<<1)|(uchar)(addr>>8)));
SendSPIByte((uchar)(addr));
for(i=0;i<len;i++)
SendSPIByte(buffer[i]);
DF_CHIP_NOSELECT
status=ReadStatus();
while(!(status&0x80))
{
status=ReadStatus();
}
}
/*
AUTO_PAGE_REWRITE_THROUGH_B1
AUTO_PAGE_REWRITE_THROUGH_B2
*/
void AutoPageRewiteViaBuffer(uchar choice, uint page)
{
uchar status;
//DF_RDY_BUSY
DF_CHIP_SELECT
SendSPIByte(choice);
SendSPIByte((uchar)(page>>7));
SendSPIByte((uchar)(page<<1));
SendSPIByte(0);
DF_CHIP_NOSELECT
status=ReadStatus();
while(!(status&0x80))
{
status=ReadStatus();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -