裸奔程序7(四)-NAND芯片的读写及ECC检验软硬件实现

原创 2011年01月15日 09:38:00

 ECC检验码

 

从结果可以看出,三次读取页数据,其检验码只有在第一次读取0页时正确,第二次读取1页时错误,第三次重读0页时生成的竞是第1页的ECC码,当时差点让人崩溃。

为了找到问题的症结所在,决定在读取页数据前先查看一下NFMECC0寄存器的值,重启系统调试发现,三次读取页数据前,其值如下:

NFMECC0=0xf0ffffff

NFMECC0=0x50969569

NFMECC0=0xf0c3fc33

经过分析发现当读取页数据结束并锁定ECC值时,NFMECC0的值为

NFMECC0=NFMECC0^(~页ECC码)

第一次读取为0XF0FFFFFF^(~0X50969569[页0ECC码])=0X50969569

第二次读取为0X50969569 ^(~0X50AA96A5[页1ECC码])=0XF0C3FC33

第三次赢取为0XF0C3FC33^(~0X50969569[页0ECC码])=0x50aa96a5

通过分析,我们得知,要想得到正确的页ECC码,显然,NFMECC0寄存器其值必须保持为0XF0FFFFFF

找到了问题的症结所在,并在对NFMECC0赋值无效的情况下,查找资料发现。


好了,在解开ECC寄存器之后,重新对NFCONT[4]位置1,NFMECC0寄存恢复原值0XF0FFFFFF,这样读取任意页均可得到正确的ECC码。

       在得到页ECC码的情况下,我们读取[2048~2051]得到写页数据时生成的ECC码

并将该值放入NFMECCD0/1两个寄存器的相关位置,这样S3C2440将自动对两个ECC码进行异或,并根据结果设置NFESTAT0寄存器。我们可以根据该寄存器的值来判断我们读取页数据是否成功。

       经程序调试发现,对NFMECCD0/1寄存器赋值必须一次完成,否则检验结果不正确。

NFESTAT0[1~0]位表示如下:

0 没有错误 1 一位错误可纠下 2不可纠下错误,3,ECC码错误

NFESTAT0[6~4]位表示错误字节错误位的列数

NFESTAT0[17~7]位表示错误字节的位置。

经过调试发现,其保存值均为反码,也就是说我们得到该位的值必须将其取反。
读取页数据其主要核心代码如下:
UN_MAINECC();
NF_RESTECC();                 //使NFMECC0寄存器值复原

       for(i=0;i<512;i++)             //pData为32位,一次读取4字节

       {

           pData=NF_DATA();

       }

       LOCK_MAINECC();

       Ecc_Data=NF_DATA();        //得到写生成时的ECC码        

       NF_nFCE_H();

       //对寄存器赋值必须一次写完,否则检验结果将不正确

       NF_MECCD0()=((Ecc_Data)&0xff)|((Ecc_Data<<8)&0xff0000);                  

       NF_MECCD1() =((Ecc_Data>>16)&0xff)|((Ecc_Data>>8)xff0000);      

       Ecc_Stat=NF_STAT0();

       if((Ecc_Stat&0x3)==0) return true;         //数据没有错误

       if((Ecc_Stat&0x3)==1)                   //一位数据错误,纠正该错误位

       {

              row=~((unsigned int)(Ecc_Stat>>7));  //取反

              row&=0x7ff;

              arr=~((unsigned int)(Ecc_Stat>>4));

              arr&=0x7;

              

              temp=((unsigned char *)pData)[row];

              if(((temp>>arr)&0x1)==1)

              {

                     temp&=(unsigned char)(~(1<<arr));

              }

              else {

                     temp|=(unsigned char)(1<<arr);

              }

              ((unsigned char *)pData)[row]=temp;            

              return true;

       }

体会:在对处围设置相关寄存器不同位赋值时,最好一次性完成,否则可能导致无法预测的结果。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

裸奔程序7(三)-NAND芯片的读写及ECC检验软硬件实现

行检验码的生成过程:根据异或规则,当一个数的ECC码第bit6位(En=1)时,将改变11位行检验码,显然,问题的关键是如何判断这11位行检验码。当我们用i来表示字节在2048个字节中的位置时,由于2...

裸奔程序7(一)-NAND芯片的读写及ECC检验软硬件实现

对TQ2440上NAND芯片的读写进行了分析,同时对ECC检验算法进行了彻底的研究,对S3C2440中NAND控制寄存器进行了深入研究,对ECC校验进行了软实现和S3C2440上的硬实现。

7.NAND芯片的读写及ECC检验软硬件实现_上

最近在study ARM,在网上看到一些先行者们总结出来的一些东西,觉得很有参考意义,特收藏起来便于日后查找学习(在此向原帖作者致敬)。 第一节概论 nandflash在对大容量的数据存储...
  • wqc02
  • wqc02
  • 2012-09-25 11:13
  • 3023

51单片机控制K9K8G08U0C NAND Flash读写程序

网上看到这个源代码,虽然感觉51用到nandflash的情况不多,但是可以借鉴理解nandflash的读写流程 #include #include #include /***********...

新手学习FPGA----如何将软硬件程序固化进串行Flash芯片EPCS

如何将软硬件程序固化进串行Flash芯片EPCS      在FPGA芯片的使用中,软硬件程序可通过JTAG口下载进FPGA芯片中,程序可立即执行,并且在掉电后程序丢失。为了避免这种情况的出现,可使用...

nand flash ECC算法实现原理

  • 2013-07-25 09:50
  • 126KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)