?? nand.c
字號:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: Nand.c
** Last modified Date: 2007-9-20
** Last Version: 1.0
** Descriptions: 對Nand型Flash K9F28XXUOC進行編程、擦除等操作
**
**------------------------------------------------------------------------------------------------------
** Created by: Yuping Wang
** Created date: 2007-9-20
** Version: 1.0
** Descriptions: The original version 初始版本
**
**------------------------------------------------------------------------------------------------------
** Modified by: 楊市平
** Modified date: 2008-03-18
** Version: V1.1
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#define __GLOBAL_NAND
#define __DATA (*((volatile uint8 *)0x83000000)) /* 數(shù)據(jù)操作的存儲器地址 */
#define __ADDR (*((volatile uint8 *)0x83080000)) /* 地址輸入的存儲器地址 */
#define __COMMAND (*((volatile uint8 *)0x83100000)) /* 命令輸入的存儲器地址 */
/*********************************************************************************************************
** Function name: nandReadStatus
**
** Descriptions: 讀Nand Flash的狀態(tài)
**
**
** input parameters: 無
** Returned value: 當前Nand
**
** Created by: 楊市平
** Created Date: 2008/03/18
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 nandReadStatus (void)
{
uint8 ucReturn;
ucReturn = 0xff;
__COMMAND = K9FXX_READ_STATUS; /* 輸入讀狀態(tài)命令70H */
ucReturn = __DATA; /* 讀狀態(tài)數(shù)據(jù) */
return ucReturn;
}
/*********************************************************************************************************
** Function name: nandOK
**
** Descriptions: 判斷芯片操作是否完成
**
**
** input parameters: 無
** Returned value: TURE: 完成
** FALSE: 失敗
** Created by: 楊市平
** Created Date: 2008/03/18
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 nandOK (void)
{
uint8 ucTemp;
while (1) {
ucTemp = nandReadStatus(); /* 讀Nand Flash的當前狀態(tài) */
ucTemp = ucTemp & K9FXX_BUSY;
if ((ucTemp & K9FXX_BUSY) != 0) {
break;
}
ucTemp = nandReadStatus(); /* 讀Nand Flash的操作是否成功 */
if ((ucTemp & K9FXX_OK) == 0) {
return TRUE;
}
else {
return FALSE;
}
}
/*********************************************************************************************************
** Function name: nandSectorReadA
**
** Descriptions: 讀芯片扇區(qū)
**
**
** input parameters: pucBuf: 指向緩存的指針,大小必須>=512字節(jié)
** uiCoL : 以列地址的索引
uiRow : 以頁面為單位的索引
uiNum : 寫入的字節(jié)數(shù)
** Returned value: 無
**
** Created by: 楊市平
** Created Date: 2008/03/18
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void nandSectorReadA (uint8 *pucBuf, uint32 uiCol, uint8 uiRow, uint32 uiNum)
{
uint32 i;
__COMMAND = K9FXX_SET_ADDR_A; /* 讀頁操作的指令00H */
__ADDR = uiCol;
/* 一字節(jié)列地址 */
__ADDR = (uint8)(uiRow & 0xff); /* 兩字節(jié)的行地址 */
__ADDR = (uint8)((uiRow >> 8) & 0xff);
while (1) {
if ((nandReadStatus() & K9FXX_BUSY) != 0) { // 讀Nand Flash的當前狀態(tài)
break;
}
}
__COMMAND = K9FXX_SET_ADDR_A;
i = uiNum;
do { /* 讀出數(shù)據(jù) */
*pucBuf++ = __DATA;
} while(--i != 0);
}
/*********************************************************************************************************
** Function name: nandSectorCRead
**
** Descriptions: 讀芯片C區(qū)
**
**
** input parameters: pucBuf: 指向緩存的指針,大小必須>=16字節(jié)
** uiCoL : 以列地址的索引
uiRow : 以頁面為單位的索引
uiCNum : 寫入的字節(jié)數(shù)
** Returned value: 無
** Created by: 楊市平
** Created Date: 2008/03/18
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void nandSectorCRead (uint8 *pucBuf, uint32 uiCol, uint8 uiRow, uint32 uiCNum)
{
uint32 i;
__COMMAND = K9FXX_SET_ADDR_C; /* 讀頁操作空閑區(qū)(C)的指令50H */
__ADDR = uiCol; /* 一字節(jié)列地址 */
__ADDR = (uint8)(uiRow & 0xff); /* 兩字節(jié)的行地址 */
__ADDR = (uint8)((uiRow >> 8) & 0xff);
while (1) {
if ((nandReadStatus() & K9FXX_BUSY) != 0) { // 讀Nand Flash的當前狀態(tài)
break;
}
}
__COMMAND = K9FXX_SET_ADDR_C;
i = uiCNum;
do {
*pucBuf++ = __DATA; /* 讀出數(shù)據(jù) */
} while(--i != 0);
}
/*********************************************************************************************************
** Function name: nandSectorProgram
**
** Descriptions: 編程芯片扇區(qū)
**
**
** input parameters: pucBuf: 指向要存數(shù)據(jù)的指針,大小必須>=512字節(jié)
** uiCoL : 以列地址的索引
uiRow : 以頁面為單位的索引
uiNum : 寫入的字節(jié)數(shù)
** Returned value: TURE: 成功
** FALSE: 失敗
** Created by: 楊市平
** Created Date: 2008/03/18
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 nandSectorProgram (uint8 *pucBuf, uint32 uiCol, uint8 uiRow, uint32 uiNum)
{
uint32 i;
uint8 *pucStr;
pucStr = pucBuf;
__COMMAND = K9FXX_SET_ADDR_A; /* 定位到A區(qū)指令00H */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -