天嵌 ARM开发社区

 找回密码
 注册
查看: 1970|回复: 7

恳求指教!!对nand flash的操作异常苦闷

[复制链接]
mobilefzb 发表于 2010-11-16 23:32:29 | 显示全部楼层 |阅读模式
我将 光盘上的代码 中读 nand 的代码函数 调用了下 确定是正确的。
但是,那个代码没有严格的按照提供的nand flash的资料来定义地址访问的时序吧…………
这个是教程函数
static void rLB_ReadPage(unsigned int addr,unsigned char * to)
{
        unsigned int i;

        rNF_Reset();
        //enable the chip
        NF_nFCE_L();
        NF_CLEAR_RB();

        //Issue Read command
        NF_CMD(CMD_READ);

        //set up address
        NF_ADDR(0x00);
        NF_ADDR(0x00);
        NF_ADDR((addr) & 0xff);
        NF_ADDR((addr >> 8) & 0xff);
        NF_ADDR((addr >> 16) & 0xff);

        NF_CMD(CMD_READ3);

        NF_DETECT_RB();        //wait tR(max 12us)

        for(i = 0;i < 2048;i++)
        {
                to[i] = NF_RDDATA8();
        }

        NF_nFCE_H();
}
我按照nand flash的资料来 稍微修改了 那个读函数
//use for k9f2g08u0a nand flash write
static void rLB_K9F2G08U0A_WritePage(unsigned int addr,unsigned char *from)
{
        unsigned int i;

        rNF_Reset();
        //enable the chip
        NF_nFCE_L();
        NF_CLEAR_RB();
        //issue write command
        NF_CMD(CMD_WRITE1);
        //set up address
        NF_ADDR((addr) & 0xff);
        NF_ADDR((addr >> 8) & 0x0f);
        NF_ADDR((addr >> 12) & 0xff);
        NF_ADDR((addr >> 20) & 0xff);
        NF_ADDR((addr >> 28) & 0x01);
        for(i = 0;i < 2048;i++)
        {
                NF_WRDATA(from[i]);
        }
        NF_CMD(CMD_WRITE2);
}
同时我也修改了 RdNF2SDRAM()函数,主要是这段(调用以前的函数是成功的)
unsigned int start_addr = 4096;//我放了一个点板子led程序在这个位置
unsigned char * to = (unsigned char *)0x30000000;
unsigned int size = 2048;
for(i = (start_addr >> 11);size > 0;)
{
        rLB_K9F2G08U0A_ReadPage(start_addr,to);
        size -= 2048;
        to += 2048;
        i ++;
        start_addr += 2048
}
但是这个程序失败了,无法使用,肯求指教!!!
 楼主| mobilefzb 发表于 2010-11-17 08:46:57 | 显示全部楼层
附件是资料上给出的时序:

恳求指教!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| mobilefzb 发表于 2010-11-17 08:51:03 | 显示全部楼层
对不起,我开头的程序发错了:
static void rLB_K9F2G08U0A_ReadPage(unsigned int addr,unsigned char *to)
{
        unsigned int i;

        rNF_Reset();
        //enable the chip
        NF_nFCE_L();
        NF_CLEAR_RB();
        //issue read command
        NF_CMD(CMD_READ);
        //set up address
        NF_ADDR((addr) & 0xff);
        NF_ADDR((addr >> 8) & 0x0f);
        NF_ADDR((addr >> 12) & 0xff);
        NF_ADDR((addr >> 20) & 0xff);
        NF_ADDR((addr >> 28) & 0x01);
        NF_CMD(CMD_READ3);
        NF_DETECT_RB();//wait tR (max 12us)
        for(i = 0;i < 2048;i++)
        {
                to[i] = NF_RDDATA8();
        }
        NF_nFCE_H();
}
恳求指教!!
machoe 发表于 2010-11-17 09:01:26 | 显示全部楼层
我昨天正好更新了我的博客系列第七章,nand flash。我没细看你的程序,请你注意几个地方,一个是地址对齐,一个是你读的字节数是多少,是不是按页对齐的,然后你再看看你的你发的地址序列。
machoe 发表于 2010-11-17 09:09:44 | 显示全部楼层
我昨天正好更新了我的博客系列第七章,nand flash。我没细看你的程序,请你注意几个地方,一个是地址对齐,一个是你读的字节数是多少,是不是按页对齐的,然后你再看看你的你发的地址序列。
 楼主| mobilefzb 发表于 2010-11-17 12:41:50 | 显示全部楼层
请版主说说blog地址
就你指点的我整理下我的问题
1.地址对其:我的led点灯程序在编译的时候存放在了以4096为起始地址的地方,且烧到了nand flash所以我的start_addr为4096
2.我读的字节数:2048,刚好一个页吧:)
3.我读到的sdram地址0x30000000应该也是地址对齐的吧
我将问题定位在我发的地址序列上,按照教程提供的地址序列发送地址是正确的,程序能成功。我只是修改了教程那个地址序列为板子(tq2440 256MB版本)上nand flash芯片资料提供的地址序列,但是我无法运行成功。
问题集中在地址序列上
成功的:
     NF_ADDR(0x00);
        NF_ADDR(0x00);
        NF_ADDR((addr) & 0xff);
        NF_ADDR((addr >> 8) & 0xff);
        NF_ADDR((addr >> 16) & 0xff);
失败的:
        NF_ADDR((addr) & 0xff);
        NF_ADDR((addr >> 8) & 0x0f);
        NF_ADDR((addr >> 12) & 0xff);
        NF_ADDR((addr >> 20) & 0xff);
        NF_ADDR((addr >> 28) & 0x01);
        NF_CMD(CMD_READ3);
这个是资料上提供的地址序列,失败的程序就是抄上面


恳求指教!!感谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| mobilefzb 发表于 2010-11-17 23:12:37 | 显示全部楼层
看来这个地址序列问题始终困扰着我
这样的地址序列就可以访问
void send_addr(unsigned long addr)
{
&#160;&#160;&#160; NFADDR = addr & 0xff;
&#160;&#160; &#160;NFADDR = (addr >> 8) & 0x7;
&#160;&#160;&#160; NFADDR = (addr >> 11) & 0xff;
&#160;&#160;&#160; NFADDR = (addr >> 19) & 0xff;
&#160;&#160;&#160; NFADDR = (addr >> 27) & 0x1;
}
但是这个和资料上提供的地址序列不符啊…………我真的搞不懂这个 资料该如何 阅读了,恳求指教!!!
machoe 发表于 2010-11-18 08:36:00 | 显示全部楼层
其实地址就是一个29位的地址,分为2个列地址,3个行地址,为什么用5个周期呢?因为分131072行(页),2112 x 8列,所以只有用5个周期的才能表示出来。
我建议你用上面的那个地址,就是前两列是0的,因为你每次读2048,正好是页对齐的,就是一页一页读的,而2个列地址是在页内寻址的,所以没有用到,设为0就行了。
http://blog.chinaunix.net/u3/119138/showart.php?id=2397331
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-10-5 16:21 , Processed in 1.033242 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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