海力士、東芝等ED3 NAND Flash編程
ED3的TLC編程規則相對於OBP來說會簡單許多,由於ED3的編程規則很是有規律,很容易掌握,ED3的每一個WL頁數量是固定的。spa
ED3在對行地址的定義上與OBP有着很大的區別:在TLC模式下,ED3的行地址表明的是WL地址。操做的頁是WL中的哪一個頁,是經過命令前的Pre Cmd來肯定的。3d
ED3 TLC編程也遵循一個WL須要編程3次的規則,一次WL編程的命令序列以下blog
第一個命令 09h/0Dh/(空) 分別表明該WL是第幾回編程:第一次編程發09h、第二次編程發0Dh、第三次編程不發input
第二個命令01h/02h/03h 對應的就是上面所描述的選擇當前WL當中的哪一個頁flash
最後面確認編程的命令,只有在當前操做的頁是這個WL的第三個頁的時候,才使用10h,其餘倆個頁都使用1Ahim
ED3 在進行TLC編程的時候也須要遵循一個Order順序,在每次編程的時候,都須要對這一個WL上的三個頁都進行編程操做d3
假設當前操做的是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中只有一段話稍微說明了一下