SPI NAND完全解讀-基于GD5F1GM7xExxG (qq.com)
前言
SPI NAND支持QSPI接口,具備高速,高可靠,低功耗的特點,相較于傳統(tǒng)并行接口,具有封裝體積小,引腳少,易于使用的優(yōu)勢,并且可以與SPI NOR Flash共用Layout設計,易于切換,使得其越來越廣泛使用。
本文以具體型號為GD5F1GM7xExxG的GD的NAND為例,對SPI NAND Flash進行介紹。不同廠家的不同型號都大同小異了解一款其他的也就都了解了。
GD的SPI NAND Flash介紹
參考官網:
https://www.gigadevice.com.cn/product/flash/product-series/spi-nand-flash/
主要有1.8V和3.3V兩個電壓等級,1Gb,2Gb,4Gb這幾個容量可選。
頻率133(x1,x2,x4),104(x1,x2,x4),80(x1,x2,x4)
都是2K頁 2048+64B用戶spare+64B硬件ECC
都帶硬件ECC
支持DTR
溫度:
-40℃~85℃,
-40℃~105℃
封裝:
WSON8 8x6mm,
WSON8 6x5mm,
TFBGA24 8x6mm (5x5 ball array)
下面以GD5F1GM7xExxG詳細介紹。
基本特征
l1Gb大小,塊擦除,塊含64個 PAGE,PAGE編程(2KB+128B)。
l支持Standard, Dual, Quad SPI,DTR(只針對讀)
DTR即在Quad基礎上下邊沿都可以傳輸數據,帶寬加倍,這個是一個高級功能。
l頻率
最大
Standard/Dual/Quad SPI 時133MHz
DTR Quad SPI 時104MHz 即104Mx4x2b/S, 最快104MB/S。
l軟硬件寫保護,低電壓LOCK保護。
l20KB OTP區(qū)域
lPAGE編程時間320uS,塊擦除3mS,PAGE讀120uS。
lBLOCK0保證OK。
l帶ECC的P/E次數80K,符合SLC的一般水平。數據可保持10年以上。
l支持硬件ECC,默認使能。
8位ECC編碼528B數據。
從FLASH中讀PAGE數據到CACHE中時可以自動檢測和校正錯誤,能夠校正的直接校正返回給用戶的就是正確的數據,有狀態(tài)表示校正錯誤狀態(tài)。額外空間有128字節(jié),64字節(jié)給用戶使用,64字節(jié)給ECC使用。
l內部數據移動和復制功能
這也是一個高級功能,針對FTL管理設計。
這在FTL中垃圾回收管理時非常有用,不需要再到用戶的memory里讀寫倒騰一次,就可以直接移動和復制,并且是帶ECC操作的。
l上電自動加載第一個塊的第一個PAGE到CACHE,并且是帶ECC校正和檢測的。
用戶可以直接讀CACHE,可以加快啟動時間。
有兩個緩存data register 和 cache register,前者更接近于memory陣列,所以作為NAND Flash存儲陣列操作的緩存,后者更接近IO,所以作為IO操作的數據緩存。
cache register使得可以進行頁內的隨機讀寫,和copy back操作。
引腳
CS默認必須拉高,DQS不使用必須浮空
WP和HOLD不用必須拉高。
框圖
其中cache memory包括data register 和 cache register兩個PAGE大小的緩存。
地址
CA:即列地址,頁內地址, 雖然12位可以表示04095,但是實際范圍是02175. 即2K+128字節(jié)的頁空間。
列地址可以理解為矩陣幾行幾列的列。列地址即一行數據(頁)里面的偏移。
RA:行地址, RA<5:0>表示頁地址,RA<15:6>表示塊地址。
存儲組織
頁大小是2K+128,一個塊有64個頁,以鞏固1024個塊。
一個PAGE有128字節(jié)的額外存儲空間,其中前面的64字節(jié)是給用戶用的,FTL的管理使用。后面64字節(jié)是硬件ECC使用。
使能CECC時后面的64字節(jié)用戶不能寫但是可以讀。
硬件ECC不使能時,整個128字節(jié)用戶都可以讀寫。
設備操作
SPI接口
支持兩種模式
模式0 CPOL = 0, CPHA = 0 CLK默認低,第一個邊沿鎖存數據(第一個上升沿)
模式3 CPOL = 1, CPHA = 1 CLK默認高,第二個邊沿多存數據(第一個上升沿)
兩種方式都是上升沿設備輸入數據鎖存SI,然后下降沿主機輸入數據鎖存SO。
如下圖所示
CS拉低是一次通訊的開始,
在SCLK的上升沿SI鎖存數據(設備鎖存數據):注意發(fā)送端實際在前一個下降沿就已經開始輸出數據,因為數據需要有建立時間,然后上升沿設備對SI數據鎖存,在下一個下降沿主機結束數據輸出。
也就是SCLK為低時是SI的數據建立時間,SCLK為高時時SI的數據保持時間。
主機是在下降沿修改SI的數據的。
在SCLK的下降沿SO鎖存數據(主機鎖存數據):注意發(fā)送端實際在前一個上升降沿就已經開始輸出數據,因為數據需要有建立時間,然后下降沿主機對SO數據鎖存,在下一個上升沿沿設備結束數據輸出。
也就是SCLK為高時是SO的數據建立時間,SCLK為低時是SO的數據保持時間。
設備是在上升沿修改SO的數據的。
所以理想狀態(tài)是SCLK的上升沿在SI數據的中間。
在SCLK的下降沿在SO數據的中間。
還有就是需要注意下是高位在前的發(fā)送順序。
還有就需要注意,CS是高時如果是模式0則SCLK要保持低,如果是模式3則需要保持高,不能翻轉。只有CS拉低之后SCLK才能產生時鐘。
默認最好硬件上拉CS,即不使用SPI FLASH時,設備處于idle狀態(tài)。
標準SPI
發(fā)送命令時,和普通IO命令,都是用該模式
SCLK,CS,SI只做輸入,SO只做輸出
DualSPI
在使用x2 和 dual IO命令時的后面數據階段:
SI變?yōu)镾IO0 雙向
SO變?yōu)镾IO1 雙向
Quad SPI
在使用x4 和 Quad IO命令時:的后面數據階段
SI變?yōu)镾IO0 雙向
SO變?yōu)镾IO1 雙向
WP變?yōu)镾IO2 雙向
HOLD變?yōu)镾IO3 雙向
DTR Quad SPI
在狀態(tài)寄存器的QE位置位,且使用DTR Quad I/O Fast Read命令時的數據階段
在Quad SPI基礎上,SCLK的上升沿和下降沿都鎖存數據
HOLD模式
只有在QE=0時才支持該功能,如果QE=1則是使用DTR Quad SPI,HOLD引腳變?yōu)榱薙IO3.
在CS保持低時,HOLD拉低可以只暫停但是不停止正在進行的讀,寫,擦除操作。
HOLD的下降沿之后到SCLK變?yōu)榭臻e電平開始HOLD開始,
HOLD的上升沿之后SCLK變?yōu)榭臻e電平開始HOLD結束。
在HOLD階段SO高阻態(tài),SI和SCLK被忽略掉。
如果HOLD時CS拉高,則會復位內部狀態(tài)機邏輯結束操作,重新開始操作需要HOLD拉高CS拉低。
寫保護
WP用于硬件寫保護, QE=0時才支持該模式.
WP為低時(BP0, BP1, BP2 和INV, CMP)不可寫。
BRWD= 1,WP=0時 上述塊保護位不能修改。
掉電時序
避免在寫和擦除時掉電,或者在電壓低時操作。寫操作或者擦除進行中掉電會導致數據丟失或者損壞。問題:這里的丟失和損壞的影響域是什么,寫PAGE則指揮這一個PAGE損壞,擦除BLOCK只有這個BLOCK損壞嗎? 損壞只是數據不對,后面擦除就可以重新使用還是變?yōu)閴膲K?
DQS信號
DQS信號用于表示READ時輸出數據是否有效。DQS只在BGA24封裝有,用于高速傳輸時,相當于流控。只在 EEh命令用到。
設備接收到EEH命令時拉低QDS,表示忙,此時輸出數據無效,因為設備還在進行內部處理,當DTR模式輸出數據到IO引腳上時拉高DQS,表示數據就緒,主機就可以讀數據了,相當于流控。
DQS的翻轉速度和CLK頻率是一樣的,DTR讀時數據必須在DQS的上升沿和下降沿鎖存數據。這個引腳不使用時必須浮空。
命令表
注意讀cache都需要有dummy,即需要等待一段時間讓設備準備就緒。
FFH Reset命令會復位PAGE READ/PROGRAM/ERASE操作
復位狀態(tài)寄存器P_FAIL/E_FAIL/WEL/OIP/ECCS/ECCSE
上電時序
需要注意的就是Vcc(min)之后至少需要tVSL時間之后才能拉低CS,之前必須一致保持高。
還有就是要注意Vwi,低于該電壓不允許寫,所以在設計電壓看門狗,和掉電保護電路時需要考慮該值,留有一定裕度。
性能參數和時序
注意軟復位0xFF之后需要延遲500uS以上才能發(fā)送下一個命令。
注意兩個參數
輸入信號的高低電平門限
低電平需要低于0.2VCC,高電平需要高于0.8VCC,這個需要測試下,保證IO能拉低到足夠低,拉高到足夠高。很多硬件設計有保護電路,上下拉電阻,串電阻導致分壓,三極管二極管壓降等導致電壓不夠足夠低或者足夠高,就不是很保險。
這里還有個參數需要注意下
正負過充不能超過2V,20nS,這個需要實際測試,理論上就不應該有過充,有些環(huán)境或者設計可能無法消除,也要保證不超過該值,越小越好。
壞塊
保證壽命時間內,最多有20個壞塊,壞塊標記是塊的spare區(qū)域的第一個字節(jié)0x800處為0x00,檢測的話非0xFF即認為壞塊。
操作
讀比編程的指令更多,讀可以使用x1,x2,x4,x4 DTR,且命令之后的Dummy和地址頁也可以x2,x4,x4 DTR。
而編程只有x1,x4,沒有DTR,命令之后的Dummy和地址也只能x1。
寫禁止/使能(0x06/0x04)
寫使能 直接發(fā)送0x06命令即可
頁編程,OTP保護和OTP編程,塊擦除前都需要寫使能。
寫使能生效后0xC0的寄存器WEL位置位
所以一般發(fā)送寫使能命名后要查詢該位確認是否使能。
注意以上編程操作之后WEL自動清0進入寫禁止狀態(tài),這樣做是為了安全避免誤觸發(fā)寫。
寫禁止 直接發(fā)送0x04命令即可
該命令幾乎用不到,因為默認上電WEL就是0寫禁止的,每次編程操作之后硬件也會自動清零WEL進入寫禁止狀態(tài)。
讀
讀需要先通過0x13從FLASH中讀出數據到緩存中,然后通過0x03/0x0B,0x3B,0x6B等指令從緩沖區(qū)中隨機地址開始讀出數據。
0x03/0x0B,0x3B,0x6B除了數據階段前面的時序都是一樣的,數據階段分別使用x1,x2,
X4位。
讀到2048+128后繞回從0開始繼續(xù)。
使用4個引腳的指令需要先使能0xB0寄存器的QE 位。
讀ID(0x9F)
先發(fā)命令再9=8個Dummy Cycles,然后連續(xù)讀2個字節(jié)的數據。
返回MID和DID可以用于區(qū)分具體的型號,具體值可以參考手冊。
以下是一個實測波形
讀PAGE(0x13)
0x13命令將FLASH中的頁讀到緩存中,需要提供24位的PAGE地址。設備收到地址后tRD時間內將FLASH讀到緩沖中, 主機需要讀寄存器0xC0的OIP位,等待OIP為0表示完成。
整個流程如下
拉低CS,發(fā)0x13H的命令,然后發(fā)24位地址,再釋放CS,命令發(fā)送階段完成。
然后是狀態(tài)查詢階段,即讀0xC0寄存器的OIP位,詳見讀寄存器章節(jié)的說明。
從緩沖區(qū)讀數據(0x03/0x0B)
上述的PAGE讀到緩沖區(qū)后,主機就可以從緩沖區(qū)隨機讀數據了。
需要注意的是發(fā)送完命令后需要等4個Dummy cycles。然后發(fā)送12位的PAGE內開始地址,然后再等待8個Dummy Cycles,然后就連續(xù)讀數據。
注意如果時鐘不停,CS不拉高則設備會一直吐數據,地址繞到2048+128的頁邊界后又從0開始繞回繼續(xù)。注意這里的邊界是2048+128而不是2048+64.
X2模式從緩沖區(qū)讀數據(0x3B)
前面和0x03/0xB都是一樣的,先發(fā)8位命令,接下來4位Dummy cycles,然后12位頁內偏移地址,然后8個dummy cycles。
后面數據階段則不一樣,使用了IO0和IO1,IO0和IO1表示兩位IO1表示高位,然后從高位開始輸出,即4個Cycles吐出一個字節(jié)的數據。
X4模式從緩沖區(qū)讀數據(0x6B)
該模式前面和0x03/0xB的時序都是一樣的,從數據階段開始不一樣
使用了IO0和IO1,IO2,IO3,表示4位IO3表示高位,然后從高位開始輸出,即2個Cycles吐出一個字節(jié)的數據。
Dual IO****模式從緩沖區(qū)讀數據(0xBB)
與0x3B的區(qū)別是,0xBB只有命令字使用單IO,其他所有數據都是使用雙IO。
Quad IO****模式從緩沖區(qū)讀數據(0xEB)
與0x6B的區(qū)別是,0xEB只有命令字使用單IO,其他所有數據都是使用4IO。
Quad I/O DTR****模式從緩沖區(qū)讀數據(0xEE)
除了命令字節(jié),其他的上升沿和下降沿都可以傳輸數據,使用4個IO。
不使用DQS
使用DQS
在Dummy和地址階段DQS為低,在數據階段DQS的雙邊沿鎖存數據。其他時候高阻態(tài)。
讀UID
UID是設備獨特碼,可以用于認證,設備編碼等場景。
共32字節(jié),前面16字節(jié)和后面16字節(jié)是取反的關系,所以異或前后16字節(jié)應該全部是0xFF。
為了可靠,避免bit錯誤導致讀出錯誤,UID總共存了16份,如果前面的校驗錯誤(前后16字節(jié)異或不為0xFF),則可以繼續(xù)偏移32字節(jié)用后面的。
讀之前需要設置B0寄存器的OTP_EN為1.
然后回讀確認OTP_EN為1
然后用0x13指令讀FLASH到緩沖區(qū),24位地址寫0.
確認OIP讀完
然后用0x03/0x0B讀UID數據,可以一次讀32x16字節(jié),也可以一次讀32字節(jié)檢查不對再讀后面的。
讀參數頁
參數頁是一些描述芯片的組織,特征,時序和行為的參數。為了可靠數據至少存了3份,即至少有3個頁。
執(zhí)行過程和讀UID一樣,只是24位地址變?yōu)榱?.
讀之前需要設置B0寄存器的OTP_EN為1.
然后回讀確認OTP_EN為1
然后用0x13指令讀FLASH到緩沖區(qū),24位地址寫1.
確認OIP讀完
然后用0x03/0x0B讀緩存區(qū)中的數據。
參數頁符合ONFI標準(https://www.onfi.org/),比如uC-FS的NAND的FTL層就支持使用ONFI模式自動配置NAND參數。
編程
先用0x02或者0x32指令將數據寫入緩沖區(qū)
然后0x06寫使能,確認寫使能成功
然后0x10執(zhí)行緩沖區(qū)到FLASH的寫
最后0x0F讀寄存器0xC0確認P_FAIL是否有錯,OIP是否完成
注意(84h/C4h/34h) 和(FFh) 指令是不會清除緩存中的內容的,所以下次編程時要注意是否緩存區(qū)都是需要更新的數據,所以必須是一次更新整個緩沖區(qū),不要部分更新。
0x02和0x32指令之后緊接著0x10則未被0x02和0x32指令更新的緩沖區(qū)區(qū)域的值變?yōu)?xFF。
(84h/C4h/34h) 指令之后緊接著0x10指令,緩沖區(qū)的內容寫入NAND FLASH中。
編程地址按照塊的順序
QE=1時才能使用0x32指令
如果寫緩沖區(qū),繞到了緩沖區(qū)邊界2176,后面的數據忽略而不是繞回,這個和讀是不一樣的。如果使能ECC寫最后面的64字節(jié)是忽略的。
編程加載PL(0x02)
8位命令0x02后是4個Dummy Cycles,然后是12位頁內偏移地址,然后是數據。
使能ECC時只能寫2112個字節(jié),否則可寫2176個字節(jié)。
編程加載PLx4(0x32)
必須QE=1
使能ECC時只能寫2112個字節(jié),否則可寫2176個字節(jié)。
前面時序一樣,從數據階段開始使用4xIO
編程執(zhí)行PE(0x10)
需要指定24位的PAGE地址, 執(zhí)行后需要等待tPROG時間等待編程完,
可以查詢0xC0寄存器的P_FAIL和OIP
注意編程完成后會自動寫禁止,且緩沖區(qū)中的數據變得無效。
編程加載隨機數據(0x84)
該指令和0x02的區(qū)別是,0x02一次更新整個緩沖區(qū)的數據,而本指令可以更新一部分緩沖區(qū)的數據,多次執(zhí)行可以更新不連續(xù)的區(qū)域。
編程加載隨機數據x4(0xC4/0x34)
和0x84一樣,只是數據階段使用4個IO
必須QE=1
內部數據移動
0x13讀PAGE數據到緩沖區(qū)
84H/C4H/34H 編程加載隨機數據到緩沖區(qū)(可選更新部分數據),如果有多個零散的區(qū)域更新則需要執(zhí)行多次。
0x06寫使能
0x10執(zhí)行緩沖到NAND的寫
0x0F查詢狀態(tài)
塊擦除操作(0xD8)
先0x06寫使能
0xD8擦除,指定24位頁地址
等待tBERS 時間
0x0F讀0xC0的E_FAIL和OIP查詢狀態(tài)
復位
軟復位(0xFF)
停止操作進入idle狀態(tài)
軟復位后的寄存器值參考手冊
使能上電復位和上電復位(0x66,0x99)
比軟件復位更徹底,即和上電復位一樣的效果,寄存器值也和上電復位一樣。
復位完需要等待tVSL 時間,然后讀OIP確認空閑再進行其他操作。
正在編程的存儲器位置或正在擦除的塊的內容不再有效。
先發(fā)0x66使能再發(fā)0x99執(zhí)行操作
特征操作與讀寫寄存器
寄存器用于控制行為,表示狀態(tài)
其中狀態(tài)寄存器0xC0 0xF0是只讀的,除了WEL可以通過0x06指令修改。
特征和保護寄存器0xA0 0xB0 0xD0可以讀寫進行配置。
注意OTP_PRT是非易失的即掉電保存的,其他的是掉電不保存。
特征寄存器一直保持直到上電復位或者重新修改。0xFF軟復位不會清除。
保留值只能寫0
QE=1才能使用4xIO
BRWD=1且WP為低時則不能修改塊保護配置
寄存器如下
默認值分別是
0xA0 0x38
0xB0 0x10
0xC0 0x00
0xD0 0x00
0xF0 0x08
寄存器的一些狀態(tài)位信息
ECC信息
驅動能力
OTP
提供一個受保護的10個PAGE大小的一次可編程區(qū)域。訪問OTP的10個頁需要按如下修改對應寄存器位。
PAGE0存UID
PAGE1存參數頁
PAGE2-PAGE11 用戶使用(只能通過0x02+0x10進行編程),0x13+03H/0BH/3BH/6BH/BBH/EBH 讀出。需要按照如下設置OTP_PRT OTP_EN設置訪問屬性。寫的話先使能OTP的寫然后0x06寫使能,再編程。
塊保護
電源鎖定保護
BPL=1時 塊保護BP[0,2] , INV , CMP 和BRWD 將無法再修改除非掉電重啟。
可以用于QE模式沒有WP硬件保護時,軟件進行保護,保護kuai塊保護狀態(tài)不被修改。
ECC
ECC_EN默認為1,軟件可以修改使能或者禁用硬件ECC,
寫數據硬件自動計算ECC,此時最后64字節(jié)用戶不能寫,讀時自動進行數據校正,狀態(tài)信息更新到ECCS0/1 ECCSE0/1
布局如下,使能ECC時最后64字節(jié)可讀不可寫
讀寄存器(0x0F)
先發(fā)0x0F再發(fā)地址,無需dummy,然后讀字節(jié)
只有普通SPI模式
以下是實測不同寄存器的波形
寫寄存器(0x1F)
先發(fā)0x1F再發(fā)地址,無需dummy,然后寫字節(jié)
只有普通SPI模式
休眠操作
只針對1.8V的設備
進入休眠(0xB9)
此模式忽略所有的編程操作,收到指令tDP 時間后進行真正的休眠
只接受0xAB 0xFF 0x66 0x99指令
退出休眠(0xAB)
上電復位 或者0xAB指令
收到指令后tRES1 時間才可查詢狀態(tài),進行后續(xù)操作
總結
以上基于GD5F1GM7xExxG的GD的NAND為例,對SPI NAND Flash進行了詳細的介紹,對于驅動編寫來說重點關注其波形,所以邏輯分析儀不可少,然后是關注寫保護相關的操作量產時合適的保護可以避免異常的改寫數據。
-
嵌入式
+關注
關注
5082文章
19123瀏覽量
305151 -
NAND
+關注
關注
16文章
1682瀏覽量
136155 -
FlaSh
+關注
關注
10文章
1635瀏覽量
148017 -
SPI
+關注
關注
17文章
1706瀏覽量
91578
發(fā)布評論請先 登錄
相關推薦
評論