计算NandFlash要传入的行地址和列地址
 2015.11.27    |      嵌入式学习    |     AilsonJack    |     1 条评论    |     2702 views
By: Ailson Jack
Date: 2015-11-25
个人博客: http://www.only2fire.com/
<p style="text-indent: 2em;">最近在学习NandFlash相关的知识,NandFlash的操作貌似比NorFlash的操作还要复杂些,这里讲讲NandFlash的地址计算以及如何将物理地址转换为NandFlash所要求的格式,以下内容参考了网友的总结,对那位网友表示感谢<img src="/UEditor/dialogs/emotion/images/face/i_f07.gif"/>。</p><p class="artical_littlestyle1">1、计算物理地址</p><p style="text-indent: 2em;">在使用NandFlash进行读、写、擦除数据之前,还要做一件事,那就是,先要搞懂我们要访问的地址,以及这些地址如何分解后,一点点传入进去,使得硬件能识别才行。</p><p style="text-indent: 2em;">此处是以K9K8G08U0A为例,此NandFlash,一共有8192个块,每个块内有64页,每个页是2K+64Bytes,假设,我们要访问其中的第7000个块中的第64页中的1208字节处的地址,此时,我们就要先把具体的地址算出来:</p><p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">物理地址 = 块大小×块号 + 页大小×页号 + 页内地址</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2K*64*7000&nbsp; + 2K*64&nbsp; &nbsp;&nbsp; + 1208<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0x36B204B8</p><p class="artical_littlestyle2">2、将物理地址转化为Nand所要求的格式</p><p style="text-indent: 2em;">接下来,我们就看看,怎么才能把这个实际的物理地址,转化为NandFlash所要求的格式。在解释地址组成之前,先要来看看其datasheet中关于地址周期的介绍:</p><p style="text-align:center"><img src="/uploads/AilsonJack/2018.08.21/1534859336232203.png" onclick="preview_image(&#39;/uploads/AilsonJack/2018.08.21/1534859336232203.png&#39;)"/></p><p style="text-indent: 2em;">结合图,我们可以看出,此NandFlash地址周期共有5个,2个列(Column),3个行(Row)周期,而对应地,我们可以看出,实际上,<span style="color: rgb(255, 0, 0);">列地址A0~A10,就是页内地址,地址范围是从0到2047</span>,而对于多出的A11,理论上可以表示2048~4095,但是实际上,我们最多也只用到了2048~2111,用于表示页内的oob区域,其大小是64字节。对应地,<span style="color: rgb(255, 0, 0);">A12~A30,称作页号,页的号码,可以定位到具体是哪一个页。而其中,A18~A30,表示对应的块号,即属于哪个块</span>。</p><p style="text-indent: 2em;">简单解释完了地址组成,那么就很容易分析上面例子中的地址了:</p><p style="text-indent: 2em;">0x36B204B8=0011&nbsp; 0110&nbsp; 1011&nbsp; 0010&nbsp; 0000&nbsp; 0100&nbsp; 1011&nbsp; 1000,分别分配到5个地址周期就是:</p><p style="text-indent: 2em;">1st&nbsp; 周期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A7~A0:&nbsp;&nbsp;&nbsp; 10111000=0xB8</p><p style="text-indent: 2em;">2nd&nbsp; 周期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A11~A8: &nbsp;&nbsp; 00000100=0x04</p><p style="text-indent: 2em;">3rd&nbsp; 周期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A19~A12:&nbsp;&nbsp; 00100000=0x20</p><p style="text-indent: 2em;">4th&nbsp; 周期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A27~A20:&nbsp;&nbsp; 01101011=0x6B</p><p style="text-indent: 2em;">5th&nbsp; 周期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A30~A28:&nbsp;&nbsp; 00000011=0x03</p><p style="text-indent: 2em;">注意,与图中对应的*L,意思是地电平,由于未用到那些位,datasheet中强制要求设为0,所以,才有上面的2nd周期中的高4位是0000。其他的A30之后的位也是类似原理,都是0。</p><p style="text-indent: 2em;">因此,接下来要介绍的,我们要访问第7000个块中的第64页中的1208字节处的话,所要传入的地址就是分5个周期,分别传入两个列地址:0xB8,0x04,然后再传3个行地址:0x20,0x6B,0x03,这样硬件才能识别。<br/></p><p class="artical_littlestyle3">3、小知识</p><p style="text-indent: 2em;">1)、块,是Nand Flash的擦除操作的基本/最小单位。</p><p style="text-indent: 2em;">2)、页,是Nand Flash的写入操作的基本/最小的单位。</p><p style="text-indent: 2em;">3)、Flash名称的由来:Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将一个block,常见的块的大小是128KB/256KB。全部擦除为1,也就是里面的内容全部都是0xFF了,由于是一下子就擦除了,相对来说,擦除用的时间很短,可以用一闪而过来形容,所以,叫做Flash Memory。中文有的翻译为(快速)闪存。<br/></p>
欢迎关注博主的公众号呀,精彩内容随时掌握:
热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。
如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!
注: 转载请注明出处,谢谢!^_^
本文共 1 个回复
ben  火狐浏览器 Windows 10 location 然后再传3个行地址:0x20,0x6B,0x03 上面3个地址是错误的

1楼 2022年08月20日 22:02:54 回复
发表评论

 
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号