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

📄 at45db081b.c

📁 AT45DB Flash的驱动程序 自己把它加入具体工程修改下就可以了!
💻 C
字号:
用AVR写的1M FLASH AT45DB081B驱动程序(ZT) 
zlei @ 2005-6-22 17:27:00 

//来自21icbbs,cpu为atmega32

/******************************************************************************/
/* 函数名称:void write_to_flash_byte(uchar)                                  */
/* 功能描述:向AT45DB081B flas写入一个字节                                    */
/* 参数说明:cdata为待写入的数据                                              */
/* 参数返回:无                                                               */
/******************************************************************************/  
void Write_To_Flash_Byte(uchar cdata)
{     
   uchar byte;
   SPDR = cdata;
   while (!(SPSR & 0x80))
       ;                     //等待写结束
   byte = SPDR;
}

/******************************************************************************/
/* 函数名称:uchar check_flash_busy(void)                                     */
/* 功能描述:检查flash是否忙                                                  */
/* 参数说明:无                                                               */
/* 参数返回: 如果忙返回1,不忙返回0                                           */
/******************************************************************************/ 
uchar Check_Flash_Busy(void)
{
  uchar busy_flag;
  PORTB &=0xef;                     //置cs低选中
  Write_To_Flash_Byte(0xd7);
  Write_To_Flash_Byte(0xff);       //写字节数据,使字节数据从SO移出
  busy_flag = SPDR;
  PORTB |= 0x10;                  //置cs高不选中     
  if(busy_flag & 0x80)
      busy_flag = 0;
  else
      busy_flag = 1;
  return busy_flag;              
}

/******************************************************************************/
/* 函数名称:void write_buff(uchar,uint,uint)                                 */
/* 功能描述:从datasave_buff数组向flash缓冲区buffer1或buffer2                 */
/*           写入指定数量的数据                                               */                                        
/* 参数说明:Write_com为命令字0x84写buffer1,0x87写buffer2,                    */
/*           buffer_offset为写缓冲区起始地址,byte_count为                    */
/*           待写入的字节数                                                   */ 
/* 参数返回: 无                                                              */
/******************************************************************************/ 
void Write_Buff(uchar Write_com,uint buffer_offset,uint byte_count)
{ 
  uint i;
  PORTB &=0xef;                    //置cs低选中
  Write_To_Flash_Byte(Write_com);  //写buffer指令
  Write_To_Flash_Byte(0);          //写无关位  
  Write_To_Flash_Byte((uchar)(buffer_offset>>8));
  Write_To_Flash_Byte((uchar)buffer_offset);
  for (i=0;i<byte_count;i++)               //将byte_count个字节写入FLASH Buffer1
     Write_To_Flash_Byte(Data_Buff[i]);
  PORTB |= 0x10;                                //置cs高不选中     
}        

/******************************************************************************/
/* 函数名称:void read_write_flash(uchar,uint)                                */
/* 功能描述: 从buffer1或buffer2向flash存贮区带擦除或不带擦除写一页            */
/*           或从flash存贮区向buffer1或buffer2写一页                          */                                        
/* 参数说明:Write_com为命令字0x83带擦除buffer1到主存,0x86带擦除              */
/*           buffer2到主存,0x88不带擦除buffe1到主存,0x89为不带擦            */
/*           除buffer2主存,0x53为主存传送到buffer1,0x55为主存传               */
/*           送到buffer2,page_address为页地址                                */
/* 参数返回: 无                                                              */
/******************************************************************************/ 
void Read_Write_Flash(uchar Write_com,uint page_address)
{ 
   PORTB &=0xef;                      //置cs低选中
   Write_To_Flash_Byte(Write_com);
   page_address = page_address << 1;
   Write_To_Flash_Byte((uchar)(page_address>>8));
   Write_To_Flash_Byte((uchar)page_address); 
   Write_To_Flash_Byte(0);          //写无关位
   PORTB |= 0x10;                  //置cs高不选中
   while(Check_Flash_Busy());     //等待器件写完结束     
}

/******************************************************************************/
/* 函数名称:void read_buff(uchar,uint,uint)                                  */
/* 功能描述:从buffer1或buffer2向datasave_buff数组读指定数量的数据            */
/* 参数说明:Write_com为命令字0xd4读buffer1,0xd6读buffer2,                    */
/*           buffer_offset为读缓冲区起始地址,byte_count为                    */
/*           欲读取的字节数                                                   */ 
/* 参数返回: 无                                                              */
/******************************************************************************/ 
void Read_Buff(uchar Readcmd,uint buffer_offset,uint count)
{
  uint i;
  PORTB &= 0xef;                //置cs低选中
  Write_To_Flash_Byte(Readcmd);
  Write_To_Flash_Byte(0);
  Write_To_Flash_Byte((uchar)(buffer_offset>>8));
  Write_To_Flash_Byte((uchar)buffer_offset);
  Write_To_Flash_Byte(0);
  for(i=0;i<count;i++)
  {
    Write_To_Flash_Byte(0xff);
    Data_Buff[i]=SPDR;
  }    
  PORTB |= 0x10;             //置cs高不选中
}

/******************************************************************************/
/* 函数名称:void read_flash(uchar,uint,uint,uint)                            */
/* 功能描述:从flash指定页指定页内起始地址读取指定数量的数据字节到            */
/*           datasave_buff数组                                                */
/* 参数说明:Write_com为命令字0xd2读命令,page_offset为页内起始地址            */
/*           page_address为页地址,count为欲读取的字节数                      */
/* 参数返回: 无                                                              */
/******************************************************************************/ 
void Read_Flash(uchar Readcmd,uint page_offset,uint page_address,uint count)
{   
    uint pa,i;
    uchar byte;
    pa=0;
    page_address <<=1;
    pa = page_offset>>8;
    page_address |= pa;
    PORTB &= 0xef;                   //置cs低选中
    Write_To_Flash_Byte(Readcmd);
    Write_To_Flash_Byte((uchar)(page_address>>8));
    Write_To_Flash_Byte((uchar)page_address);
    Write_To_Flash_Byte((uchar)page_offset); 
    for(byte=0;byte<4;byte++)
    {
      Write_To_Flash_Byte(0);
    }
    for(i=0;i<count;i++)
    {
      Write_To_Flash_Byte(0xff);    //写字节数据,使字节数据从SO移出 
      Data_Buff[i] = SPDR;
    }  
    PORTB |= 0x10;                 //置cs高不选中     
}    


SPI控制字为:SPCR = 0x5f;
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -