📄 nandflashinit.c
字号:
#include "\inc\define.h"
#include "\inc\drives.h"
#include "\inc\NandFlashInit.h"
void NandSignalPort(void);
void NandWriteCommand(unsigned char command);
void NandWriteAddress(unsigned char address);
void NandRWDataInit(void);
void NandWriteData(unsigned char data);
unsigned char NandReadData(void);
void NandInvalid(void);
void NandWait(void);
void NandWCInit(void);
void NandInit(void)
{
NandSignalPort();
NandWriteCommand(0xff);
NandWait();
NandInvalid(); }
unsigned int NandReadID(void)
{
unsigned int ID=0x5555;
NandInit();
NandWriteCommand(0x90);
NandWriteAddress(0x00);
NandRWDataInit();
NandWait();
ID = (unsigned int)NandReadData();
ID = ID << 8;
ID += (unsigned int)NandReadData();
NandInvalid();
return ID;
}
unsigned char NandEraseBlock(unsigned int block)
{
unsigned int page = (block << 5);
unsigned char TF;
NandInit();
NandWriteCommand(0x60);
NandWriteAddress((unsigned char)(page & 0xff));
NandData = (unsigned char)((page>>8) & 0xff);
NandWait();
NandWriteCommand(0xd0);
NandWait();
NandRWDataInit();
NandWait();
NandWriteCommand(0x70);
NandWait();
NandRWDataInit();
TF = NandReadData();
if(TF & 0x01)
{
NandInvalid();
return FAIL;
}
else
{
NandInvalid();
return OK;
}
}
unsigned char NandWritePage(unsigned int block, unsigned char parapage, unsigned char *buffer)
{
unsigned int page = (block<<5) + parapage;
unsigned int i;
NandInit();
NandWriteCommand(0x80);
NandWriteAddress(0x00);
NandWriteAddress((unsigned char)(page));
NandWriteAddress((unsigned char)(page >> 8));
NandWait();
NandRWDataInit();
for(i=0; i<528; i++)
{
NandWriteData(*buffer);
buffer ++;
}
NandWriteCommand(0x10);
NandWait();
NandWriteCommand(0x70);
NandRWDataInit();
NandWait();
if(NandReadData() & 0x01)
{
NandInvalid();
return FAIL;
}
else
{
NandInvalid();
return OK;
}
}
unsigned char NandReadPage(unsigned int block, unsigned char parapage, unsigned char *buffer)
{
unsigned int i, page = (block<<5) + parapage;
NandInit();
NandWriteCommand(0x00);
NandWriteAddress(0x00);
NandWriteAddress((unsigned char)(page));
NandWriteAddress((unsigned char)(page >> 8));
NandWait();
NandRWDataInit();
NandWait();
for(i=0; i<528; i++)
{
*buffer = NandReadData();
buffer ++;
}
return OK;
}
void NandSignalPort(void)
{
rPCONC &= ~(0xff);
rPCONC |= 0x54;
rPUPC &= (0xf0);
}
void NandWCInit(void)
{
rPDATC = (rPDATC&0xf1) | (NandCLE & (~(NandCE|NandALE)));
}
void NandWriteCommand(unsigned char command)
{
rPDATC = (rPDATC&0xf1) | (NandCLE & (~(NandCE|NandALE)));
NandData = command;
}
void NandWriteAddress(unsigned char address)
{
rPDATC = (rPDATC&0xf1) | ((~(NandCLE|NandCE)) & NandALE);
NandData = address;
}
void NandRWDataInit(void)
{
rPDATC = (rPDATC&0xf1) | ( ~(NandCLE|NandCE|NandALE));
}
void NandWriteData(unsigned char data)
{
NandData = data;
}
unsigned char NandReadData(void)
{
return NandData;
}
void NandInvalid(void)
{
rPDATC = (rPDATC&0xf1) | ((~(NandCLE|NandALE)) & NandCE);
}
void NandWait(void)
{
while(!(rPDATC & NandRB));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -