?? 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 + -