这个nandflash搞了好久好久,就是因为在做中断的时候必须要把代码放到nandflash的0addr上,而手上也找不到能烧录进去的(硬件资源)方法,于是就打算使用软件的办法来进行烧录。
目前还有很多的nandflash的只是还没搞懂,但是可以进行简单的开发。
①
在编程时候遇到了一个问题就是在read id的时候read出了奇奇怪怪的id,数值上是存在的但是顺序不同。为此做了很多的尝试。终于在好久好久次尝试之后想到了问题所在。问题就在于我复制代码的时候 原代码用的是返回一个int数值的变量。
这里的问题涉及到了
nandflash controller nfcdata寄存器的三种使用方法:
byte--> 1 io周期
half word--> 2 io周期
word--> 4 io周期
当使用了unsigned long变量类型的指针时就使用了第三种使用方法。这个时候你用了一个unsigned char类型的变量来接收自然就导致问题了。在你接受的四个字节中只有一个被保存下来了。这就是发生了错误的原因:
变量类型的不匹配导致的溢出。
②对该flash寻址的问题。在read id之后就能够确定这款nandflash 的页大小和块大小
1页=2k+64bytes
1块=64页=64*(2k+64)btyes
再看地址发送周期图
column address 为A0-A11 总共12位。这里困扰了我很久
row address为A12-the last
为什么困扰呢。因为2k只需要11跟地址线。为什么这么浪费。没错就是这么浪费。
在经过了许多的实验后。才知道。。 在2048字节(2KB)后跟着的就是64字节的ECC校验码。总共是2112字节,12跟地址线寻址到2112后面的内容在读取之后都发现为00h,而循环到4096后面的内容又开始了循环。所以。。。。。。
实际2112-4096这部分的地址是并没有使用的。
然后就能够继续愉快的编程啦。
在了解上面的问题之后就完成了使用软件来进行程序的烧写。(目前还有一点困扰,如何使用串口来传输二进制文件的编码,尝试过xmodem协议,总感觉好麻烦,接下来再看看ftp协议吧。)
③尚不理解的ECC原理,与尚不理解的plane size。
read id 后发现这款flash是有2个internal chip 支持interleave 以及4个2G的plane,我只想说 这是什么鬼。