s3c2440 K9F2G NandFlash

本文讨论了如何正确访问NandFlash存储设备的地址问题,并提供了改进后的代码实现。通过调整地址读取顺序,解决了从特定地址读取数据时出现的错误。同时,强调了正确理解手册中关于数据类型的重要性和避免抄袭的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的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,

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

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值