NAND.c

来源:互联网 发布:工作计划制定软件 编辑:程序博客网 时间:2024/06/04 20:10
#include "nand.h"
//#include "printf.h"




static void NF_Reset()
{

NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_RESET);
NF_Check_Busy();
NF_Disable();
}


#define TACLS   1
#define TWRPH0  4
#define TWRPH1  0
void NF_Init(void)
{

rGPACON &= ~(0x3f << 17);

rGPACON |= (0x3f << 17);

rNFCONF = (TACLS << 12)|(TWRPH0 << 8)|(TWRPH1 << 4);

rNFCONT = (0 << 12) | (1 << 0);

rNFSTAT = 0;

NF_Reset();

}


void NF_WritePage(unsigned int block , unsigned int page,unsigned char *buffer)
{
unsigned int i;
unsigned int blockPage = (block << 6) + page;
unsigned char *bufPt = buffer;

NF_Reset();
NF_Enable();
NF_Enable_RB();

NF_Send_Cmd(NAND_CMD_WRITE1);
NF_Send_Addr(0x00);
NF_Send_Addr(0x00);
NF_Send_Addr(blockPage & 0xff);
NF_Send_Addr((blockPage >> 8) & 0xff);
NF_Send_Addr((blockPage >> 16) & 0x01);
for(i = 0; i < 2048; i++)
{
NF_Send_Data(*bufPt++);
}
NF_Send_Cmd(NAND_CMD_WRITE2);
NF_Check_Busy();
NF_Disable();
}


void NF_ReadPage(unsigned int block ,unsigned int page,unsigned char *dstaddr)
{
unsigned int i;
unsigned int blockPage = (block << 6) + page;
NF_Reset();
NF_Enable();
NF_Enable_RB();

NF_Send_Cmd(NAND_CMD_READ0);
NF_Send_Addr(0x00);
NF_Send_Addr(0x00);
NF_Send_Addr(blockPage & 0xff);
NF_Send_Addr((blockPage >> 8) & 0xff);
NF_Send_Addr((blockPage >> 16) & 0x01);
NF_Send_Cmd(NAND_CMD_READSTART);
NF_Check_Busy();
for(i = 0; i < 2048; i++)
{
dstaddr[i] = NF_Read_Byte();
}
NF_Disable();
}


void NF_EraseBlock(unsigned int block)
{
unsigned int blocknum = block << 6;
NF_Reset();
NF_Enable();
NF_Enable_RB();

NF_Send_Cmd(NAND_CMD_ERASE1);
NF_Send_Addr(blocknum & 0xff);
NF_Send_Addr((blocknum >> 8) & 0xff);
NF_Send_Addr((blocknum >> 16) & 0xff);
NF_Send_Cmd(NAND_CMD_ERASE2);

NF_Check_Busy();
NF_Disable();

}
0 0