作者:Bird
上一回【Maker電子學】Flash 記憶體的原理與應用—PART10(NOR flash),我們介紹了 SPI NOR flash 所使用的 SPI 介面,並說明了 SPI 介面的時序,以及讀取 flash 內容的指令長什麼樣子。
這一回我們要繼續介紹 SPI NOR flash 的儲存空間結構,以及抹除、寫入的指令。
NOR Flash 內部結構安排 #
我們依舊用 W25Q32JV 這顆 32M-bit 的 SPI NOR flash 晶片為範例。
雖然 W25Q32JV 是一顆 32M-bit 的 flash,但由於 SPI 所有的操作都是以 byte 為單位,因此我們比較習慣用 byte 來計算。32M bit 就是 32/8 = 4M bytes,如果用十六進位來代表 4M 的位址,需要六位數,從 0x000000 到 0x3FFFFF。
在 W25Q32JV 內部有三種用來分割儲存區域大小的單位,分別是 page、sector 和 block:

(圖片來源:Bird 提供)
我們可以把這些位址的關係跟 address bit 對應起來:

(圖片來源:Bird 提供)
從上面這個表就可以很容易看出來,每一個 page 有 256 bytes(8-bit in-page address)、每一個 sector 有 16 個 page、每一個 block 有 16 個 sector,而 W25Q32JV 總共有 64 個 block。
對於大部分的 SPI NOR flash 產品來說,這種容量分割的架構已經差不多統一了,也就是說不管是 Winbond 還是 Macronix 或是 Infineon 的 SPI NOR flash,page 的大小都是 256 bytes、sector 的大小都是 4K bytes、block 的大小都是 64K bytes,,而不同容量的 SPI NOR flash 則會有不同數量的 block;比方說 Macronix 的 4M-bit SPI NOR flash MX25L4006E,就只有 8 個 64K bytes 的 block,但 sector 和 page 的大小和架構是一樣的。
我們之前說過,flash memory 在寫入之前要先抹除,而抹除實際上就是把記憶體裡的每一個 bit 全部都變成 1,如果是 byte 的話就是把每一個 byte 都變成 0xFF,而 flash 記憶體與 EEPROM 的最大不同就是 EEPROM 可以單個 byte 抹除、寫入,但是 flash 需要整塊整塊的抹除,這種整塊抹除的設計可以讓整個區塊的儲存單元共用同一個抹除電路,降低 flash memory 的電路複雜度,提升密度。
不同的 flash memory 有不同的抹除區塊大小,W25Q32JV 的抹除區塊大小是 sector,也就是 4K bytes;換句話說,就算你只需要改寫 1 個 byte,最少也要抹除 4K bytes 的區域。
抹除指令 #
我們來看一下實際用來抹除 sector 或 block 的指令長什麼樣子。

(圖片來源:Bird 提供)
這張圖是我們要對 W25Q32JV 下 sector erase 指令時的時序圖。看波形好像很複雜,但其實 SPI NOR flash 操作起來的指令都有一樣的結構:先讓 CS 訊號拉低,然後用 CLK 訊號將指令或資料送進去,每 8 個 clock 一組送進一個 byte,或是讀出一個 byte,直到 CS 訊號拉高,結束這一回合的指令。
W25Q32JV 的 sector erase 指令是 0x20,因此在 CS 拉下來後,前 8 個 CLK 訊號就會送入 0b00100000,也就是 0x20 這個指令,接下來的 24 個 CLK 會送入 24-bit 的 address,用來告訴 W25Q32JV 要抹除哪一個 sector 的內容。
由於一個 sector 是 4K 也就是 4096 個 bytes,因此 24-bit address 裡的 A0 – A11 共 12 個 LSB 不會被 W25Q32JV 解碼,它只在意 A12 – A21 共 10 個 bit 的 address,用來選擇 sector。W25Q32JV 的容量是 4M bytes,一個 sector 是 4K bytes,因此總共有 4194304 / 4096 = 1024 個 sector,剛好用 10 個 bit 來選擇。
大部分的 SPI NOR flash 在傳入這種不需要完整的 24-bit address 時,都會忽略用不到的 LSBs,但有某些 SPI flash 會要求 sector address 以外用不到的 LSBs 必須是 0,如果不是 0 它就會略過這個指令不執行,實際上晶片會怎麼做,還是要看 datasheet。
送完 8-bit 的指令加上 24-bit 的 sector address,告訴 W25Q32JV 要抹除哪一個 sector 後,就可以把 CS 訊號拉高,結束這個指令。而實際的抹除動作則會從 CS 拉高的那一瞬間開始。
我們再來看一個相似的指令:抹除 block。

(圖片來源:Bird 提供)
上面這張圖是 block erase,也就是抹除一個 64K-byte block 的指令,它的指令碼是 0xD8,或是二進位的 0b11011000(同樣也是 8-bit 的指令碼接著 24-bit 的位址)。
而和 sector erase 不同的是,這個指令會一次抹掉 64K-byte 這麼大的區間。W25Q32JV 的容量是 4194304 bytes,因此總共有 4194304 / 65536 = 64 個 64K-byte block,需要用 6 個 address 去選擇,換句話說,24 個 address bit 中,只有最前面 6 個 MSBs 會被解碼,後面的 address bits 都沒有用。
同樣地,送完這個指令後,實際的抹除動作會從 CS 訊號拉高的時候開始執行;Flash 的抹除是個很花時間的動作,我們來看看 W25Q32JV 執行抹除需要花多少時間。
在 datasheet 中的 AC characteristic 這個段落,描述了 W25Q32JV 各種跟時間有關的特性,其中就有說明抹除需要的時間。

(圖片來源:Bird 提供)
原來抹除一個 4K-byte 的 sector 需要花 45 – 400 ms 的時間,而抹除一個 64K-byte 的 block 需要花 150 – 2000 ms 的時間。
其實 W25Q32JV 還有個指令(0x52)可以只抹除 32K-byte 的範圍,從上面這張表看起來這個指令所需要的時間是 120 – 1600ms。
至於抹除整顆晶片,也有個專用的指令,這個指令不用帶任何的 address,因為它是抹除整顆晶片。只要送入指令碼(0xC7 或 0x60,兩個都可以),在 CS 上升的瞬間,就會開始毀滅,欸不是,抹除整顆晶片;抹除整顆晶片所需要的時間,根據上面這張表,會需要 10 秒到 50 秒不等.
為什麼抹除指令所需要的時間會有這麼大的差距呢?我們在講 flash 的工作原理時說過,flash memory 在抹除時,需要利用一個相對來說很高的電壓,產生一個強大的電場,讓 floating gate 裡面的電子可以逃離,清掉 floating gate 中的電子。達成這件事所需要的電場強度、時間,與許多環境參數如溫度息息相關,而且隨著 flash memory 寫入次數的累積,抹除動作的難度會越來愈高,會需要越長的時間去確保 floating gate 裡的電子都被清掉。
因此 datasheet 中的 maximum 數字都是 worse case,也就是當 flash 接近壽命終了但還能使用時,抹除動作會需要的時間。在 flash memory 還很新鮮很年輕時,抹除所需要的時間通常會比這個快上許多。
小結 #
這一回我們說明了 SPI NOR flash 的分區結構,以及抹除指令如何執行。由於抹除指令需要花很長的時間,而且執行所需的時間並不固定,因此我們需要有個方法知道抹除指令完成了沒。
下一回我們會繼續說明這個等待並偵測抹除指令執行狀態的機制。
(責任編輯:賴佩萱)