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

📄 nand.c

📁 BF561外挂NANDFLASH
💻 C
字号:
#include "stdio.h"
#include "ccblkfn.h"
#include "sysreg.h"
#include "bf5xx.h"
#include "CPLD.h"

unsigned char Test_Data_Table[];
void Init_TEST_DATA_BUFFER(void)
{
	int i;
	for(i = 0;i<512;i++)
	{
		Test_Data_Table[i] = i;
	}
}






/****************************************************************************
* 名称 : Wait_NAND_RADY
* 功能 : 判断NANDFLASH 忙状态
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
bool Wait_NAND_RADY(void)
{
	while(!(*pFIO2_FLAG_D & NAND_RDY));
}


/****************************************************************************
* 名称 : Write_NAND_FLASH
* 功能 : 将数据送入NANDFLASH
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Write_NAND_FLASH(unsigned char Write_Data)
{
	*pNAND_BaseaAddr = Write_Data;
	udelay(10);
}


/****************************************************************************
* 名称 : NAND_Finish
* 功能 : 关闭控制线
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void NAND_Finish(void)
{
	Set_CE(1);
	Set_CLE(0);
	Set_ALE(0);
}

/****************************************************************************
* 名称 : Write_Command
* 功能 : NANDFLASH写命令
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Write_Command(unsigned char command)
{
	Set_CE(0);
	Set_CLE(1);
	if(command == 0x10)
		{
			Write_NAND_FLASH(command);
		}
	else
		{
			Write_NAND_FLASH(command);
			Set_CLE(0);
		}
}

/****************************************************************************
* 名称 : Reset_NAND
* 功能 : 复位NANDFLASH
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Reset_NAND(void)
{
	Write_Command(0xff);
	Wait_NAND_RADY();
	NAND_Finish();
}
/****************************************************************************
* 名称 : Read_Chip_ID
* 功能 : 读取芯片ID
* 入口参数 :无
* 出口参数 :正确返回true,错误返回false
****************************************************************************/
bool Read_Chip_ID(void)
{
	unsigned char Chip_ID0 ;
	unsigned char Chip_ID1 ;
	Write_Command(0x90);
	Set_ALE(1);
	Write_NAND_FLASH(0x00);
	Set_ALE(0);
	udelay(10);
	Chip_ID0 = *pNAND_BaseaAddr;
	udelay(10);
	Chip_ID1 = *pNAND_BaseaAddr;
	udelay(10);
	NAND_Finish();
	printf("ID is %x%x\n\r",Chip_ID0,Chip_ID1);
	if(Chip_ID0 != 0xec)	//Maker code
	{
		return false;
	}
	else if(Chip_ID1 != 0x76) //Device code
	{
		return false;
	}
	else
	{
		printf("Read ID Test is OK!\n\r");
		return true;
	}
}

/****************************************************************************
* 名称 : write_page
* 功能 : 将Buffer中的数据写入地址Page_Address
* 入口参数 :Page_Address,Buffer
* 出口参数 :完成返回true,失败返回false 
****************************************************************************/
bool write_page(unsigned int Page_Address,unsigned char *Buffer)
{
	int i;
	unsigned char NAND_Data;
	Write_Command(0x80);
	Set_ALE(1);
	Write_NAND_FLASH(0x00);
	Write_NAND_FLASH(Page_Address);
	Write_NAND_FLASH((Page_Address>>8)&0xff);
	Write_NAND_FLASH((Page_Address>>16)&0xff);
	Set_ALE(0);			  
	Wait_NAND_RADY();	
	for(i = 0;i<512;i++)
	{
		*pNAND_BaseaAddr = Buffer[i];
		udelay(10);		
	}
	Write_Command(0x10);
	Wait_NAND_RADY();
	Write_Command(0x70);
	NAND_Data = *pNAND_BaseaAddr;
	NAND_Finish();
	if(NAND_Data != 0xc0)
	{
		return false;
	}
	else
	{
		return true;
	}
}
/****************************************************************************
* 名称 : read_page
* 功能 : 读取页地址Page_Address的数据512字节,存入Buffer
* 入口参数 :Page_Address,Buffer
* 出口参数 :无
****************************************************************************/
bool read_page(unsigned int Page_Address,unsigned char *Buffer)
{
	int i;
	Write_Command(0x00);
	Set_ALE(1);
	Write_NAND_FLASH(0x00);
	Write_NAND_FLASH(Page_Address);
	Write_NAND_FLASH((Page_Address>>8)&0xff);
	Write_NAND_FLASH((Page_Address>>16)&0xff);
	Set_ALE(0);
	Wait_NAND_RADY();
	for(i = 0;i<512;i++)
	{
		Buffer[i] = *pNAND_BaseaAddr;
		udelay(10);
	}
	NAND_Finish();	
}

/****************************************************************************
* 名称 : Block_Erase
* 功能 : 将块地址Block_Address的块数据擦除。可通过页地址除以32得到块地址
* 入口参数 :Block_Address
* 出口参数 :无
****************************************************************************/
bool  Block_Erase(unsigned int Block_Address)
{	
	unsigned char NAND_Data = 0;
	Set_CE(0);
	Write_Command(0x60);
	Set_ALE(1);
	Write_NAND_FLASH((Block_Address<<5)&0xff);
	Write_NAND_FLASH((Block_Address>>3)&0xff);
	Write_NAND_FLASH((Block_Address>>11)&0xff);
	Set_ALE(0);
	Write_Command(0xd0);
	Wait_NAND_RADY();
	Write_Command(0x70);
	NAND_Data = *pNAND_BaseaAddr;
	NAND_Finish();
	if(NAND_Data&0x1 != 0)
	{
		return false;
	}
	else
	{
		return true;
	}
}

⌨️ 快捷键说明

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