1. NANDFLASH基础
1.1 Nandflash相对于Norflash, 无法按地址总线进行精确寻址,只能按块(Block)访问。
1.2 Nandflash的制造工艺有两种,一种是SLC(Single-Level Cell), 其特点是每一个单元存储一位数据;另一种MLC(Multi-level Cell),其特点是每个Cell存储两位数据。SLC性能更好,但是MLC更加便宜。
1.3 Nandfalsh的组织方式
从上图中可以看到,K9F2G08(2G代表其容量为2G,08代表其为8位的)的页(Page)、块(Block)、设备(Device)的大小以及关系。
- 页是Nandflash的最小读写单位;而块是Nandflash的最小擦除单位;
- Nandflash中存储的数据有有带内数据(Main Data area)和带外数据(Spare area,Linux系统中,一般叫做OOB(Out Of Band))之分,如上图所示,1Page = (2K+64)Bytes。其中,2K代表的就是带内数据,放的是我们需要存放的数据;64B代表的是带外数据,存放ECC(Error Correction Code,错误校验码)以及坏块标记等。
1.4 Nandflash地址线
由于Nandflash是8位的,地址线肯定是超过8位的,所以采用了多个地址周期。由上图可以看到,K9F2G08是一个5地址周期的设备,其中有两个列地址周期,三个行地址周期。列地址代表一个页内的地址,对于K9F2G08每页为2KB,11位地址线就够用了,A10其实是0。行地址代表页号,即在哪一个页。尽管地址线能够定位到页内的某个具体地址,但是依旧只能按Block读写。
2. NANDFALSH控制
Nandflash的控制分为两部分,首先在K9F2G08一端有控制电路,其次在S5PV210的Soc内部有控制器。这两部分的存在极大地简化了我们对Nandflash的控制,我们可以不必要再自己来处理Nandflash复杂的控制时序,而是只用操作S5PV210中的SFR(特殊功能寄存器)即可。这种控制思想在LCD、SDRAM等都是相同的,我们在相应寄存器按照固定的流程中写数据、写命令、写地址即可完成控制。
很重要的一点是,NANDFALSH的操作不是时钟同步的,读或者写都发生在读使能/写使能的上升沿,精确的时序控制由Soc的NANDFLASH控制器完成。
当然具体的时序可以从下面的这个博客中理解:怎么看时序图–nand flash的读操作详解
3. NANDFLASH基本操作
Nandflash有四个基本操作:坏块检查(Identifying Invalid Block);页读(Read);页写(Program);擦除(Erase)块。
3.1 坏块检查
Flash使用之前要先统一擦除块。Flash类设备擦除后里面全是1,所以擦干净之后读出来的值是0xFF。如果读出来的不是0xFF则表明是坏块。
3.2 页写
- Nandflash的接口电路先接收数据到自己的缓冲区,然后再集中写入Nand芯片的存储区域中。Nand接口电路将一页数据从缓冲区中写入Nand存储系统中需要一定的时间,这段时间Nand芯片不能再响应SOC发过来的其他命令,所以SoC要等待Nand接口电路忙完。
- 等待方法是SoC不断读取状态寄存器(这个状态寄存器有2种情况:一种是SoC的Nand控制器自带的,另一种是SoC通过发命令得到命令响应得到的),然后通过检查这个状态寄存器的状态位就能知道Nand接口电路刚才写的那一页数据写完了没、写好了没。直到SoC收到正确的状态寄存器响应才能认为刚才要写的那一页数据已经ok。