📄 nandflib.c
字号:
/****************************************************************
* ARMSYS S3C44B0X NandFLASH lib *
****************************************************************
1.2005.5.16:: NandFLASH lib
***************************************************************/
#include "..\target\44b.h"
#include "..\target\44blib.h"
#include "..\nandflash\nandFlib.h"
#define LANANDBLOCK 1023
void NAND_CMD(void)
{
rPDATC =(rPDATC&0xf1)|(Nand_CLE&(~(Nand_CE|Nand_ALE)));
// CLE为高、CE和ALE为低
}
void NAND_ADR(void)
{
rPDATC =(rPDATC&0xf1)|(Nand_ALE&(~(Nand_CE|Nand_CLE)));
// ALE为高、CE和CLE为低
}
void NAND_DAT(void)
{
rPDATC =(rPDATC&0xf1)|( ~(Nand_CE|Nand_CLE| Nand_ALE));
// ALE、CE和CLE全为低
}
void NAND_INVALID(void)
{
rPDATC =(rPDATC&0xf1)|( Nand_CE&(~(Nand_CLE|Nand_ALE)));
// CE为高、ALE和CLE为低
}
void WAIT_RB(void)
{
while(!(rPDATC & Nand_RB));
}
unsigned int Check_Flash_Id(void)
{
int i;
unsigned int id;
NAND_CMD();
Nand_IO = 0x90;
NAND_ADR();
Nand_IO = 0;
NAND_DAT();
for(i=0;i<10;i++);
id = Nand_IO<<8;//连续读出两个字节
id += Nand_IO;
NAND_INVALID();
return id;
}
void Flash_Reset()
{
int i;
// rPDATC = rPDATC | WP;
NAND_CMD();
Nand_IO = 0xff;
for (i=0;i<3000;i++);
}
/********************************************************/
/*功能:擦除FLASH的1Block(对应文件系统为1CluNANDer) */
/********************************************************/
unsigned char Erase_Cluster(unsigned int block)
{
unsigned int blockPage = (block<<5);
int i;
NAND_CMD();
Nand_IO = 0x60;
NAND_ADR();
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
for(i=0;i<2;i++);
NAND_CMD();
Nand_IO = 0xd0;
for(i=0;i<3;i++);
NAND_DAT();
WAIT_RB();
NAND_CMD();
Nand_IO = 0x70;
NAND_DAT();
if (Nand_IO & 0x1)
{
NAND_INVALID();
return FAIL;
}
else
{
NAND_INVALID();
return OK;
}
}
/*****************************************************************/
/*功能:读取FLASH的某个Block中的1page数据 */
/*****************************************************************/
void ReadPage(unsigned int block,unsigned int page,unsigned char *buffer)
{
int i;
unsigned int blockPage = (block<<5) + page;
NAND_CMD();
Nand_IO = 0x00;
NAND_ADR();
Nand_IO = 0;
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
for(i=0;i<3;i++);
NAND_DAT();
WAIT_RB();
for(i=0;i<528;i++)
{
*buffer++=Nand_IO;
}
//ReadPage(buffer);
NAND_INVALID();
}
/*****************************************************************/
/*功能:向FLASH的某个Block中的1page写入数据 */
/*输出:0:Fail;1:OK */
/*****************************************************************/
int WritePage(unsigned int block,unsigned int page,unsigned char *buffer)
{
unsigned int blockPage = (block<<5) + page;
int i;
unsigned char *Source;
Source=buffer;
NAND_CMD();
Nand_IO = 0x80;
NAND_ADR();
Nand_IO = 0;
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
NAND_DAT();
for(i=0;i<528;i++)
{
Nand_IO=*buffer++;
}
//WritePage(buffer);
NAND_CMD();
Nand_IO = 0x10;
for(i=0;i<10;i++);
WAIT_RB();
Nand_IO = 0x70;
NAND_DAT();
for(i=0;i<3;i++);
if((Nand_IO & 0x1))
{
NAND_INVALID();
return 0;
}
else
{
NAND_INVALID();
return 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -