📄 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)) /* 数据操作的存储器地址 */
#define __ADDR (*((volatile uint8 *)0x83080000)) /* 地址输入的存储器地址 */
#define __COMMAND (*((volatile uint8 *)0x83100000)) /* 命令输入的存储器地址 */
/*********************************************************************************************************
** Function name: nandReadStatus
**
** Descriptions: 读Nand Flash的状态
**
**
** 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; /* 输入读状态命令70H */
ucReturn = __DATA; /* 读状态数据 */
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的当前状态 */
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: 读芯片扇区
**
**
** input parameters: pucBuf: 指向缓存的指针,大小必须>=512字节
** uiCoL : 以列地址的索引
uiRow : 以页面为单位的索引
uiNum : 写入的字节数
** 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;
/* 一字节列地址 */
__ADDR = (uint8)(uiRow & 0xff); /* 两字节的行地址 */
__ADDR = (uint8)((uiRow >> 8) & 0xff);
while (1) {
if ((nandReadStatus() & K9FXX_BUSY) != 0) { // 读Nand Flash的当前状态
break;
}
}
__COMMAND = K9FXX_SET_ADDR_A;
i = uiNum;
do { /* 读出数据 */
*pucBuf++ = __DATA;
} while(--i != 0);
}
/*********************************************************************************************************
** Function name: nandSectorCRead
**
** Descriptions: 读芯片C区
**
**
** input parameters: pucBuf: 指向缓存的指针,大小必须>=16字节
** uiCoL : 以列地址的索引
uiRow : 以页面为单位的索引
uiCNum : 写入的字节数
** 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; /* 读页操作空闲区(C)的指令50H */
__ADDR = uiCol; /* 一字节列地址 */
__ADDR = (uint8)(uiRow & 0xff); /* 两字节的行地址 */
__ADDR = (uint8)((uiRow >> 8) & 0xff);
while (1) {
if ((nandReadStatus() & K9FXX_BUSY) != 0) { // 读Nand Flash的当前状态
break;
}
}
__COMMAND = K9FXX_SET_ADDR_C;
i = uiCNum;
do {
*pucBuf++ = __DATA; /* 读出数据 */
} while(--i != 0);
}
/*********************************************************************************************************
** Function name: nandSectorProgram
**
** Descriptions: 编程芯片扇区
**
**
** input parameters: pucBuf: 指向要存数据的指针,大小必须>=512字节
** uiCoL : 以列地址的索引
uiRow : 以页面为单位的索引
uiNum : 写入的字节数
** 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区指令00H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -