新闻  |   论坛  |   博客  |   在线研讨会
(转)AT45DB041B驱动程序
mayer | 2009-09-06 11:18:45    阅读:1506   发布文章

(转)AT45DB041B驱动程序

 

/************************************************************************************************
说明:
AT45DB041B: SPI接口,2048Pages(264Bytes/Page), 2.7V-3.6V, 5V系统中读写可能出错,
            要做降压处理,详细做法请参见另一篇文章<<3V和5V系统混合设计技巧>>.
以下程序是我在一个图文显示系统中的读写程序,ATmega32 , SPI接口
************************************************************************************************/

/**********************************************************
函数名称:SPI_ReadFlash
功能描述:直接读FLASH
入口参数:PA,PBA,pHeader,Num
出口参数:NULL
编       者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ReadFlash(WORD PA,WORD PBA,BYTE *pHeader,WORD Num)
{
   WORD i;
   
   while(i <255){if(SPI_CheckBusy()&0x80){break;}}       //read status
   PA<<=1;
   PA|=PBA>>8;
   FLASH_CS_L;             //chip select
   SPI_WriteByte(0xe8);           //直接读FLASH
   SPI_WriteByte((unsigned char)(PA>>8));      //页地址高位
   SPI_WriteByte((unsigned char) PA);       //页地址低位   
   SPI_WriteByte((unsigned char)PBA);       //页偏移地址
   SPI_WriteByte(0x00);
   SPI_WriteByte(0x00);
   SPI_WriteByte(0x00);
   SPI_WriteByte(0x00);
  
   for(i=0;i<Num;i++)
   {
      SPI_WriteByte(0xff);          //写字节数据,使字节数据从SO移出
      pHeader[i]=SPDR;  
   }
   FLASH_CS_H;
}

/**********************************************************
函数名称:SPI_ReadPage
功能描述:直接读页FLASH,仅一页
入口参数:PA,PBA,pHeader,Num
出口参数:NULL
编        者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ReadPage(WORD PA,WORD PBA,BYTE *pHeader,WORD Num)
{
   WORD i;
  
   while(i <255){if(SPI_CheckBusy()&0x80){break;}}       //read status
   FLASH_CS_L;             //chip select
   SPI_WriteByte(0xd2);           //直接读FLASH
   SPI_WriteByte((unsigned char)(PA>>7));   
   SPI_WriteByte((unsigned char)((PA<<1)|(PBA>>8)));     
   SPI_WriteByte((unsigned char)PBA);     
   SPI_WriteByte(0x00);
   SPI_WriteByte(0x00);
   SPI_WriteByte(0x00);
   SPI_WriteByte(0x00);
  
   for(i=0;i<Num;i++)
   {
      SPI_WriteByte(0xff);      
      pHeader[i]=SPDR;  
   }
   FLASH_CS_H;
}

/**********************************************************
函数名称:SPI_ReadBuffer
功能描述:读BUFFER
入口参数:BFA:buffer, Num
出口参数:NULL
编        者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ReadBuffer(BYTE cmd,WORD BFA,BYTE *pHeader,WORD Num)
{
   WORD i;
  
   while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
   FLASH_CS_L;          
   SPI_WriteByte(cmd); //写BUFFER指令,0X54/D4 BUFFER1,0X56/D6 BUFFER2
   SPI_WriteByte(0x00);
   SPI_WriteByte((unsigned char)(BFA>>8));   
   SPI_WriteByte((unsigned char)BFA);        
   SPI_WriteByte(0x00);
     
   for(i=0;i<Num;i++)
   {
      SPI_WriteByte(0xff);       
      pHeader[i]=SPDR;  
   }
   FLASH_CS_H;
}


/**********************************************************
函数名称:SPI_WriteBuffer
功能描述:从数据缓冲区向flash缓冲区buffer1或buffer2
    写入指定数量的数据
入口参数:   trabuf:数据缓冲区 , num:待写入的字节数    
出口参数:NULL
编        者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_WriteBuffer(BYTE cmd,WORD BFA,BYTE *trabuf,WORD Num)
{
   WORD i;

   while(i <255){if(SPI_CheckBusy()&0x80){break;}}      //read status
   FLASH_CS_L;             
   SPI_WriteByte(cmd);   //写BUFFER指令,0X84 BUFFER1,0X87 BUFFER2
   SPI_WriteByte(0x00); //无关位
   SPI_WriteByte((unsigned char)(BFA>>8));      
   SPI_WriteByte((unsigned char)BFA);          
  
   for(i=0;i<Num;i++)              
   {
        SPI_WriteByte(Write_FLASH_Buffer[i]);
     SPI_WriteByte(trabuf[Num]);      
   }   
   FLASH_CS_H;
}

/**********************************************************
函数名称:SPI_WriteFlash
功能描述:1. 先擦除页,再把BUFFER中数据写到FLASH主存
             BUFFER1 0X83, BUFFER2 0X86
    2. 不须要擦除页,直接把BUFFRE中数据写到FLASH主存,连续页写不推荐此法
             BUFFER1 0X88, BUFFER2 0X89
入口参数:PA:页地址
出口参数:NULL
编        者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_WriteFlashFromBuffer(BYTE cmd,WORD PA)
{
    WORD i="0";   

   while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status  
   FLASH_CS_L;                
   SPI_WriteByte(cmd); //写BUFFER指令
   SPI_WriteByte((char)(PA>>7));     
   SPI_WriteByte((char)(PA<<1));        
   SPI_WriteByte(0x00);    
   FLASH_CS_H;
}

/**********************************************************
函数名称:SPI_ErasePage
功能描述:擦除页
入口参数:PA:页地址
出口参数:NULL
编        者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_ErasePage(BYTE cmd,WORD PA)
{
   WORD i="0";    

   while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
   FLASH_CS_L;          
   SPI_WriteByte(cmd); //擦页
   SPI_WriteByte(0x00);
   SPI_WriteByte((char)(PA>>7));      
   SPI_WriteByte((char)(PA<<1));    
   
   SPI_WriteByte(0x00);       
   FLASH_CS_H;
}

/**********************************************************
函数名称:SPI_EraseBlock
功能描述:擦除页/擦除块
入口参数:PBA:块地址
出口参数:NULL
编        者:zhumy
创建日期:2007/10/5
**********************************************************/
void SPI_EraseBlock(BYTE cmd,WORD PBA)
{
   WORD i="0";    

   while(i <255){if(SPI_CheckBusy()&0x80){break;}}//read status
   FLASH_CS_L;           
   SPI_WriteByte(cmd); //擦块
   SPI_WriteByte(0x00);
   SPI_WriteByte((char)(PBA>>4));     
   SPI_WriteByte((char)(PBA<<4));    
    
   SPI_WriteByte(0x00);      
   FLASH_CS_H;
}

/**********************************************************
函数名称:SPI_WriteFlashDirect
功能描述:直接写FLASH,先写数据写到BUFFER中
入口参数:pagadd:页地址
出口参数:NULL
编        者:zhumy
创建日期:2007/10/6
**********************************************************/
void SPI_WriteFlashDirect(BYTE cmd,WORD PA,WORD BFA,BYTE *trabuf,WORD Num)
{
   WORD i="0";  
  
   while(i <255){if(SPI_CheckBusy()&0x80){break;}}//read status
   FLASH_CS_L;             //chip select
   SPI_WriteByte(cmd);     //直接写FLASH,0x82 buffer1,0x85 buffer2
   SPI_WriteByte((unsigned char)(PA>>7));   
   SPI_WriteByte((unsigned char)((PA<<1)|(BFA>>8)));  
   SPI_WriteByte((unsigned char)BFA);           
   for(i=0;i<Num;i++)             
   {
     SPI_WriteByte(trabuf[i]);       
   }         
   FLASH_CS_H;
}

/**********************************************************
函数名称:SPI_FlashToBuffer
功能描述:主存传送到BUFFER
入口参数:PA:页地址
出口参数:NULL
编        者:zhumy
创建日期:2007/10/6
**********************************************************/
void SPI_PageToBuffer(BYTE cmd,WORD PA )
{
   WORD i="0";    
   while(i <255){if(SPI_CheckBusy()&0x80){break;}} //read status
   FLASH_CS_L;                
   SPI_WriteByte(cmd);//写BUFFER指令,0X53 BUFFER1,0X55 BUFFER2
   SPI_WriteByte((char)(PA>>7));        
   SPI_WriteByte((char)(PA<<1));       
    
   SPI_WriteByte(0x00);      
   FLASH_CS_H;
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客