📄 nan.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 + -