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

📄 flash.c

📁 基于dsp2812芯片的串行flash(at45db161d)读写程序!
💻 C
字号:
void spi_Bitout(void)
{

     if (ucBuffer & 0x80)                  
     {                                    
         GpioDataRegs.GPFDAT.bit.GPIOF0=1; 
     }
     else                                
     {
         GpioDataRegs.GPFDAT.bit.GPIOF0=0; 
     }
    DelayMs(1);                       
    GpioDataRegs.GPFDAT.bit.GPIOF2=0;    
    DelayMs(1);                        
    GpioDataRegs.GPFDAT.bit.GPIOF2=1;    
    DelayMs(1);                      
	
} 

void spi_Bitin(void)
{

	ucBuffer &= 0x00FE;                   
    GpioDataRegs.GPFDAT.bit.GPIOF2=0;   
    DelayMs(1);                        
	GpioDataRegs.GPFDAT.bit.GPIOF2=1;    
	DelayMs(1); 
    if (GpioDataRegs.GPFDAT.bit.GPIOF1==1) 
     {
         ucBuffer|= 0x01;                
     }                                    
} 

void write_spi(unsigned char luck)
{
     unsigned char i;                     
	 ucBuffer=(unsigned int)luck;
     for (i = 0; i < 8; i++)              
     {
         spi_Bitout();                  
         ucBuffer = ucBuffer << 1;      
     }
}



void read_spi(void)
{
    unsigned char i;                     
	ucBuffer = 0;
    for (i = 0; i < 8; i++)              
     {		  
         ucBuffer = ucBuffer << 1;       
         spi_Bitin();
 	 }
}
void McEEP_Poll(void)
{
     DF_FLASH_NOSELECT; 
     DelayMs(1);                        
     while (GpioDataRegs.GPFDAT.bit.GPIOF1==1) {}; 
     DF_FLASH_SELECT; 
} 

void check_state(void)
{
	unsigned int state_reg;
	DF_FLASH_SELECT;
	DelayMs(1);
	write_spi(READ_STATE_REGISTER);
	DelayMs(1);
	read_spi();	
	DF_FLASH_NOSELECT;	
	state_reg = ucBuffer & 0x00FF;
	while((state_reg & 0x80) == 0) ;
	
}
void DF_write_buf1(unsigned int start_address,unsigned int length)
{
	unsigned int i;
	if ((528-start_address)>=length)
	{
		check_state();
		DF_FLASH_SELECT;
		DelayMs(1);
		write_spi(BUFFER_1_WRITE);
		write_spi(0x00);
		write_spi((unsigned char)(start_address >> 8)); 
		write_spi((unsigned char)start_address);
		for (i=flag1;i< (flag1+length);i++)
			write_spi(data_in[i]);	
		DF_FLASH_NOSELECT;
	}
	
}
void write_to_flash(unsigned int page_addr,unsigned int page_start_addr,unsigned int length)
{	unsigned int i,temp1,temp2,temp3,temp5;
	temp1=528-page_start_addr;
	if(length<temp1)
	{		flag1=0;
			DF_write_buf1(page_start_addr,length);
			DF_buf1_to_mm(page_addr);
	}
	else 
	{		flag1=0;
			DF_write_buf1(page_start_addr,temp1);
			DF_buf1_to_mm(page_addr);
			temp2=(unsigned int)((length-temp1)/528);
	 	if(temp2>0)
	  	{		for(i=0;i<temp2;i++)
	  			{ 	page_addr++;
					flag1 = temp1 + i*528;
	 				DF_write_buf1(0,528);
					DF_buf1_to_mm(page_addr);
	   			}
	 	
	 	    		temp5 = (length-temp1) % 528;
				page_addr++;
				flag1 = temp1+temp2 * 528;
				DF_write_buf1(0,temp5);
				DF_buf1_to_mm(page_addr);
	 	}		
	 	
	 	else 
	 	{ 		page_addr++;
	  			temp3 = length-temp1;
				flag1=temp1;
				DF_write_buf1(0,temp3);
				DF_buf1_to_mm(page_addr);
	  	}
	}

}


//将指定缓冲区中的数据写入主存储区的指定页
void DF_buf1_to_mm(unsigned int page)
{
	
	check_state();
	if (page<4096)
	{
		DF_FLASH_SELECT;
		write_spi(BF1_TO_MM_PAGE_PROG_WITH_ERASE);
		write_spi((unsigned char)(page>>6));
		write_spi((unsigned char)(page<<2));
		write_spi(0x00);
		DF_FLASH_NOSELECT;
	}
	
}

	

void read_from_flash(unsigned int page_addr,unsigned int page_start_addr, unsigned int length)	
{		unsigned int i,temp1,temp2,temp3,temp5;
	temp1=528-page_start_addr;
	if(length<=temp1)
	  {		flag3=0;
	  		DF_read_page(page_addr,page_start_addr,length);
	  }
	    
	else 
	  { 	temp2=(unsigned int)((length-temp1)/528);
	 	flag3=0;
		DF_read_page(page_addr,page_start_addr,temp1);
 		if(temp2>0)
	  		{	
	  			for(i=0;i<temp2;i++)
	  	   		{
	  	   			page_addr++;
			 		flag3=temp1;
			 		DF_read_page(page_addr,0,528);
		    	} 		
	   			temp3 = (length-temp1)%528;	
	 			page_addr++;
	 			flag3=temp1+temp2*528;
	 			DF_read_page(page_addr,0,temp3);
			}
		else
			{  
				page_addr++;
	  	    		temp5 = length-temp1; 
		   		flag3=temp1;
		   		DF_read_page(page_addr,0,temp5);
			}
	 }
}
void DF_read_page(unsigned int cpage,unsigned int cpage_sta,unsigned int clenth)
{		
		unsigned int temp1,i,temp2;
		check_state();
		DF_FLASH_SELECT;	
		write_spi(MM_PAGE_READ);
		write_spi((unsigned char)(cpage>>6));
		temp1=(unsigned char)(cpage & 0x003F);
	    	temp2=((temp1<<2)|(unsigned char)(cpage_sta>>8));
		write_spi(temp2);
		write_spi((unsigned char)(cpage_sta));
		write_spi(0x00);
		write_spi(0x00);		
		write_spi(0x00);
		write_spi(0x00);
		for (i=flag3;i<( flag3+clenth);i++)
		{
			read_spi();
			DF_buffer[i] = (unsigned char)(ucBuffer & 0xFF);
		}
		DF_FLASH_NOSELECT;
}




⌨️ 快捷键说明

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