历史上的今天
今天是:2025年08月16日(星期六)
2021年08月16日 | 1.7.4_NAND_FLASH数据读取和NAND启动_P
2021-08-16 来源:eefocus
首先是Nand Flash的存储示意图,由最基本的页构成,一页有2KB,一块有64页即128KB,一片nand有2048块。所以,一枚nand芯片有256MB的容量。
除了本身的容量外,每页还有一个OOB(out of bank)区,用于解决nand缺陷(位反转)而存在。
问:CPU读取Nand上的第2048个字节数据,它是哪一个?
答:是Page1的第0个byte。这是因为OOB只是用来解决nand缺陷而存在的,而CPU只关心数据,不需要看到OOB。
下图是读操作的流程图和时序图。


同样,我们需要先选中芯片,之后先发出0x00命令,然后是五个字节的地址,然后是0x30命令,之后就可以读取了,每次读取,它的地址会自动加1,这样我们就可以连续读取了。

这里,需要注意的是,地址是由五个字节组成的,前两个是列地址,后三个是行地址。这是因为nand flash的内部结构是行列排布的,每行又叫做每页,每页有2048个字节,所以要分别发出行地址和列地址。发送五个字节是为了兼容更大容量的芯片,不然256MB=2^28只需要4个字节就可以完成地址的发送。

根据地址得到页地址和列地址,然后发送地址。
发送完毕之后还不能立刻读取,因为nand flash不想内存那样,它需要更多的时间来准备这些数据,可以通过2440的NFSTAT寄存器来获取nand的状态。



另外,nand flash的读取不能跨页进行,要读下一页的话需要另外再进行一次读操作,这里我们通过一个while来实现,用i保存已经读取的数据量,当i >= len的时候,表示取出目标数据则退出while,否则循环读取,注意跨页需要重新进行读取操作。

最后,操作完毕要关闭片选。

下面是实现从nand启动,我们写了读的函数,刚刚好通过nand启动验证这个读函数是否有效。
我们之前有实现nor启动,现在先写一个接口,判断是从nand启动还是nor启动。根据垫脚石机制,函数如下。

当为nand启动时,先初始化nand flash控制器,然后把代码从nand复制到SDRAM,需要注意的是要将nand_flash.o放在前4K的位置,不然在程序复制到SDRAM之前就跳转到片内4KSRAM外,会导致代码死机。

最后,OOB的第0个区域(2048)!=0xFF,表明该BLOCK为坏块。
史海拾趣
|
请问在wince里怎样用wifi发送特定数据 有人说就是socket编程,我没想明白,难道系统会自动调用wifi? 还请各位前辈指点迷津!… 查看全部问答> |
|
想学习一下AD,打算仿真做一个数字电压表,测量0~5V输出0~255,通过数码管显示,AD用的0809,模拟输入采用一个1K滑动变阻器连接到IN0(不知道这种做法是否可行?)现在的问题是,改变滑动变阻器的值,数码管的值有变化,但是并不是有规律地增大或 ...… 查看全部问答> |
|
小弟在研究硬盘电机的驱动,我曾试过用小功率管9013,8050,8550等等来搭成达林顿管子,但是驱动电机的时候发热严重,而且明显有气无力...虽然能转...在网上找了很久,想用场效管IRF540N来驱动,但是不知道电路如何搭建...求各位高手,走过路过的能 ...… 查看全部问答> |
|
大三嵌入式又要分方向了, ARM 、 PCL、 单片机,感觉吧....就是没感觉,有没有前辈给这三个方向的发展,优缺点,就业情况分析一下啊? 小弟先谢谢了....!!! … 查看全部问答> |
|
针对beaglebone 扩展板,进行Linux驱动的调试! 好久没有发帖子了!今天来分享一下针对beaglebone 扩展板,进行Linux驱动的调试吧! 第二次修正beaglebone板子的外围电路还是比较顺利的! 具体编译内核的过程就不在介绍了!论坛里有很多人写了这方面的教程,Ti官方的文档也提供了较为全面的编译 ...… 查看全部问答> |
|
都到这个点了,真的好瞌睡啊,希望这个文档能对初学的人带来帮助 我也是磕磕绊绊好几周才弄懂了整个开发的流程,希望初学的人来看 看我这篇文档,在开发中少走弯路,不走弯路 我是西安电子科技大学测控技术与仪器专业的学生,欢迎交流,共同进步 ...… 查看全部问答> |






