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

📄 en25b16_driver.c

📁 en25b16 flash驱动
💻 C
字号:
/****************************************************************************
 **             - EN25B16_driver.c -
 **
 **      NewMsg_EN25B16模块驱动程序的c文档
 **
 **     
 **
 **             mader:许利军
 **    
 **     File version: $2008.6.27$
 **
 ***************************************************************************/
#define SYSTEM_CLOCK 8000000
#include<def_AVR_IAR.h>
#include"EN25B16_driver.h"



void EN25B16_INITIALIZTION()
{
  EN25B16_CS_DDR  = 1;
  EN25B16_DO_DDR  = 0;
  EN25B16_DI_DDR  = 1;
  EN25B16_WP_DDR  = 1;
  EN25B16_CLK_DDR = 1;
  EN25B16_HOLD_DDR = 1;
  EN25B16_CS     = 1;
  EN25B16_DO     = 1;
  EN25B16_DI     = 1;
  EN25B16_WP     = 1;
  EN25B16_CLK    = 1;
  EN25B16_HOLD   = 1;
  
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS   = 1 ;
  _NOP_ms(1);
  EN25B16Write8Bit(WriteStatusRegister);
  EN25B16Write8Bit((unsigned char)STATUS_RERISTER);
  EN25B16_CS   = 1;
  _NOP_ms(15);
}


void EN25B16Write8Bit(unsigned char byte)
{
  unsigned char i;
  EN25B16_CS = 0;
  EN25B16_CLK = 0;
  for ( i = 0 ; i < 8 ; i++){  
  
   EN25B16_CLK = 0;
   EN25B16_DI  = (byte&0x80)>>7;; 
   byte = byte<<1; 
   EN25B16_CLK = 1;
  }

}



unsigned char EN25B16Read8Bit(void)
{
  unsigned char i;
  unsigned char byte = 0x00;
  EN25B16_CS = 0;
  EN25B16_CLK = 0; 
  for ( i = 0; i < 8; i++)
  {
    byte = byte<<1; 
    EN25B16_CLK = 0;   
    byte = byte|(EN25B16_DO_PING&0x01);
    EN25B16_CLK = 1;
    
  }
  return(byte);
  
}


/*----------4K 扇区读写擦函数---------*/

void WriteSector_4K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
  unsigned char i;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(ReadStatusRegister);
  while((EN25B16Read8Bit()&0x01));
  EN25B16_CS = 1;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(PageProgram);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
    EN25B16Write8Bit(*(pdata+i));  
  }
  
  EN25B16_CS = 1;

}


void ReadSector_4K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{

  unsigned char i;
  EN25B16Write8Bit(ReadDataBytes);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
  *(pdata+i) = EN25B16Read8Bit();
  }
  
  EN25B16_CS = 1;

}


void EraseSector_4K(unsigned char sector_num)
{

  EN25B16Write8Bit(ReadStatusRegister);
  while(((EN25B16Read8Bit())&0x01));
  EN25B16_CS = 1; 
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(SectorErase);
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num)>>16));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num)>>8));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num)));

  EN25B16_CS = 1;

}


/*----------8K 扇区读写擦函数---------*/


void WriteSector_8K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
  unsigned char i;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(ReadStatusRegister);
  while((EN25B16Read8Bit()&0x01));
  EN25B16_CS = 1;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(PageProgram);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_8K_BASE_ADDRESS+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
    EN25B16Write8Bit(*(pdata+i));  
  }
  
  EN25B16_CS = 1;

}


void ReadSector_8K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{

  unsigned char i;
  EN25B16Write8Bit(ReadDataBytes);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_8K_BASE_ADDRESS+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
  *(pdata+i) = EN25B16Read8Bit();
  }
  
  EN25B16_CS = 1;

}



void EraseSector_8K()
{

  EN25B16Write8Bit(ReadStatusRegister);
  while(((EN25B16Read8Bit())&0x01));
  EN25B16_CS = 1; 
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(SectorErase);
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_8K_BASE_ADDRESS)>>16));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_8K_BASE_ADDRESS)>>8));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_8K_BASE_ADDRESS)));

  EN25B16_CS = 1;

}






/*----------32K 扇区读写擦函数---------*/


void WriteSector_32K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
  unsigned char i;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(ReadStatusRegister);
  while((EN25B16Read8Bit()&0x01));
  EN25B16_CS = 1;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(PageProgram);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_32K_BASE_ADDRESS+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
    EN25B16Write8Bit(*(pdata+i));  
  }
  
  EN25B16_CS = 1;

}


void ReadSector_32K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{

  unsigned char i;
  EN25B16Write8Bit(ReadDataBytes);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_32K_BASE_ADDRESS+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
  *(pdata+i) = EN25B16Read8Bit();
  }
  
  EN25B16_CS = 1;

}



void EraseSector_32K()
{

  EN25B16Write8Bit(ReadStatusRegister);
  while(((EN25B16Read8Bit())&0x01));
  EN25B16_CS = 1; 
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(SectorErase);
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_32K_BASE_ADDRESS)>>16));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_32K_BASE_ADDRESS)>>8));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_32K_BASE_ADDRESS)));

  EN25B16_CS = 1;

}






/*----------64K 扇区读写擦函数---------*/

void WriteSector_64K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
  unsigned char i;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(ReadStatusRegister);
  while((EN25B16Read8Bit()&0x01));
  EN25B16_CS = 1;
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(PageProgram);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
    EN25B16Write8Bit(*(pdata+i));  
  }
  
  EN25B16_CS = 1;

}


void ReadSector_64K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{

  unsigned char i;
  EN25B16Write8Bit(ReadDataBytes);
  EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
  
  for ( i = 0 ; i < data_num ;i++ ){
  *(pdata+i) = EN25B16Read8Bit();
  }
  
  EN25B16_CS = 1;

}


void EraseSector_64K(unsigned char sector_num)
{

  EN25B16Write8Bit(ReadStatusRegister);
  while(((EN25B16Read8Bit())&0x01));
  EN25B16_CS = 1; 
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(SectorErase);
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num)>>16));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num)>>8));
  EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num)));

  EN25B16_CS = 1;

}



/*快速读取某几个byte*/
void FastReadSomeByte(unsigned long int add,unsigned char data_num,unsigned char *pdata)
{


  unsigned char i,temp;
  EN25B16Write8Bit(ReadDataBytes);
  EN25B16Write8Bit((unsigned char)((unsigned long)((add))>>16));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(add))>>8));
  EN25B16Write8Bit((unsigned char)(((unsigned long)(add))));
  temp = 0;
  i = temp;
  temp = EN25B16Read8Bit();
  
  for ( i = 0 ; i < data_num ;i++ ){
  *(pdata+i) = EN25B16Read8Bit();
  }
  
  EN25B16_CS = 1;

}


void EraseAll(void)
{
  EN25B16Write8Bit(ReadStatusRegister);
  while(((EN25B16Read8Bit())&0x01));
  EN25B16_CS = 1; 
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(BulkErase);
  EN25B16_CS = 1;

}

/*--------进入DeepPowerdownMode-------*/
void GoToDeepPowerdownMode(void)
{
  EN25B16Write8Bit(ReadStatusRegister);
  while(((EN25B16Read8Bit())&0x01));
  EN25B16_CS = 1; 
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(DeepPowerdown);
  EN25B16_CS = 1;

}


void ReleaDeepPowerdownMode(void)
{

  EN25B16Write8Bit(ReadStatusRegister);
  while(((EN25B16Read8Bit())&0x01));
  EN25B16_CS = 1; 
  EN25B16Write8Bit(WriteEnable);
  EN25B16_CS = 1;
  EN25B16Write8Bit(ReleaseDeepPowerdown);
  EN25B16_CS = 1;

}

⌨️ 快捷键说明

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