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

📄 flash.c

📁 杭州立宇泰豪华型44B0开发板
💻 C
字号:

#include "flash.h"
#include "..\Target\44b.h"
#include "..\Target\44blib.h"

#define LASTBLOCK  1023

void ST_CMD(void)
{
   rPDATC =(rPDATC&0xf1)|(Nand_CLE&(~(Nand_CE|Nand_ALE)));
// CLE为高、CE和ALE为低
}
void ST_ADR(void)
{
   rPDATC =(rPDATC&0xf1)|(Nand_ALE&(~(Nand_CE|Nand_CLE)));
// ALE为高、CE和CLE为低
}
void ST_DAT(void)
{
   rPDATC =(rPDATC&0xf1)|( ~(Nand_CE|Nand_CLE| Nand_ALE));
// ALE、CE和CLE全为低
}
void ST_INVALID(void)
{
   rPDATC =(rPDATC&0xf1)|( Nand_CE&(~(Nand_CLE|Nand_ALE)));
// CE为高、ALE和CLE为低
}
void WAIT_RB(void)
{
   while(!(rPDATC & Nand_RB));
}

unsigned int Check_Flash_Id(void)
{
	int i;
	unsigned int id;

	ST_CMD();
	Nand_IO = 0x90;

	ST_ADR();
	Nand_IO = 0;

	ST_DAT();
	for(i=0;i<10;i++);	
	id = Nand_IO<<8;//连续读出两个字节
	id += Nand_IO;
	ST_INVALID();
	return id;
}


void Flash_Reset()		
{ 
	int i;
	//  rPDATC = rPDATC | WP;	
	ST_CMD();
	Nand_IO = 0xff;	
	for (i=0;i<3000;i++);	 	
}
/********************************************************/
/*功能:擦除FLASH的1Block(对应文件系统为1Cluster)          */
/********************************************************/
unsigned char Erase_Block(unsigned int block) 
{
	unsigned int blockPage = (block<<5);
	int i;

	ST_CMD();
	Nand_IO = 0x60;

	ST_ADR();	     
	Nand_IO = blockPage & 0xff;  
	Nand_IO = (blockPage>>8) & 0xff;

	for(i=0;i<2;i++);		
    
	ST_CMD();
	Nand_IO = 0xd0;
    
	for(i=0;i<3;i++);
    
	ST_DAT();
	WAIT_RB();					

	ST_CMD();
	Nand_IO = 0x70;
	ST_DAT();
	if (Nand_IO & 0x1) 
	{
		ST_INVALID();
		return FAIL;
	}
	else 
	{
		ST_INVALID();   
		return OK;
	}
}

/*****************************************************************/
/*功能:读取FLASH的某个Block中的1page数据                           */
/*****************************************************************/
void Read_Page(unsigned int block,unsigned int page,unsigned char *buffer)
{
	int i;
	unsigned int blockPage = (block<<5) + page;

	ST_CMD();               
	Nand_IO = 0x00;
	ST_ADR();
	Nand_IO = 0;
	Nand_IO = blockPage & 0xff;
	Nand_IO = (blockPage>>8) & 0xff;
	for(i=0;i<3;i++);
	ST_DAT();
	WAIT_RB();	
	for(i=0;i<528;i++)
	{
	    *buffer++=Nand_IO;
	}   
	//ReadPage(buffer);		
	ST_INVALID();
}
/*****************************************************************/
/*功能:向FLASH的某个Block中的1page写入数据                         */
/*输出:0:Fail;1:OK                                               */
/*****************************************************************/
int Write_Page(unsigned int block,unsigned int page,unsigned char *buffer)  
{
	unsigned int blockPage = (block<<5) + page;
	int i;
	unsigned char *Source;                                      
	Source=buffer;
	ST_CMD();
	Nand_IO = 0x80;
	ST_ADR();
	Nand_IO = 0;
	Nand_IO = blockPage & 0xff;
	Nand_IO = (blockPage>>8) & 0xff;
	ST_DAT();
	for(i=0;i<528;i++)
	{
	    Nand_IO=*buffer++;
	}        
	//WritePage(buffer); 

	ST_CMD();
	Nand_IO = 0x10;
	for(i=0;i<10;i++);    
                        
	WAIT_RB();	
	Nand_IO = 0x70;
	ST_DAT();
	for(i=0;i<3;i++);  
	if((Nand_IO & 0x1))	
	{
		ST_INVALID();	
		return 0;
	}
	else
	{
		ST_INVALID();
		return 1;	    
	}
}

void Read_ID(void)
{
	unsigned short id;
	id = Check_Flash_Id();
	Uart_Printf("\nChip's ID is 0x%4x.",id);
}
void Erase_test(void)
{
	Uart_Printf("\nBegin to erase the last block...");
	if(Erase_Block(LASTBLOCK))
		Uart_Printf("\nOK! Compeleted.");
	else 
	    Uart_Printf("\nErase error!");
}

void Write_test(void)
{
	int i;
	unsigned char buffer[528];
	for(i=0;i<528;i++)
		buffer[i]=0xaa;
	Uart_Printf("\nBegin to Write the first Page of the last block...");
	if(Write_Page(LASTBLOCK,0,buffer))
	    Uart_Printf("\nOK! Compeleted.");
	else 
	    Uart_Printf("\nWrite error!");
}

void Read_test(void)
{
	int i,j=0;
	unsigned char buffer[528];
	
	Uart_Printf("\nBegin to Read the first Page of the last block...");
	Read_Page(LASTBLOCK,0,buffer);
	for(i=0;i<528;i++)
	{
		if(buffer[i]==0xaa)
			j++;
	}
    Uart_Printf("\n%4d Bytes verify match!",j);

}	    
	

⌨️ 快捷键说明

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