5023|14

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

NANDFLASH ECC校验出错~奇怪了~ [复制链接]

BSP中的FMD.CPP驱动怎么不一样呢?同样的ReadBlock(DWORD dwBlock, LPBYTE pbBlock, PSectorInfo pSectorInfoTable)当LPBYTE pbBlock不为空时,ECC校验就错了~~是不是驱动问题啊~~~

BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)
{
    ULONG SectorAddr = (ULONG)startSectorAddr;
        ULONG MECC;

    if (!pSectorBuff && !pSectorInfoBuff)
        return(FALSE);

    BOOL bLastMode = SetKMode(TRUE);

    NF_nFCE_L();                        // Select the flash chip.
    NF_WAITRB();                                    // Wait for flash to complete command.

    NF_CMD(CMD_RESET);                                // Send reset command.
    NF_WAITRB();                                    // Wait for flash to complete command.
   
    while (dwNumSectors--)
    {
        ULONG blockPage = (((SectorAddr / NAND_PAGE_CNT) * NAND_PAGE_CNT) | (SectorAddr % NAND_PAGE_CNT));

                if (!pSectorBuff)
        {
            NF_CMD(CMD_READ2);                                    // Send read confirm command.
            NF_WAITRB();                                        // Wait for command to complete.

            NF_ADDR(0);                                            // Column = 0.
            NF_ADDR(blockPage         & 0xff);                    // Page address.
            NF_ADDR((blockPage >>  8) & 0xff);
                        if (NEED_EXT_ADDR)
                    NF_ADDR((blockPage >> 16) & 0xff);  
            NF_WAITRB();                                        // Wait for command to complete.

            RdPageInfo((PBYTE)pSectorInfoBuff);                    // Read page/sector information.

            pSectorInfoBuff++;
        }
                else
        {
            NF_CMD(CMD_READ);                                    // Send read command.
            NF_WAITRB();                                        // Wait for command to complete.

            NF_ADDR(0);                                            // Column = 0.
            NF_ADDR(blockPage         & 0xff);                    // Page address.
            NF_ADDR((blockPage >>  8) & 0xff);
                        if (NEED_EXT_ADDR)
                    NF_ADDR((blockPage >> 16) & 0xff);  
            NF_WAITRB();                                        // Wait for command to complete.

            //  Handle unaligned buffer pointer
                       NF_RSTECC();
                NF_MECC_UnLock();
            if( ((DWORD) pSectorBuff) & 0x3)
            {
                RdPage512Unalign (pSectorBuff);
            }
            else
            {
                RdPage512(pSectorBuff);                        // Read page/sector data.
            }
                NF_MECC_Lock();

                        if (pSectorInfoBuff)
                        {
                                RdPageInfo((PBYTE)pSectorInfoBuff);            // Read page/sector information.
                pSectorInfoBuff ++;
                        }
                        else
                        {
                BYTE TempInfo[8];
                                RdPageInfo(TempInfo);                                           // Read page/sector information.
                        }

                        MECC  = NF_RDDATA() << 0;
                        MECC |= NF_RDDATA() << 8;
                        MECC |= NF_RDDATA() << 16;
                        MECC |= NF_RDDATA() << 24;
                       
                        NF_WRMECCD0( ((MECC&0xff00)<<8)|(MECC&0xff) );
                         NF_WRMECCD1( ((MECC&0xff000000)>>8)|((MECC&0xff0000)>>16) );
                        
                         if (NF_RDESTST0 & 0x3)         
                         {
                            RETAILMSG(1,(TEXT("ecc error %x %x \r\n"),NF_RDMECC0(),MECC));
                       
                            NF_nFCE_H();                            // Deselect the flash chip.
                            SetKMode (bLastMode);

                                 return FALSE;       
                        }            
                pSectorBuff += NAND_PAGE_SIZE;
        }
        ++SectorAddr;
    }
    NF_nFCE_H();                        // Deselect the flash chip.

    SetKMode (bLastMode);

    return(TRUE);
}

最新回复

S6dAvmT2sRr 顶啊顶啊 doS8WKKPmkO TnLWt8tfry7 顶起来!  详情 回复 发表于 2010-4-22 14:19
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
NFESTAT0 0x4E000024 NAND flash ECC status for I/O[7:0]
NFESTAT1 0x4E000028 NAND flash ECC status for I/O[15:8]

NF_RDESTST0 这个与0x3与 肯定非0啊~
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
ECC.....唉,痛苦啊!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 lightsoure 的回复:

NFESTAT0 0x4E000024 NAND flash ECC status for I/O[7:0]
NFESTAT1 0x4E000028 NAND flash ECC status for I/O[15:8]

NF_RDESTST0 这个与0x3与 肯定非0啊~

NF_RDESTST0这个参数干什么的?它的低两位有什么说法没有?
如果它的低两位是0的话,if (NF_RDESTST0 & 0x3)就不会成立的。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
当LPBYTE pbBlock不为空时,ECC校验就错了
------pbBlock不为空就要读数据了,读数据就要ECC了
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

6
 
#define NF_WRMECCD0(data)                        {s2440NAND->NFMECCD0 = (data);}
#define NF_WRMECCD1(data)                        {s2440NAND->NFMECCD1 = (data);}
#define NF_WRSECCD(data)                        {s2440NAND->NFSECCD = (data);}

#define NF_RDESTST0                                (s2440NAND->NFESTAT0)
#define NF_RDESTST1                                (s2440NAND->NFESTAT1)
NF_RDESTST0这个是ECC状态位  我的NAND是64M 的小页  这里是16位校验

我这里是读NAND的时候 ECC校验。。。出错了~因为我在写NAND的时候没有用到ECC校验

所以我想用这个方法来解决:就在仅仅做这个读NAND的时候不ECC校验,怎么做呢?我先读出NF_RDESTST0 这个值,如果是这个值 我就不做ECC校验。。当读出的NF_RDESTST0不是我定义的设定好的值,就做ECC校验,这样以后别人读NAND的时候还是可以用ECC校验的


我想要确认的是NF_RDESTST0这个值 应该会根据我WRITE NAND的不同变化的吧~如果是那么我想上面方法是可以的。

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
NAND读写还是要做校验的,否则读出来的数据可能是错的,影响程序的执行。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 veabol 的回复:
NAND读写还是要做校验的,否则读出来的数据可能是错的,影响程序的执行。


恩,理解,所以我想就仅仅做这1个读的时候,不做ECC可以吗?我加个判断~判断下是不是我不做ECC校验的读。。这个应该可以的吧
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
譬如说 我可以根据:Spare:ff ff ff ff 00 00 00 00 ff ff ff f0 00 00 00 00
这个值来定 要不要ECC
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
解决
2种方法:
1,在写NAND的时候FMD_WriteSector进行ECC检验,这样读的时候再写时候根据得到的数据检验就过了

2,先读出要读的NF_RDESTST0的值,加个判断。。。。。。。。不过这样觉得不妥。。呵呵

选了前者
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 lightsoure 的回复:
1,在写NAND的时候FMD_WriteSector进行ECC检验,这样读的时候再写时候根据得到的数据检验就过了


写的时候截获然后先保存到RAM中?读的时候不从NAND中读出来?
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(初级)

12
 
你这个是什么nand呀?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 10 楼 veabol 的回复:
引用 9 楼 lightsoure 的回复:
1,在写NAND的时候FMD_WriteSector进行ECC检验,这样读的时候再写时候根据得到的数据检验就过了


写的时候截获然后先保存到RAM中?读的时候不从NAND中读出来?


我这个是1208 NAND 64M  小页
我的理解是ECC校验会对512字节产生校验码,然后在写的时候,把他存在每个PAGE外带的16字节的setor spare中去,然后再读NAND的时候,先把512字节数据读出来,
if (pSectorInfoBuff)
                        {
                                RdPageInfo((PBYTE)pSectorInfoBuff);            // Read page/sector information.
                pSectorInfoBuff ++;
                        }
                        else
                        {
                BYTE TempInfo[8];
                                RdPageInfo(TempInfo);                                           // Read page/sector information.
                        }

然后经过处理,
MECC  = NF_RDDATA() << 0;
                        MECC |= NF_RDDATA() << 8;
                        MECC |= NF_RDDATA() << 16;
                        MECC |= NF_RDDATA() << 24;
                       
                        NF_WRMECCD0( ((MECC&0xff00)<<8)|(MECC&0xff) );
                         NF_WRMECCD1( ((MECC&0xff000000)>>8)|((MECC&0xff0000)>>16) );


这个值NF_RDESTST0(ECC校验状态位低8位)与0X3比较  判断






 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
Spare:ff ff ff ff 00 00 00 00 ff ff ff f0 00 00 00 00  这个就是我用工具烧录NAND数据后,从NAND PAGE中读到的信息
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

15
 
S6dAvmT2sRr
顶啊顶啊
doS8WKKPmkO



TnLWt8tfry7
顶起来!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表