天嵌 ARM开发社区

 找回密码
 注册
查看: 3618|回复: 4

裸奔,nandflash读取问题,求助!

[复制链接]
chenhaiyang 发表于 2010-8-17 00:00:09 | 显示全部楼层 |阅读模式
参考网上的2440的nandflash的读写,自己写了一个裸奔读取nandflash的程序,可是读出来的数据是错误的,希望大侠们帮忙查一下错误:

/************************* NAND FLASH Registers ***************/
// NAND FLASH CONFIGURATION REGISTER(NFCONF)
#define        R_NFCONF        (*((volatile unsigned long *)0x4e000000))
// CONTROL REGISTER
#define        R_NFCONT        (*((volatile unsigned long *)0x4e000004))
// COMMAND REGISTER
#define        R_NFCMMD        (*((volatile unsigned long *)0x4e000008))
// DATA REGISTER
#define        R_NFDATA        (*((volatile unsigned long *)0x4e000010))
// ADDRESS REGISTER
#define        R_NFADDR        (*((volatile unsigned long *)0x4e00000c))
// NFCON STATUS REGISTER
#define        R_NFSTAT        (*((volatile unsigned long *)0x4e000020))
/**************************************************************/
#define        NAND_FLASH_BLOCK_SIZE                        512                                                                        // nand flash bock size
#define        NAND_FLASH_BLOCK_MASK                        (NAND_FLASH_BLOCK_SIZE -1)
void nandflash_reset(void);
/********************** NAND FLASH CONTROL **************/
/*
*        Nand Flash Controls
*/
void nandflash_init(void)
{
        R_NFCONT = (1<<0);
        R_NFCONT |= (1<<1);
        nandflash_reset();
}

/*
*         Reset Nand Flash Control
*/
void nandflash_reset(void)
{
        R_NFCONT &= ~(1<<1);
        R_NFCMMD = 0xff;
        while(!(R_NFSTAT & 0x1));        // waiting for busy
        R_NFSTAT |= 1;
}

/*
*        Nand Flash Controls
*         return: readed size
*/
unsigned int nandflash_read(char *buf, unsigned long address, unsigned int size)
{
        unsigned int read_size = 0;
        unsigned int i;
       
        // check address and size whether crosspounding the flash block size
        if(NAND_FLASH_BLOCK_MASK & address || NAND_FLASH_BLOCK_MASK & size)
                return -1;

        // enable chip select
        R_NFCONT &= ~(1<<1);
       
        for(i = address; i < (address + size);)
        {
                int j;
               
                R_NFSTAT |= (1<<2);
               
                // send read command
                R_NFCMMD = 0;
               
                // set address to NFADDR register
                R_NFADDR = i & 0xff;
                R_NFADDR = (i >> 9) & 0xff;
                R_NFADDR = (i >> 17) & 0xff;
                R_NFADDR = (i >> 25) & 0xff;
               
                // waiting controllor finished
                while(!(R_NFSTAT & 0x1));
               
                // read data
                for( j = 0; j < NAND_FLASH_BLOCK_SIZE; j++, i++)
                {
                        *buf = R_NFDATA & 0xff;
                        buf++;
                        read_size++;
                }
        }
       
        // disable chip select  
        R_NFCONT |= 1 << 1;
       
        return read_size;
}

int read(void)
{
        nandflash_init();
        nandflash_read((char *)0x30001000, 0x00000000, 0x1000);
        while(1);
        return 0;
}

我通过jlink读取内存,发现值都是错误的。
现在对nandflash是越来越迷糊了。。。。。
machoe 发表于 2010-8-17 08:07:11 | 显示全部楼层
请注明你的flash的大小和型号。注意一下你的行、列地址。其中行、列地址的计算很重要。你可以参考一下TQtest的nand flash部分。如果还不行,我回家后,把我的例子发上来,供你参考。
 楼主| chenhaiyang 发表于 2010-8-19 09:28:51 | 显示全部楼层
嗯。谢谢楼上的指点。
xiaoqiang08wang 发表于 2011-1-7 20:49:06 | 显示全部楼层
坚决支持:)
xiaoqiang08wang 发表于 2011-1-14 20:02:24 | 显示全部楼层
呵呵明显的地址有问题吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-19 17:50 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表