上一回【Maker電子學】Flash 記憶體的原理與應用—PART13,我們說明了寫入指令的使用方式,以及寫入時需要注意的事項。這一回我們要介紹 SPI NOR flash 很重要的一道防線:寫入保護機制,這個機制可以設定某些記憶體區域不會被意外寫入或抹除。
層層關卡
SPI NOR flash 很常用來儲存嵌入式系統的 firmware 或是開機引導程式如 boot loader 之類的,這些以 binary 形式存在的程式碼,只要錯了一個 byte,通常就會讓整個系統爛掉(flash 雖然設計成可以重複抹寫,但我們也不希望它裡面的資料在不預期的狀況下被意外改變),因此 W25Q32JV 設計了一些保護機制來處理這個問題,說穿了,其實就是讓寫入或抹除的程序變得稍微複雜一點,意外就沒那麼容易發生。
W25Q32JV 可以針對記憶體中的不同區域各別設定寫入保護,當一個區域被設定寫入保護後,對這個區域執行抹除或寫入的指令就不會有作用,必須先將寫入保護解除,才能對這個區域執行抹除或寫入。
設定保護區塊的方式有兩種:Block Protect 與 Inidividual Block Lock,我們先來說說 Block Protect,這是比較常使用的功能。
Block Protect
這個功能可以保護 W25Q32JV 整個 4M byte 的記憶體空間中,最前面(從位址 0 開始)或最後面(從位址 0x3FFFFF 開始倒著算回去)特定大小的連續區域。設定的方法稍微複雜了點,但原理很簡單。
首先,我們要決定保護的區域是在最前面還是最後面。如果要保護最前面,在狀態暫存器 SR1 中的 TB bit 就要設為 1,反之則設為 0(TB 這個 bit 的意思是 TOP/BOTTOM,換句話說位址 0 就是 top,位址 0x3FFFFF 就是 bottom)。
(圖片來源:Bird 提供)
接著我們要決定保護的大小的單位,是要以 64K bytes 的 block 為單位,還是要以 4K bytes 的 sector 為單位。如果要以 64K bytes 的 block 為單位,就把狀態暫存器 SR1 裡的 SEC bit 設為 0,如果要以 4K bytes 的 sector 為單位,就把狀態暫存器 SR1 裡的 SEC bit 設為 1。
接下來我們要決定保護區域的大小了,這是由狀態暫存器 SR1 裡的 BP0、BP1、BP2 這三個 bit 決定的。這個設定稍微複雜一點:這三個 bit 代表的值可以從 0(000) 到 7(111);當它們的值是 1 時,代表保護 1 個 block 或 1 個 sector;當他們的值是 2 時,就代表保護 2 個 block 或 2 個 sector;當它們的值是 3 時,保護的不是 3 個 block/sector,而是 4 個;當它們的值是 4 時,保護的大小是 8 個 block 或是 sector。
聰明的讀者一定看得出來,它保護的 block/sector 數量是 2^(n-1)個,因此當設定到 7 的時候,會保護 64 個 block;不過這裡還有個例外:如果保護大小的單位是 block,BP0-BP2 可以設定為 0 到 7,但如果保護的單位設定是 sector,BP0-BP2 的值就只能設定為 0-4。
換句話說,當保護單位是 64K bytes 的 block 時,最大可以設定保護 64K bytes * 2 ^(7-1)= 64K bytes * 64 = 4096K bytes,也就是 4M bytes,剛好就是整顆 W25Q32JV 的容量;如果當保護單位時 4K byes 的 sector 時,最大可以設定保護 4K bytes * 2 ^(3-1)= 4K bytes * 8 = 32K bytes。
舉個例子:我們設定 TB=1、SEC=0、BPx = 3(0b011),表示我們要保護的區域是從 top 開始,以 64K bytes block 為單位,保護 2 ^(3-1)= 4 個 block,也就是 256K bytes,所以保護的區域就是:
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏