?? at45db041b1.c
字號:
#include "at45db041b.h"
#include "keyboard.h"
/////////////////////////
//at45db041b totle 540672 byte
////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
unsigned char SPI_HostReadByte(void)
{
unsigned char idata i,rByte=0;
for(i=0;i<8;i++)
{
SPI_SCK=0;
SPI_SCK=1;
rByte<<=1;
rByte|=SPI_SO;
}
return rByte;
}
///////////////////////////////////////////////////////////////////////
void SPI_HostWriteByte(unsigned char wByte)
{
unsigned char idata i;
for(i=0;i<8;i++)
{
if((wByte<<i)&0x80){SPI_SI=1;}
else{SPI_SI=0;}
SPI_SCK=0;
SPI_SCK=1;
}
}
/******************************************************************************/
/*Status Register Format: */
/* ----------------------------------------------------------------------- */
/* | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | */
/* |--------|--------|--------|--------|--------|--------|--------|--------| */
/* |RDY/BUSY| COMP | 0 | 1 | 1 | 1 | X | X | */
/* ----------------------------------------------------------------------- */
/* bit7 - 忙標記,0為忙1為不忙。 */
/* 當Status Register的位0移出之后,接下來的時鐘脈沖序列將使SPI器件繼續*/
/* 將最新的狀態字節送出。 */
/* bit6 - 標記最近一次Main Memory Page和Buffer的比較結果,0相同,1不同。 */
/* bit5 */
/* bit4 */
/* bit3 */
/* bit2 - 這4位用來標記器件密度,對于AT45DB041B,這4位應該是0111,一共能標記 */
/* 16種不同密度的器件。 */
/* bit1 */
/* bit0 - 這2位暫時無效 */
/******************************************************************************/
unsigned char AT45DB041B_StatusRegisterRead(void)
{
unsigned char idata i;
SPI_CS=0;
SPI_HostWriteByte(0xd7);
i=SPI_HostReadByte();
SPI_CS=1;
return i;
}
/******************************************************************************/
/*描述: */
/* When the last bit in the main memory array has been read,the device will*/
/* continue reading back at the beginning of the first page of memory.As w-*/
/* ith crossing over page boundaries,no delays will be incurred when wrapp-*/
/* ing around from the end of the array to the beginning of the array. */
/*參數: */
/* PA - 頁地址,0~2047 */
/* BFA - 指定BUFFER中的起始寫入地址 */
/* pHeader - 指定數據的首地址 */
/* len - 指定數據的長度 */
/******************************************************************************/
void AT45DB041B_ContinuousArrayRead(uint PA,uint BFA,uchar *pHeader,uint len)
{
unsigned int idata i;
while(i++ < 1000 )
{if(AT45DB041B_StatusRegisterRead()& 0x80 )
{break;} // 不忙則退出
}
SPI_CS=0;
SPI_HostWriteByte(0xe8);
SPI_HostWriteByte((unsigned char)(PA>>7));
SPI_HostWriteByte((unsigned char)((PA<<1)|(BFA>>8)));
SPI_HostWriteByte((unsigned char)BFA);
for(i=0;i<4;i++)
{
SPI_HostWriteByte(0x00);
}
for(i=0;i<len;i++)
{
pHeader[i]=SPI_HostReadByte();
}
SPI_CS=1;
// delayms(1000);
}
/******************************************************************************/
/*描述: */
/* 將指定數據寫入從某個地址(0~263)開始的BUFFER中。 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* 在該指令序列中,操作碼84H選擇BUFFER 1,87H選擇BUFFER 2 */
/* BFA - BUFFER中的起始地址,0~263 */
/* pHeader - 待存數據的頭指針 */
/* len - 待存數據的長度1~264 */
/******************************************************************************/
void AT45DB041B_BufferWrite(uchar buffer,uint BFA,uchar *pHeader,uint len)
{
unsigned int idata i;
while(i++ <1000)
{
if(AT45DB041B_StatusRegisterRead()& 0x80)
{break;} // 不忙則退出
}
SPI_CS=0;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x84);break;
case 2:SPI_HostWriteByte(0x87);break;
}
SPI_HostWriteByte(0x00);
SPI_HostWriteByte((unsigned char)(BFA>>8));
SPI_HostWriteByte((unsigned char)BFA);
for(i=0;i<len;i++)
{
SPI_HostWriteByte(pHeader[i]);
}
SPI_CS=1;
// delayms(1000);
}
///////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/*描述: */
/* 將BUFFER中從某個地址(0~263)開始的數據讀入 pHeader中。 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* 在該指令序列中,操作碼84H選擇BUFFER 1,87H選擇BUFFER 2 */
/* BFA - BUFFER中的起始地址,0~263 */
/* pHeader - 讀出數據的頭指針 */
/* len - 讀出數據的長度1~264 */
/******************************************************************************/
void AT45DB041B_BufferRead(uchar buffer,uint BFA,uchar *pHeader,uint len)
{
unsigned int idata i;
while(i++ <1000)
{
if(AT45DB041B_StatusRegisterRead()& 0x80)
{break;} // 不忙則退出
}
SPI_CS=0;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x54);break;
case 2:SPI_HostWriteByte(0x56);break;
}
SPI_HostWriteByte(0x00); //15,9,8
SPI_HostWriteByte((unsigned char)(BFA>>8));
SPI_HostWriteByte((unsigned char)BFA);
SPI_HostWriteByte(0x00);
for(i=0;i<len;i++)
{
pHeader[i] = SPI_HostReadByte();
}
SPI_CS=1;
// delayms(1000);
}
///////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/*描述: */
/* 將指定頁PA讀入從某個BUFFER中。 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* 在該指令序列中,操作碼53H選擇BUFFER 1,55H選擇BUFFER 2 */
/* PA - 頁地址,0~2047 */
/******************************************************************************/
void AT45DB041B_MainMemoryPageToBuffer(uchar buffer,uint PA)
{
unsigned int idata i;
while(i++ <1000)
{
if(AT45DB041B_StatusRegisterRead()& 0x80)
{break;} // 不忙則退出
}
SPI_CS=0;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x53);break;
case 2:SPI_HostWriteByte(0x55);break;
}
SPI_HostWriteByte((unsigned char)(PA>>7));
SPI_HostWriteByte((unsigned char)(PA<<1));
SPI_HostWriteByte(0x00);
delayms(100);
SPI_CS=1;
}
/******************************************************************************/
/*描述: */
/* 將指定數據寫入從某個地址(0~263)開始的頁中:包含2個動作,首先將指定數據*/
/* 寫入到BUFFER 1或者BUFFER 2中,其中可以指定BUFFER中的起始寫入地址,此寫入*/
/* 動作不影響BUFFER中其它地址中的數據,然后再將BUFFER中的整個數據寫入到某指*/
/* 定頁中(帶預擦除)。 */
/*參數: */
/* buffer - 選擇BUFFER,01H選擇BUFFER 1,02H選擇BUFFER 2 */
/* PA - 頁地址,0~2047 */
/* BFA - 指定BUFFER中的起始寫入地址 */
/* pHeader - 指定數據的首地址 */
/* len - 指定數據的長度 */
/******************************************************************************/
void AT45DB041B_BufferToMainMemoryPageProgramWithBuilt_inErase(uchar buffer,uint PA,uint BFA,uchar *pHeader,uint len)
{
unsigned int idata i;
AT45DB041B_BufferWrite(buffer,BFA,pHeader,len);
while(i++ < 1000){if(AT45DB041B_StatusRegisterRead()&0x80){break;}} // 不忙則退出
SPI_CS=0;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x83);break;
case 2:SPI_HostWriteByte(0x86);break;
}
SPI_HostWriteByte((unsigned char)(PA>>7));
SPI_HostWriteByte((unsigned char)(PA<<1));
SPI_HostWriteByte(0x00);
SPI_CS=1;
// delayms(1000);
}
/******************************************************************************/
/*描述: */
/* 與上一個函數的唯一區別是不帶預擦除。 */
/******************************************************************************/
void AT45DB041B_BufferToMainMemoryPageProgramWithoutBuilt_inErase(uchar buffer,uint PA,uint BFA,uchar *pHeader,uint len)
{
unsigned int idata i=0;
AT45DB041B_BufferWrite(buffer,BFA,pHeader,len);
while(i++<1000){if(AT45DB041B_StatusRegisterRead()&0x80){break;}}
SPI_CS=0;
SPI_HostWriteByte(0x88+buffer);
SPI_HostWriteByte((unsigned char)(PA>>7));
SPI_HostWriteByte((unsigned char)(PA<<1));
SPI_HostWriteByte(0x00);
for(i=0;i<len;i++){SPI_HostWriteByte(pHeader[i]);}
SPI_CS=1;
// delayms(1000);
}
/*void main(void)
{
unsigned char i;
UCHAR code test[32];
i=AT45DB041B_StatusRegisterRead();
memset(test,0x77,32);
AT45DB041B_BufferToMainMemoryPageProgramWithBuilt_inErase(1,2047,0,test,32);
memset(test,0x26,32);
AT45DB041B_ContinuousArrayRead(2047,0,test,32);
memset(test,0x88,32);
AT45DB041B_BufferToMainMemoryPageProgramWithBuilt_inErase(2,2047,0,test,32);
memset(test,0x55,32);
AT45DB041B_ContinuousArrayRead(2047,0,test,32);
while(1){}
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -