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

📄 nan.c

📁 这是一个片内flash的驱动程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                      
**                                          
**                     **                               杭州央海软件科技有限公司(armgcc@foxmail.com)
**
**                                 http://www.armgcc.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: nan.c
** 创 建 人: 罗辉联 	
** 创建日期: 2007年11月10日
** 描    述: 该文件包含了所有NAN  FLASH  功能函数原型与所需要的常量
**
** 技术顾问: 楼东武(副教授)  浙江大学信电系
**
**---------- 版本信息-----------------------------------------------------------------------------------
** 版    本: V1.0
** 说    明: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/


#include "config.h"

/******************************************* 全局变量定义 ***********************************************/

//用于存放NAN FLASH 坏块信息
UINT8	nan_valid_block_bitmap[NAN_BLOCKS>>3] = {0};

/******************************************* 局部函数声明 ***********************************************/

/*********************************************************************************************************
** 函数名称: 	nan_get_id
** 功能描述: 	获取NAN FLASH ID 信息
** 
** 参    数: 	无
**  
** 返 回 值: 		32 位ID
**         
** 作   者: 	李海军
** 日   期: 	2006年6月14日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT32 nan_get_id(void)
{
	UINT32	id = 0;


	NAN_WRITE_COMMAND(0x90);
	NAN_WRITE_ADDRESS(0);
	
	id += 	NAN_READ_DATA();
	id <<= 	8;
	id += 	NAN_READ_DATA();
	id <<= 	8;
	id += 	NAN_READ_DATA();
	id <<= 	8;
	id += 	NAN_READ_DATA();

	return id;
}

/*********************************************************************************************************
** 函数名称: 	nan_read_status
** 功能描述: 	获取NAN FLASH 状态信息
** 
** 参    数: 	无
**  
** 返 回 值: 		8 位状态
**         
** 作   者: 	李海军
** 日   期: 	2006年6月14日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 nan_read_status(void)
{
	NAN_WRITE_COMMAND(0x70);
	
	return NAN_READ_DATA();
}

/*********************************************************************************************************
** 函数名称: 	nan_poll_bad_blocks
** 功能描述: 	查询NAN 坏块并保存在缓存区里
** 
** 参    数: 	无
**  
** 返 回 值: 	无
**         
** 作   者: 	李海军
** 日   期: 	2006年6月14日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void nan_poll_bad_blocks(void)
{
	UINT16	block_num = 0;
	UINT8	temp = 0;
	BOOL	block_valid = TRUE;
	UINT32	page_num = 0;

	for(block_num = 0; block_num < (NAN_BLOCKS >> 3); block_num++)
		nan_valid_block_bitmap[block_num] = 0;
	
	for(block_num = 0; block_num < NAN_BLOCKS; block_num++)
	{
		//uart_printf("nan_poll_bad_blocks");
		
		page_num 	= block_num * NAN_PAGE_PER_BLOCK;
		block_valid 	= TRUE;

		for(temp = 0; temp < 2; temp++)
		{
			NAN_WRITE_COMMAND(0x50);
			NAN_WRITE_ADDRESS(5);
			NAN_WRITE_ADDRESS(page_num&0xff);
			NAN_WRITE_ADDRESS((page_num>>8)&0xff);
			NAN_WRITE_ADDRESS((page_num>>16)&0x01);
			page_num++;

			while(0 == NAN_GET_RB) ;

			if(0xff != NAN_READ_DATA())
			{
				block_valid = FALSE;
				break;
			}
		}

		nan_valid_block_bitmap[block_num / 8] |=	block_valid << (block_num % 8);	
	
	}
}

/*********************************************************************************************************
** 函数名称: 	nan_earse
** 功能描述: 	块擦除
** 
** 参    数: 		block -> 要擦除的块
**  
** 返 回 值: 		错误信息或成功
**         
** 作   者: 	李海军
** 日   期: 	2006年6月14日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
NAN_RETURN_T nan_earse(UINT32 block)
{
	UINT32	time = 0;

	uart_printf("block = %d",block);
	
	if(block >= NAN_BLOCKS)
		return NAN_PARA_ERROR;

	if(0 == nan_valid_block_bitmap[block / 8] & (1 << (block % 8)))
		return NAN_BLOCK_ERROR;
	
	NAN_WRITE_COMMAND(0x60);
	ns_sleep(10);
	NAN_WRITE_ADDRESS((block<<5)&0xff);
	NAN_WRITE_ADDRESS((block>>3)&0xff);
	NAN_WRITE_ADDRESS((block>>11)&0x01);
	
	NAN_WRITE_COMMAND(0xd0);
	
	for(time = 0; time < 0xffff; time ++)
	{
		if((1 == NAN_GET_RB))
			break;
	}
	
	if(time >= 0xffff)
		return NAN_TIMEOUT;

	if(0x01&nan_read_status())
		return NAN_PROGRAM_ERROR;	
	else
		return NAN_SUCCESS;
	
}

/*********************************************************************************************************
** 函数名称: 	nan_program
** 功能描述: 	写入数据到指定的地方
** 
** 参    数: 
**		page 	-> 	页地址			  		
**		column 	-> 	页中起始地址 0 - 527
**		p_data	->	要写入的数据指针
**		size		->	数据大小
**
** 返 回 值: 		错误信息或成功
**         
** 作   者: 	李海军
** 日   期: 	2006年6月14日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
NAN_RETURN_T nan_program(UINT32 page, UINT16 column, UINT8 * p_data, UINT16 size)
{
	UINT32	i = 0;
	UINT8 * p_temp = (UINT8 *)p_data;
	UINT32	time = 0;
	UINT8  	temp = 0;
	
	//uart_printf("page = %d",page);
	
	if((page >= NAN_PAGES) ||(column + size > NAN_PAGE_SIZE))
		return NAN_PARA_ERROR;

	if(column >= NAN_SPARE_ADDRESS)
	{
		column -= NAN_SPARE_ADDRESS;
		NAN_WRITE_COMMAND(0x50);
	}	
	else if(column >= NAN_HALF_ADDRESS)
	{
		column -= NAN_HALF_ADDRESS;
		NAN_WRITE_COMMAND(0x01);
	}
	else
	{
		NAN_WRITE_COMMAND(0x00);
	}
		
	NAN_WRITE_COMMAND(0x80);
	
	NAN_WRITE_ADDRESS(column&0xff);
	NAN_WRITE_ADDRESS(page&0xff);
	NAN_WRITE_ADDRESS((page>>8)&0xff);
	NAN_WRITE_ADDRESS((page>>16)&0x01);
	ns_sleep(10);
	//for(i = 0; i < NAN_PAGE_SIZE; i++)
	for(i = 0; i < size; i++)
		NAN_WRITE_DATA(*p_temp++);
	
	NAN_WRITE_COMMAND(0x10);
	
	for(time = 0; time < 0xffff; time ++)
	{
		if((1 == NAN_GET_RB))
			break;
	}
	
	if(time >= 0xffff)
		return NAN_TIMEOUT;
	
	if(0x01&nan_read_status())
		return NAN_PROGRAM_ERROR;	
	else
		return NAN_SUCCESS;

}

/*********************************************************************************************************
** 函数名称: 	nan_read
** 功能描述: 	读NAN  内的数据到指定的地方
** 
** 参    数: 		
**		column 	-> 	页中起始地址 0 - 527
**		page 	-> 	页地址			  
**		p_buf	->	数据存放指针
**		size		->	数据大小
**
** 返 回 值: 		错误信息或成功
**         
** 作   者: 	李海军
** 日   期: 	2006年6月14日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
NAN_RETURN_T nan_read(UINT32 page, UINT16 column, UINT8 * p_buf, UINT16 size)
{
	UINT32	i = 0;

	//uart_printf("page = %d",page);

	if((page >= NAN_PAGES) ||(column + size > NAN_PAGE_SIZE))
		return NAN_PARA_ERROR;

	if(column >= NAN_SPARE_ADDRESS)
	{
		column -= NAN_SPARE_ADDRESS;
		NAN_WRITE_COMMAND(0x50);
	}	
	else if(column >= NAN_HALF_ADDRESS)
	{
		column -= NAN_HALF_ADDRESS;
		NAN_WRITE_COMMAND(0x01);
	}
	else
	{
		NAN_WRITE_COMMAND(0x00);
	}

	NAN_WRITE_ADDRESS(column&0xff);
	NAN_WRITE_ADDRESS(page&0xff);
	NAN_WRITE_ADDRESS((page>>8)&0xff);
	NAN_WRITE_ADDRESS((page>>16)&0x01);

	while(0 == NAN_GET_RB) ;

	for(i = 0; i < size; i++)
		*p_buf++ = NAN_READ_DATA();

	return NAN_SUCCESS;
}

/*********************************************************************************************************
** 函数名称: 	nan_copy_back
** 功能描述: 	NAN 中同一通道页拷贝
** 
** 参    数: 		
**		src_page 	-> 	源页地址
**		dest_page 	-> 	目标页地址			
**
** 返 回 值: 		错误信息或成功
**         
** 作   者: 	李海军
** 日   期: 	2006年6月14日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
NAN_RETURN_T nan_copy_back(UINT32 src_page, UINT32 dest_page)
{
	UINT32 time = 0;

	if(	(src_page >= NAN_PAGES) |(dest_page >= NAN_PAGES) |	(src_page&0xc0 != dest_page&0xc0))
		return NAN_PARA_ERROR;
	
	NAN_WRITE_COMMAND(0x00);

	NAN_WRITE_ADDRESS(0);
	NAN_WRITE_ADDRESS(src_page&0xff);
	NAN_WRITE_ADDRESS((src_page>>8)&0xff);
	NAN_WRITE_ADDRESS((src_page>>16)&0x01);

	while(0 == NAN_GET_RB) ;

	NAN_WRITE_COMMAND(0x8a);

	NAN_WRITE_ADDRESS(0);
	NAN_WRITE_ADDRESS(dest_page&0xff);
	NAN_WRITE_ADDRESS((dest_page>>8)&0xff);
	NAN_WRITE_ADDRESS((dest_page>>16)&0x01);
	
	NAN_WRITE_COMMAND(0x10);
	
	for(time = 0; time < 0xffff; time ++)
	{
		if((1 == NAN_GET_RB))
			break;
	}
	
	if(time >= 0xffff)
		return NAN_TIMEOUT;

	if(0x01&nan_read_status())
		return NAN_COPY_ERROR;	
	else
		return NAN_SUCCESS;	

}

⌨️ 快捷键说明

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