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

📄 flash.c

📁 用8051采用pwm方式播放 串口语音数据
💻 C
字号:
/*C*************************************************
name   :  flash_drv.c
author :  nauy
date   :  7/05/07
***************************************************/
#include "flash.h"

Byte flash_sector =0;
Byte flash_page   =0;
Byte flash_block  =0;
Byte flash_zone   =0;

NF_CS_OFF;

Byte nf_sector_addr[3]={0,0,0};



void Nf_send_command(command)    
                                 {ACC=NF_CMD_LATCH_ENABLE_ADD;            
                                  P2=ACC;
                                  ACC=command; 
                                  P0=ACC;
                                 }

void Nf_send_address(address)    
                                 {ACC=NF_ADD_LATCH_ENABLE_ADD;
                                  P2=ACC;
                                  ACC=address;
                                  P0=ACC;
                                  }


void  Nf_write_open_B_area(address_sector, nb_byte)                       
      {  
      Nf_send_command (NF_READ_B_AREA_CMD);                                 
      Nf_send_command (NF_SEQUENTIAL_DATA_INPUT_CMD);                       
      Nf_send_address ( nb_byte );                                                 
      Nf_send_address ( ((Byte*)&address_sector)[3] );                      
      Nf_send_address ( ((Byte*)&address_sector)[2] );                      
      Nf_send_address ( ((Byte*)&address_sector)[1] );                      
      Nf_send_command (NF_READ_B_AREA_CMD);
      }     

void  Nf_write_open_A_area(address_sector, nb_byte)    
      {                   
      Nf_send_command (NF_READ_A_AREA_CMD);                                
      Nf_send_command (NF_SEQUENTIAL_DATA_INPUT_CMD);                      
      Nf_send_address ( nb_byte );                                                  
      Nf_send_address ( ((Byte*)&address_sector)[3] );                     
      Nf_send_address ( ((Byte*)&address_sector)[2] );                      
      Nf_send_address ( ((Byte*)&address_sector)[1] );                      
      Nf_send_command (NF_READ_A_AREA_CMD);
      }
      
void  Nf_write_open_C_area(address_sector, nb_byte)   
      {                    
      Nf_send_command (NF_READ_C_AREA_CMD);                                
      Nf_send_command (NF_SEQUENTIAL_DATA_INPUT_CMD);                       
      Nf_send_address ( nb_byte );                                                
      Nf_send_address ( ((Byte*)&address_sector)[3] );                      
      Nf_send_address ( ((Byte*)&address_sector)[2] );                      
      Nf_send_address ( ((Byte*)&address_sector)[1] );                      
      Nf_send_command (NF_READ_C_AREA_CMD);
      }
      
void  Nf_read_open_A_area(address_sector, nb_byte)  
      {                      
      Nf_send_command (NF_READ_A_AREA_CMD);                                 
      Nf_send_address ( nb_byte );                                                  
      Nf_send_address ( ((Byte*)&address_sector)[3] );                      
      Nf_send_address ( ((Byte*)&address_sector)[2] );                      
      Nf_send_address ( ((Byte*)&address_sector)[1] );                      
      Nf_wait_busy;
      }
      
void  Nf_read_open_B_area(address_sector, nb_byte)   
      {                     
      Nf_send_command (NF_READ_B_AREA_CMD);                                 
      Nf_send_address ( nb_byte );                                                  
      Nf_send_address ( ((Byte*)&address_sector)[3] );                      
      Nf_send_address ( ((Byte*)&address_sector)[2] );                      
      Nf_send_address ( ((Byte*)&address_sector)[1] );                      
      Nf_wait_busy;
      }
      
void  Nf_read_open_C_area(address_sector, nb_byte)      
      {                  
      Nf_send_command (NF_READ_C_AREA_CMD);                                 
      Nf_send_address ( nb_byte );                                                  
      Nf_send_address ( ((Byte*)&address_sector)[3] );                      
      Nf_send_address ( ((Byte*)&address_sector)[2] );                      
      Nf_send_address ( ((Byte*)&address_sector)[1] );                     
      Nf_wait_busy;
      }


int flash_write_address()
{
// 
	Nf_CS_ON;
	if(flash_sector<256)


		Nf_write_open_A_area(nf_sector_addr,flash_sector);


	else if(flash_sector<512)
		Nf_write_open_B_area(nf_sector_addr,flash_sector);

	else if(flash_sector<528)
		Nf_write_open_C_area(nf_sector_addr,flash_sector);
//

	flash_sector++;

//
	if(flash_sector==528)
		{
			flash_page++;
              	flash_sector=0;
		}
	if(flash_page==32)
    	{
			flash_sector=0;
			flash_page=0;
			flash_block++;
      }
	if(flash_block==1024)
		{
			flash_sector=0;
			flash_page=0;
			flash_block=0;
			flash_zone++;
		}

    if(flash_zone>4)
    return(FALSE);
    
    return(TRUE);
//
	nf_sector_addr[3]=flash_page;
	nf_sector_addr[2]=flash_block;
	nf_sector_addr[1]=flash_zone;

}


void flash_write(Uchar idata *p)
{	
	Nf_CS_ON;
	flash_write_address();
	Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
	Nf_wait_busy;
	ACC=NF_ADDRESS_CMD_DATA;
	P2=ACC;
	Nf_wait_busy;
	ACC=*p;
    P0=ACC;
	Nf_send_command(NF_PAGE_PROGRAM_CMD);
	Nf_wait_busy;
	Nf_CS_OFF;
}


int flash_read_address()
{

// 
	   Nf_CS_ON;
	if(flash_sector<256)
		Nf_read_open_A_area(nf_sector_addr,flash_sector);
	else if (flash_sector>256)
		Nf_read_open_B_area(nf_sector_addr,flash_sector);
	else if (flash_sector<528)
		Nf_read_open_C_area(nf_sector_addr,flash_sector);
//

	flash_sector++;

//
	if(flash_sector==528)
		{
			flash_page++;
              	flash_sector=0;
		}
	if(flash_page==32)
    		{
			flash_sector=0;
			flash_page=0;
			flash_block++;
		    }
	if(flash_block==1024)
		{
			flash_sector=0;
			flash_page=0;
			flash_block=0;
			flash_zone++;
		}
    if(flash_zone>4)
    return(FALSE);
    
    return(TRUE);
//
	nf_sector_addr[3]=flash_page;
	nf_sector_addr[2]=flash_block;
	nf_sector_addr[1]=flash_zone;
}

void flash_read(Uchar idata *p)
{    
     Nf_CS_ON;
     flash_read_address();
     ACC=NF_ADDRESS_CMD_DATA;
     P2=ACC;
     while(!NF_RD_BUSY);
     ACC=P0;
     *p=ACC;
     while(!NF_RD_BUSY);
     Nf_CS_OFF;
}    

⌨️ 快捷键说明

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