#include "include.h"
/************************NandFlash初始化***********************/
void NandFlash_Init(void)
{
rNFCONF = (1<<12)|(4<<8)|(1<<4)|(0<<0); //BusWidth:8, TWRPH1:1, TWRPH0:4, TACLS:1
rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
//允许控制,NF禁用,初始化ECC,关闭数据区ECC,关闭空闲区ECC,禁止中断,
}
/**********************NandFlash读操作状态*********************/
U16 ReadStatus(void)
{
U16 stat;
WrNFCmd(RDSTATCMD);
do {
stat = RdNFDat();
}while(!(stat&0x40)); //判断I/O[6]=1?等待完成
WrNFCmd(READCMD0); //(K9F1G08U0A)datasheet 34页
return stat&1; //返回I/O[0],若其为0则操作成功
}
/**********************NandFlash读芯片ID***********************/
U32 ReadChipID(void)
{
static U32 id;
NFChipEn(); //NF使能
WrNFCmd(RDIDCMD); //写读id命令
WrNFAddr(0);
while(NFIsBusy()); //等待完成
id = RdNFDat()<<8; //MAKE CODE:0xec (samsung)
id |= RdNFDat(); //DEVICE CODE:0xf1 (K9F1G08U0A)
NFChipDs(); //NF禁用
return id; //id=0xecf1
}
/**********************NandFlash读页数据************************/
void ReadPage(U32 addr, U8 *buf)
{
U16 i;
NFChipEn();
WrNFCmd(READCMD0);
//写入4个地址周期
WrNFAddr(0); //列地址A0~A7
WrNFAddr(0); //列地址A8~A11
WrNFAddr(addr); //行地址A12~A19
WrNFAddr(addr>>8); //行地址A20~A27
WrNFCmd(READCMD1);
InitEcc();
ReadStatus();
for(i=0; i<2048; i++) //读一页2KB数据
buf[i] = RdNFDat();
NFChipDs();
}
/**********************NandFlash写页数据************************/
U32 WritePage(U32 addr, U8 *buf)
{
U32 i, mecc;
U8 stat, tmp[7];
NFChipEn();
WrNFCmd(PROGCMD0);
//写入4个地址周期
WrNFAddr(0);
WrNFAddr(0);
WrNFAddr(addr);
WrNFAddr(addr>>8);
InitEcc(); //生成ECC
MEccUnlock(); //解锁main区ECC
for(i=0; i<2048; i++) //写一页2KB数据
WrNFDat(buf[i]);
MEccLock(); //锁定main区ECC
mecc = RdNFMEcc();
tmp[0] = mecc&0xff;
tmp[1] = (mecc>>8)&0xff;
tmp[2] = (mecc>>16)&0xff;
tmp[3] = (mecc>>24)&0xff;
tmp[5] = 0xff; //mark good block
WrNFDat(0xff);//2048,坏块标志
SEccUnlock(); //解锁spare区ECC
WrNFDat(tmp[0]); //ECC校验码
WrNFDat(tmp[1]);
WrNFDat(tmp[2]);
WrNFDat(tmp[3]);
SEccLock(); //锁定spare区ECC
WrNFCmd(PROGCMD1);
stat = ReadStatus();
NFChipDs();
return ~stat; //返回1则表示页写成功
}
/************************NandFlash块擦除***********************/
U32 EraseBlock(U32 addr)
{
U8 stat;
addr &= ~0x3f; //得到块地址
NFChipEn();
WrNFCmd(ERASECMD0);
WrNFAddr(addr); //地址输入(两个周期)见datasheet 27页
WrNFAddr(addr>>8);
WrNFCmd(ERASECMD1);
stat = ReadStatus();
NFChipDs();
return ~stat; //返回1则表示擦除成功
}
nand.rar_nand 测试
版权申诉
152 浏览量
2022-09-20
18:05:16
上传
评论
收藏 53KB RAR 举报
周楷雯
- 粉丝: 80
- 资源: 1万+
最新资源
- ModStartCMS v8.4.0 框架稳定性持续迭代,修复部分已知问题
- bleder 教室学校学生教育室办公室考试
- 人脸检测-使用OpenCV实现的动漫+漫画人脸检测算法-附项目源码-优质项目实战.zip
- 道路贴图,材质材料免费
- 人脸检测-基于OpenCV+Node.js+WebSockets实现的实时人脸检测应用-附项目源码-优质项目实战.zip
- 一些常见的MySQL死锁案例-mysql-deadlocks-master(源代码+案例+图解说明)
- UE4动画烘焙器-ue4.27
- 新建文件夹.zip
- 1103a2a791bbd96ea98021062e327495b1c422e32fb27e0c2d6404b1bd74b692.gif
- 同城相亲交友php小程序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈