物联网:关于Nand flash读写范围的问题
物联网:Nand flash读写范围的问题
很多时候对nand的操作都是通过主控的nand控制器直接完成,或者更多时候是通过MTD标准操作接口完成读写擦的过程,然而有些细节问题有必要在这里讨论一下,我分为以下几点进行说明:
1、擦除过程:擦除过程是将0变成1的过程,即充电的过程(比如SLC中,当低于某个电压值表示0,高于这个电压值则表示1;而对于MLC来说可以有多个阈值,所以可以保存更多bit)。擦除过程是按块进行的,但启始地址是页地址,不过擦除过程在内部是有边界对齐的,也就是说当擦除启始地址不是块对齐时,只能擦除本块,而不能垮越到第二个块继续擦除,也就是无论我们给的地址是否页对齐,本块都将擦除,不会有任何保留。
需要注意的是:块擦除时每一页的oob区也同时被擦除掉了,所以一般擦除前先读取块的第一页的两个字节看是否为0xff(512Byte页大小nand的坏块信息放在第6个字节中,ECC占用0、1、2、3、6、7字节;2k页大小的nand有24位ECC放在oob区的40-63字节处),不是的话就不要擦除,0xff表示正常,其它值表示错误,否则将会擦掉所有坏块信息,尤其是出厂时写入的。
2、写入过程:写入过程就是将1变成0的过程,即,放电降压的过程,理论上在写之前一定要先擦除,但实际上只要之前的值为1,不用擦也可以写入(举个例子,比如某一存储单元存放的值为7,那么可以写入比7小的值,比如6,然而反过来则不行,即,未擦之前是不能将6改写成7的)。写入过程可以是任意地址,如果不满一页(开头、中间、结尾都可以任意写入),剩下没有写入的存储单元不会因为未写而变成1,而是保持之前的状态不变(因为只有擦除才会变成1)。写入过程在内部也是有边界对齐的,也就是说写入起始地址不是页对齐时,只能从当前字节写到本页结尾,而不能垮越到第二个页继续写,即使写入长度够长,也不能一次写入垮越两页。
3、读取过程:读取过程只是通过解码电路将存储阵列中的电压信号变换成数字信号,并输出到nand的页缓冲器中,然后依次按一个或多个字节顺序读出的过程。读取过程在nand内部也是有边界对齐的,也就是读取起始地址不是页对齐时,只能从当前字节开始读到本页结尾,而不能垮越到第二页继续读取,即使读取长度够长,也不能一次垮越两页读取。
4、读写过程:前面的读写过程中的页大小问题,假如:page=2048Byte,oob=64Byte,那么,理论上要读写oob时,需要给出大于2048的列地址,但实际上在读取前面的2048字节数据区时,如果在不重新下达命令并给出列地址的情况下而继续向后读写数据,是可以直接读写oob区的,除非是要单独对oob区进行操作。其实对于oob区来说,nand并没有做过多特殊处理,就是多出来的数据区而已,只是大家约定在这里可以存放一些校验和坏块信息等,如果不存放这些信息,那么oob就是普通数据区。
5、操作地址:对一个1GByte的nand,可以用30位二进制来表示地址,即A0-A29,当我们希望读取某一个地址中的数据时,那么应该怎样给出这个地址呢,比如我要访问0x9000000这个地址开始的数据,那么这个地址又是否包含oob区域呢(实际上并不包含)。
首先对于nand操作本身来说就没有比页更小的单位(但是可以按字节读写),所以我们给出的地址其实是要进行地址分解的,分解为行地址(页偏移)和列地址(页内偏移),比如K9K8G08U0B(page=2048Byte)就从A11开始分,A0-A10为列址,A11-A29为行地址,那么oob怎么访问呢,
举个例子:
假如我们要访问的地址是2050,那么现在开始分解,首先将2050右移11位,即除以2048进行页对齐处理,其实就是将A0-A10作为列址,A11-A29作为行地址,分别放到两个变量中结果就是row=1,col=2,那么最后读写的数据到底是什么呢(如果包含oob区域,那读写的数据肯定是oob区的数据),实际上就是跳过第一页(跳过包括oob区域)到第二页中读写2这个地址的数据。
到这里我们应该清楚了,不管用户给出什么样的地址,这个地址偏移都是针对数据区域而不会包含oob区的,如果非要读取oob区,那么在分解地址的时候,可以将列地址加上2047(col=col+2047),否则读写的就只是数据区(如果读完数据区继续向后读写的话也可以读写到oob区,因为系统会自动累加列地址)。
以上信息只是在s5pv210作为主控,操作K9K8G08U0B得出的结论,不同主控和nand型号可能会略有不同。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
物联网学习:算术移位和逻辑移位实现分析
算术移位和逻辑移位实现分析 先来看下面这道题: unsigned int i = 8;int main(){i = i<<3;//输出结果i = 64}上面的变量i是采用逻辑移位还是算术移位呢? 逻辑移位,简单理解就是物理上按位进行的左右移动,两头用0进行补充,不关心数值的符号问题 算术移位,同样也是物理上按位进行的左右移动,两头用0进行补充,但必须确保符号位不改变 但我们好奇的是“i<<3”和“i>>3”到底采用的是算术还是逻辑移位呢?其实单从C语言本身来看可能没有太多突破,因为C最终会被编译器编译成目标平台的汇编代码,所以必须要结合编译器和汇编程序来分析以上代码,下面主要从反汇编入手分析,对ARM平台下有关移位的指令有: LSL(逻辑左移) LSR(逻辑右移) ROR(循环右移) ASL(算术左移) ASR(算术右移) RRX(带扩展的循环右移) 下面我们来看看上面那段C程序的反汇编结果: 结论:说明无符号数采用的是逻辑左移。 那么经过测试我们发现以下几份代码反汇编结果和上面的情况是一样的,都是逻辑左移: 再来看一下: signed int i ...
- 下一篇
基于开源 Net MQTT Client 连接阿里云物联网平台
概述 前面分别介绍了基于开源MQTT Client Java及Python语言连接阿里云物联网平台的示例,这里使用M2Mqtt Client C#进行测试,结合自定义Topic演示消息的上下行。 操作步骤 1、安装M2Mqtt 2、Code sample using System; using System.Text; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; namespace MQTTDemo { class Program { //private MqttClient client; static void Main(string[] args) {
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音