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

📄 at45db041b1.c

📁 单片外部存储芯片AT45041B操作源程序
💻 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 + -