📄 nan.c
字号:
/****************************************Copyright (c)**************************************************
**
** 公 司
** 部 门
**
** http://www.osmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: nan.c
** 创 建 人: 李海军
** 创建日期: 2006年6月14日
** 描 述: 该文件提供外部NAN FLASH 的所有操作
**
**--------------历史版本--------------------------------------------------------------------------------
** 创 建 人: 李海军
** 版 本: V1.0
** 日 期: 2006年6月14日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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;
uart_printf("time1 = %d",time);
if(0x01&nan_read_status())
return NAN_PROGRAM_ERROR;
else
return NAN_SUCCESS;
}
/*********************************************************************************************************
;** 函数名称: nan_program
;** 功能描述: 写入数据到指定的地方
;**
;** 参 数:
;** column -> 页中起始地址 0 - 527
;** page -> 页地址
;** p_data -> 要写入的数据指针
;** size -> 数据大小
;**
;** 返 回 值: 错误信息或成功
;**
;** 作 者: 李海军
;** 日 期: 2006年6月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
NAN_RETURN_T nan_program(UINT16 column, UINT32 page, 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(UINT16 column, UINT32 page, 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 + -