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

📄 at45db081.c

📁 at45EEPROM源程序
💻 C
字号:

//--------------文件信息--------------------------------------------------------------------------------
//文   件   名: at45db321.c
//创   建   人: 彭井花
//最后修改日期: 2006年11月24日
//描        述: 包括读写BUFFER,读写FLASH等。at45db321 共有8192页,
//              一页为512+16=528 byte,8 页为一个BLOCK,共1024个BLOCK ,
//              16个SECTOR
//--------------版本信息--------------------------------------------------------------------------------
// 创建人: 彭井花
// 版  本: V1.0
// 日 期: 2006年11月24日
// 描 述: 包括读写BUFFER,读写FLASH等。
//
//------------------------------------------------------------------------------------------------------
// 修改人:
// 版  本:
// 日 期:
// 描 述:
//
//------------------------------------------------------------------------------------------------------

#include "AT45.h"
#include "config.h"

#define  SPCR  0x5f
uint8    Data_Buff[255];

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


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


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


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


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


/******************************************************************************/
/* 函数名称:void read_flash(uint8,uint32,uint32,uint32)                      */
/* 功能描述:从flash指定页指定页内起始地址读取指定数量的数据字节到            */
/*           datasave_buff数组                                                */
/* 参数说明:Write_com为命令字0x52读命令,page_offset为页内起始地址            */
/*           page_address为页地址,count为欲读取的字节数                      */
/* 参数返回: 无                                                              */
/******************************************************************************/ 
void Read_Flash( uint8 Readcmd, uint32 page_offset, uint32 page_address, uint32 count )
{   
    uint32 pa,i;
    uint8 byte;
    
    pa = 0;
    page_address<<=2;
    pa = page_offset>>8;
    page_address |= pa;
    P0 &= 0xefff;                   //置cs低选中
    Write_To_Flash_Byte( Readcmd );
    Write_To_Flash_Byte( (uint8)(page_address>>8) );
    Write_To_Flash_Byte( (uint8)page_address );
    Write_To_Flash_Byte( (uint8)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;
    }  
    P0 |= 0x1000;                 //置cs高不选中     
}    


/******************************************************************************/
/* 函数名称:void Write_flash(uint8,uint32,uint32,uint32)                     */
/* 功能描述:从datasave_buff数组向flash写入指定数量的数据                     */
/* 参数说明:Write_com为命令字0x84写buffer1,0x87写buffer2,                    */
/*           buffer_offset为写缓冲区起始地址,byte_count为                    */
/*           待写入的字节数 .												  */
/* 参数返回: 无                                                              */
/******************************************************************************/ 
void Write_Flash( uint8 Writecmd, uint32 page_address, uint32 page_offset, uint32 buffer_offset, uint32 byte_count )
{
	uint32 pa,i;
    uint8 byte;
    
    pa = 0;
    page_address<<=1;
    pa = page_offset>>8;
    page_address |= pa;
    P0 &= 0xefff;                   //置cs低选中
    Write_To_Flash_Byte( Readcmd );
    Write_To_Flash_Byte(0);          //写无关位  
    Write_To_Flash_Byte( (uint8)(page_address>>8) );
    Write_To_Flash_Byte( (uint8)page_address );
    Write_To_Flash_Byte( (uint8)page_offset );
    Write_To_Flash_Byte( (uint8)(buffer_offset>>8) );
    Write_To_Flash_Byte( (uint8)buffer_offset ); 
    for (i=0; i<byte_count; i++)                      //将byte_count个字节写入FLASH Buffer1
  	Write_To_Flash_Byte( Data_Buff[i] );
    P0 |= 0x1000;                               //置cs高不选中     
}     

⌨️ 快捷键说明

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