本文非本人原创,摘抄于https://www.cnblogs.com/Caden-liu8888/p/7123455.html
ED3 flash 、OBP flash
海力士、东芝等ED3 NAND Flash
ED3的TLC编程规则相对于OBP来讲会简单许多,因为ED3的编程规则非常有规律,很容易掌握,ED3的每个WL页数量是固定的。
ED3在对行地址的定义上与OBP有着很大的区别:在TLC模式下,ED3的行地址代表的是WL地址。操作的页是WL中的哪个页,是通过命令前的Pre Cmd来确定的。
ED3 TLC编程也遵循一个WL需要编程3次的规则,一次WL编程的命令序列如下
第一个命令 09h/0Dh/(空) 分别代表该WL是第几次编程:第一次编程发09h、第二次编程发0Dh、第三次编程不发。
第二个命令01h/02h/03h 对应的就是上面所描述的选择当前WL当中的哪个页。
最后面确认编程的命令,只有在当前操作的页是这个WL的第三个页的时候,才使用10h,其他俩个页都使用1Ah
ED3 在进行TLC编程的时候也需要遵循一个Order顺序,在每次编程的时候,都需要对这一个WL上的三个页都进行编程操作
假设当前操作的是Block_0,那么首个WL行地址即为00 00 00,第二个WL行地址为01 00 00 …(该地址表示方式及后面的地址表示方式都根据实际操作时使用的小端数据模式)
首先根据Order顺序,对WL0进行首次编程,本次编程命令序列为
09h - 01h- 80h - 00 00 00 00 00 - Data - 1Ah
09h - 02h- 80h - 00 00 00 00 00 - Data - 1Ah
09h - 03h- 80h - 00 00 00 00 00 - Data - 10h
下面开始Order1编程,此时需要编程WL1,命令序列为
09h - 01h- 80h - 00 00 01 00 00 - Data - 1Ah
09h - 02h- 80h - 00 00 01 00 00 - Data - 1Ah
09h - 03h- 80h - 00 00 01 00 00 - Data - 10h
根据Order顺序,下一个要编程的WL回到了WL0,那么这次是第二次对WL0进行编程,命令序列为
0Dh - 01h- 80h - 00 00 00 00 00 - Data - 1Ah
0Dh - 02h- 80h - 00 00 00 00 00 - Data - 1Ah
0Dh - 03h- 80h - 00 00 00 00 00 - Data - 10h
再下一个是Order3,对WL2进行首次编程,命令序列为
09h - 01h- 80h - 00 00 02 00 00 - Data - 1Ah
09h - 02h- 80h - 00 00 02 00 00 - Data - 1Ah
09h - 03h- 80h - 00 00 02 00 00 - Data - 10h
Order4命令序列
0Dh - 01h- 80h - 00 00 01 00 00 - Data - 1Ah
0Dh - 02h- 80h - 00 00 01 00 00 - Data - 1Ah
0Dh - 03h- 80h - 00 00 01 00 00 - Data - 10h
Order5命令序列,此时对WL0进行最后一次编程
01h - 80h- 00 00 00 00 00 - Data - 1Ah
02h - 80h- 00 00 00 00 00 - Data - 1Ah
03h - 80h- 00 00 00 00 00 - Data - 10h
到此为止,WL0的三个页都已经编程完毕,数据可以被正常的读出了。根据这样的规律,就可以将整个Block的页都进行编程。
OBP NAND Flash:为三星与其他一些flash厂商共用的TLC协议,其TLC部分的编程规则与常规ONFI协议和东芝的ED3协议有着明显的区别
SLC操作与普通SLC和MLC操作没太大区别,就只用在开头的命令前面加一个DA表示SLC模式即可。而在所有需要TLC操作的读写命令之前,都要加一个0xDF表示进入TLC模式。
在OBP TLC模式中,与普通模式编程最大的区别首先就是编程顺序,TLC Page分为分组地址(Grouped Page Address)和编程地址(Program Order Address)。
常规编程的时候,一般的命令都是先发一个0x80,后面接5个字节的行列地址,然后发送数据,最后以0x10结尾,等待RB拉高后,一个Page的数据就被编程进去了。但是在OBP规则中,通常一个Page需要被编程三次(不是所有Page都需要)之后,才能够确保数据的稳定性,保证正确的把数据读出。但是把一个页编程三次并不是指简单的重复对一个页发送三次80 10命令就可以了。
一开始,进入第一次页编程(1st Page Data Setup), 此时的行地址一定是属于Group Page Address图中Group A中的某一个页的行地址,结尾的编程命令不是0x10而是0xC0。
在OBP中,不是每一个Word Line当中都有三个页,在OBP当中,前几个World Line和最后几个Word Line都稍微有一点特殊,需要特殊处理一下
现在我们假设是在Plane0当中进行编程,那么此时Add所代表的命令自然就是0x11啦。接下来就进入了第二次页编程(2nd Page Data Setup),命令与第一次类似,这里面的行地址代表Group Page Address图中Group B中的跟第一次编程中的页同一个Word Line的页的行地址,然后发送0xC0 和0x12,。第三次编程与前两次一样,行地址属于图中Group C中的第一次编程中的页同一个Word Line的页的行地址。最后是Program Confirm Part,0x8B后面所代表的地址不是刚刚任何一个页的行地址,而是指Program Order Address中的Order Address。
当初我看完这个的时候是一脸懵逼的。
就拿一个Block中的第一个Page开始。假设是第0个Block,那么第一个页的行地址自然是0x000000,先看Group Page Address,是属于Group A。好,那么开始编程,按照GroupA的规则,发命令0x80,发两个字节列地址0x00,0x00 再发3个字节行地址0x00,0x00,0x00,发0xC0,和1st Data input的命令 0x11,然后就准备发Confirm Part命令了。
等等,上面不是说要编程了三个页之后才要发Confirm Part吗?在OBP中,不是每一个Word Line当中都有三个页,因此刚刚上面所说的是一般情况下的编程规则,在OBP当中,前几个World Line和最后几个Word Line都稍微有一点特殊,需要特殊处理一下。
继续回到刚刚的Confirm Part命令,发送命令0x8B 然后是Order Address,此时根据Group Page Address当中Page 0对应的位置查看Program Order Address对应的值,一看,也是0,好吧,那么Order Address就是0x00,0x00,0x00,0x00,0x00 五个0,最后发送0x10,第一个Word Line就编程结束了,此时Page 0的数据可以正确读出。
继续第二个Word Line编程,根据Order Address当中的0x01的位置,对应到Group Page Address,可以看出这个页是Page 1。发送命令0x80,列地址0x00,0x00,行地址0x01,0x00,0x00,发送命令0xC0,然后是地址0x11。然后跳过了第二次编程,直接开始第三次编程,因为参照Group Page Address,第二个Word Line是没有Group B的页,就如同第一个Word Line中只有Group A的页一样。但是根据Group Page Address,此时编程的页还是Page 2,因此行地址是0x02,0x00,0x00,0xC0后面跟的是0x13。接下来又到了Confirm Part了,此时的Order Address就是0x01。那么Confirm Part的地址就是0x00,0x00,0x01,0x00,0x00,最后0x10编程结束。但是注意,由于这个Word拥有两个Page,但是此时该Word line只编程了一次,因此数据还不能正确读出。
好,到了第三个Word Line了。为啥是第三个Word Line,不应该还是第二个Word Line吗。No No No,在OBP TLC编程当中,编程的顺序要按照Order Address,所以,此时看Order Address的表,0x02所表示的Page在第三个Word Line,所以此时是编程第三个Word Line中Group A的Page,根据Group Page Address可以看到就是Page 3!开始发送命令0x80,,然后是5字节地址0x00,0x00,0x03,0x00,0x00,发完数据然后0xC0,0x11,下面是Group C的Page,0x80,0x00,0x00,0x04,0x00,0x00,0xC0,0x13,最后的Confirm Part,发送命令0x8B,Order地址0x00,0x00,0x02,0x00,0x00,最后发送0x10。
下面再次根据Order Address,看向0x03所代表的Page。呦呵,又跑回第二个Word Line去了,那么此时就重复刚刚的第二个Word Line的编程,命令0x80,地址0x00,0x00,0x01,0x00,0x00,命令0xC0跟地址0x11,。后面0x80, 地址0x00,0x00,0x02,0x00,0x00,命令0xC0跟地址0x13。但是这个是,Confirm Part中的地址不一样了,发送完0x8B后,Order地址为0x00,0x00,0x03,0x00,0x00,最后发0x10。这个真的是最后的命令,此时编程完代表这个Word line已经编程结束,Page 1和Page 2的数据已经可以正常读出了。
这几个编程做完可以发现,OBP中TLC的编程顺序是一个斜线的顺序,后面的编程按照刚刚的规律操作即可全部完成,在Datasheet中只有一段话稍微说明了一下。