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

📄 dm_nandflash_k9f2g08.c

📁 blackfin 533 的nandflash代码 很基础的
💻 C
字号:
/************************************************************************** 
文件名称: dm_nandflash_k9f2g08.c
作者: Andy
版本: 0.1 
创建时间 : 2007-04 
描述: 
	文件实现了NandFlash 底层读写的功能
修改历史: 
****************************************************************************/ 
#include "stdio.h"
#include "ccblkfn.h"
#include "sysreg.h"
#include "dm_bf5xx.h"
uint8_t Test_Data_Table[];
int32_t bytecount;

/****************************************************************************
* 名称 : Init_TEST_DATA_BUFFER
* 功能 : 生成测试数据
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Init_TEST_DATA_BUFFER(void)
{
	int_t i;
	for(i = 0;i<bytecount;i++)
	{
		Test_Data_Table[i] = i;
	}
}

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

/****************************************************************************
* 名称 : Write_Command
* 功能 : NANDFLASH写命令
* 入口参数 :command
* 出口参数 :无
****************************************************************************/
void Write_Command(uint8_t command)
{
	*pFlash_Commond = command;
	udelay(10);
}

/****************************************************************************
* 名称 : Write_Addr
* 功能 : NANDFLASH写地址 
* 入口参数 :addr
* 出口参数 :无
****************************************************************************/
void Write_Addr(uint8_t addr)
{
	*pFlash_Addr = addr;
	udelay(10);
}


/****************************************************************************
* 名称 : Reset_NAND
* 功能 : 复位NANDFLASH
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Reset_NAND(void)
{
	Write_Command(0xff);
	Wait_NAND_RADY();
}



/****************************************************************************
* 名称 : Read_Chip_ID
* 功能 : 读取芯片ID
* 入口参数 :无
* 出口参数 :false  出错时返回false
****************************************************************************/
void Read_Chip_ID(void)
{
	uint8_t Chip_ID0 ;
	uint8_t Chip_ID1 ;
	Write_Command(0x90);
	Write_Addr(0x00);
	Chip_ID0 = *pFlash_Data;
	Chip_ID1 = *pFlash_Data;
	printf("The Nandflash ID is %X%X\n\r",Chip_ID0,Chip_ID1);
	if(Chip_ID0 == 0xec)
	{
		switch(Chip_ID1)
		{
			case 0xd3 : printf("The Nandflash is 1024M\n\r");
						bytecount = 4096;
			            break;
			case 0xda : printf("The Nandflash is 256M\n\r");
						 bytecount = 2048;
			            break;
			default:	printf("Read ID is ERROR!!!\n\r");
						bytecount = 2048;
						break;
		}
	}
	else
	{
		printf("Read ID is ERROR!!!\n\r");
		bytecount = 2048;				
		return false;
	}
	
}

/****************************************************************************
* 名称 : write_page
* 功能 : 将Buffer中的数据写入地址Page_Address
* 入口参数 :Page_Address,Buffer
* 出口参数 :完成返回true,失败返回false 
****************************************************************************/
bool write_page(uint_t Page_Address,uint8_t *Buffer)
{
	int_t i;
	Write_Command(0x80);
	Write_Addr(0x00);
	Write_Addr(0x00);
	Write_Addr(Page_Address&0xff);
	Write_Addr((Page_Address>>8)&0xff);
	Write_Addr((Page_Address>>16)&0x07);		  	
	for(i = 0;i<bytecount;i++)
	{
		*pFlash_Data = *((uint8_t *)Buffer+i);
		udelay(1);		
	}
	Write_Command(0x10);
	Wait_NAND_RADY();
	return true;
}
/****************************************************************************
* 名称 : read_page
* 功能 : 读取页地址Page_Address的数据512字节,存入Buffer
* 入口参数 :Page_Address,Buffer
* 出口参数 :无
****************************************************************************/
bool read_page(uint_t Page_Address,uint8_t *Buffer1)
{
	int_t i;
	Write_Command(0x00);
	Write_Addr(0x00);
	Write_Addr(0x00);
	Write_Addr(Page_Address&0xff);
	Write_Addr((Page_Address>>8)&0xff);
	Write_Addr((Page_Address>>16)&0x07);
	Write_Command(0x30);
	udelay(200);
	for(i = 0;i<bytecount;i++)
	{
		*((uint8_t *)Buffer1+i) = *pFlash_Data;
	}	
}

/****************************************************************************
* 名称 : Block_Erase
* 功能 : 将块地址Block_Address的块数据擦除。可通过页地址除以32得到块地址
* 入口参数 :Block_Address
* 出口参数 :无
****************************************************************************/
bool  Block_Erase(uint_t Block_Address)
{	
	uint8_t NAND_Data = 0;
	uint_t Page_Address;
	Page_Address = Block_Address<<6;
	Write_Command(0x60);
	Write_Addr(Page_Address&0xff);
	Write_Addr((Page_Address>>8)&0xff);
	Write_Addr((Page_Address>>16)&0x07);
	Write_Command(0xd0);
	Wait_NAND_RADY();
	Write_Command(0x70);
	NAND_Data = *pFlash_Data;
	if(NAND_Data&0x1 != 0)
	{
		return false;
	}
	else
	{
		return true;
	}
}

⌨️ 快捷键说明

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