s3c2440 K9F2G NandFlash

15 篇文章 1 订阅
2 篇文章 0 订阅

我的NandFlash具体型号是:

K9F2G08U0C

希望访问NandFlash的数据,发现NandFlash的配置非常容易:

 

NFCONF = (2<<12) | (2<<8) | (1<<4);

NFCONT = (1<<4) | (1<<1) | (1<<0);

手册上说,需要reset, 可以加上

    //nand reset
    {
        int k = 0;
        NFCONT &= ~(1<<1);
        while(k++ < 10);
        NFCMMD = 0xff;
        while (!(NFSTAT & 1));
        NFCONT |= 1<<1;
    }

这样就可以访问NandFlash了,datasheet很重要,此flash读数据需要5个地址指令。

我自己定义的函数:

nand_address_cmd(unsigned int address)

如果地址是0,没有问题,可以正确读取从Flash0x0开始的地址,但是如果

nand_address_cmd(4096);

希望读取从4096开始的数据,发现不正确,经过调试,查找资料,终于发现原来的方法有问题,如下:

nand_address_cmd(unsigned int address)

{

  unsigned char ch;

  ch = address & 0xFF;

  NFADDR = ch;

  ch = (address >> 8) & 0x0F;

  NFADDR = ch;

  ch = (address >> 12)& 0xFF;

  NFADDR = ch;

  ch = (address >> 20) & 0xFF;

  NFADDR = ch;

  ch = (address >> 28) & 0x01;

  NFADDR = ch;

}

修改以后:

#define NAND_SECTOR_SIZE_LP    2048
#define NAND_BLOCK_MASK_LP     (NAND_SECTOR_SIZE_LP - 1)

        unsigned int ch;

        unsigned int col  = address & NAND_BLOCK_MASK_LP;
        unsigned page = address / NAND_SECTOR_SIZE_LP;

        ch = col & 0xff;
        NFADDR = ch;
        ch = (col >> 8) & 0x0f;
        NFADDR = ch;
        ch = page & 0xff;
        NFADDR = ch;
        ch = (page >> 8) & 0xff;
        NFADDR = ch;
        ch = (page >> 16) & 0x01;
        NFADDR = ch;

原因在于地址的读取顺序,先列,后行,所以需要转换。大家可以在网上搜索找到更加详细的分析,我就不献丑了。

 

另外补充一点:

发现网上资料好多都是抄袭,丫的,明明s3c2440手册定义:

NFDATA 一次读取的int,不是char,

s3c2410读取的才是char,

大家不要搞错了,发现国人抄袭严重啊,却不真正实践。

 

发现不能上传源代码,没法与大家共享代码了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值