OpenVINO工具套件AI程式講座
|
View Categories

Flash 記憶體的原理與應用—PART12

作者:Bird

上一回【Maker電子學】Flash 記憶體的原理與應用—PART11,我們說明了 SPI NOR flash 的分區結構,以及抹除指令如何執行。我們從 datasheet 中也發現抹除指令需要花很長的時間執行,而且執行所需的時間並不固定,因此我們需要有個方法來知道抹除指令完成了沒。

這一回我們會繼續說明這個等待並偵測抹除指令執行狀態的機制。

寫入開關 #

上一回我們漏了一件事。SPI NOR flash 在執行任何寫入、抹除的動作之前,需要先下一個指令,叫做 WE(write enable),這個指令沒有資料,只有一個指令碼 0x06,事實上這就是我們前兩回在介紹 SPI 上的指令格式時,所介紹的第一個指令。

(圖片來源:Bird 提供)

如果沒有執行這個指令就執行抹除或寫入指令,寫入的指令就不會被接受。write enable 指令的有效期間只有一個寫入指令;換句話說,如果我們下了 WE,再下一個 sector erase,在 sector erase 結束後,WE 也會一併失效;如果還要再執行另一個 erase 指令,就會需要再下一個 WE 指令。

狀態暫存器 #

W25Q32JV 內部共有三個狀態及設定暫存器(status and configuration register),可以反映晶片的狀態、調整晶片的一些設定。

其中第一個狀態暫存器 SR1 是我們最常用到的。

(圖片來源:Bird 提供)

SR1 的最高 6 個 bit 都跟 flash 記憶體的保護有關,所謂「保護」其實就是防止寫入,當我們設定了某些保護後,就不能用一般的寫入指令寫入被保護的記憶體區域,必須要先解鎖才能寫入。

而剩下的兩個 bit,是兩個只能讀取的狀態。WEL 這個 bit 是 write enable latch 的意思,其實就是我們剛剛介紹的 write enable 指令所操作的對象,當我們下了 0x06 WE 指令後,SR1 裡的 WEL bit 就會被設定成 1,讓寫入或抹除指令可以動作,而寫入或抹除指令結束後,WEL bit 會被自動清成 0,讓寫入功能失效。

SR1 暫存器可讀可寫,而且有專用的指令用來讀寫,但 WEL 這個 bit 不能用 write status register 的指令來寫,一定要用 write enable 指令(0x06)才能設定。

讀寫狀態暫存器 #

讀取狀態暫存器的指令是 0x05、0x35、0x15,分別對應到讀取 SR1、SR2、SR3。

(圖片來源:Bird 提供)

要讀取狀態暫存器 SR1,首先我們一樣將 CS 拉低,然後用 8 個 CLK 送入 0x05 這個指令,接著再送入 8 個 CLK,W25Q32JV 就會在 DO 上面送出 SR1 的內容,而如果我們持續送出 CLK,W25Q32JV 就會再一次送出 SR1 的內容,每 8 個 CLK 就可以讀出一次 SR1 的內容。

這個機制很有用,特別是用來檢查寫入動作完成了沒。

聰明的讀者應該已經注意到,SR1 的第一個 bit 叫做 write in progress,這個 bit 就是用來指示寫入動作的狀態。

我們在上一回說明抹除動作時,有說過抹除動作所需要的時間相對來說很長,而且範圍變動很大。以抹除整顆晶片的指令來說,需要的時間可能從 10 秒到 50 秒不等,那我們要怎麼知道它到底要花多久、到底做完了沒呢?就是靠 WIP bit。

當 W25Q32JV 在執行抹除、寫入指令時,SR1 裡的 SR1 bit 會變成 1,直到寫入動作完成,這個 bit 才會變成 0,而在寫入動作執行的過程中,我們可以藉由反覆讀取 SR1 的 WIP bit,來得知寫入動作完成了沒,如果 WIP bit 是 1,表示晶片還在執行寫入,它還在忙。

W25Q32JV 在寫入動作進行時,只接受兩個指令:讀取 SR1 以及暫停寫入,除此之外其它的指令都會被忽略。

因此典型的做法就是,每當下了任何的抹除或是寫入指令後,就持續發送 0x15 這個指令讀取 SR1,並判斷 WIP 的狀態。如果 WIP 是 1,表示晶片還在忙,就繼續送出 CLK 讀取 SR1,直到 WIP bit 變成 0,表示晶片忙完了,我們就可以把 CS 拉高、結束讀取 SR1 的指令,然後開始下一個指令。

抹除或寫入暫停 #

由於抹除或寫入所需要的時間相對來說很長,對於一些 real-time 的系統來說,沒辦法接受連續這麼長的時間無法存取 flash 記憶體,因此 W25Q32JV 提供了一個「寫入/抹除暫停」的指令,讓我們在必要的時候可以暫停寫入或抹除的動作,先去讀取其它與寫入或抹除無關的記憶體區塊,拿到所需要的資料後,再回頭來繼續抹除或是寫入。

當我們對 W25Q32JV 下了寫入或抹除的指令,並將 CS 訊號拉 high 之後,它就會開始寫入或抹除的動作。在這個狀態下,W25Q32JV 只能接受兩個指令,一個是我們前面提過的讀取狀態暫存器的指令,用來讓我們讀取 WIP bit 的狀態以判斷寫入或抹除的動作結束沒,而另一個可以接受的指令就是這個:0x75 寫入或抹除暫停。

(圖片來源:Bird 提供)

在寫入或抹除的過程中,只要接到這個指令,在經過一小段時間後,動作就會暫停,然後 W25Q32JV 就可以接受其它的讀取指令,用以讀取與寫入或抹除位址無關的記憶體內容。這段等待的時間叫做 tSUS,根據 datasheet,它最長需要 20uS,不算太長。

當我們忙完其它的讀取動作之後,要回頭來把寫入或是抹除的動作做完,就要下 0x7A 寫入或抹除動作繼續的指令。下了這個指令後,原來被暫停的寫入或抹除動作就會繼續執行,W25Q32JV 也恢復到只能接受讀取狀態暫存器、暫停這兩個指令的狀態。

抹除中斷的機制 #

抹除在 flash memory 裡是一件稍微比寫入困難一點的事,因為它要將電子從浮動閘極中放掉,這需要一個很強大的電場,而且不是保證一次就成功。

因此 NOR flash 的抹除機制通常是個「erase/verify」交替的過程,下圖是一個 NOR flash 在執行抹除指令時的內部時序示意圖。

(圖片來源:Bird 提供)

Erase pulse 是產生電場讓浮動閘極裡的電子洩漏掉的訊號。每一次送出 erase pulse 之後,flash 裡面的控制器就會逐一檢查要抹除的區塊內有沒有不是 1 的內容。一般來說,一次的 erase pulse 是不足以把整個要抹除的區塊內所有的浮動閘極都清乾淨,因此在 verify 的過程就會很快發現裡面有不是 1 的內容,一旦檢查到這些漏網之魚,控制器就會重新送出一次 erase pulse,再執行一次抹除的動作,接著再檢查… 如此週而復始,直到整個區塊裡都沒有 0 了,通過檢查,才結束整個 erase 指令。

隨著 flash 抹除的次數越來越多,浮動閘極附近的半導體缺陷會越來愈多,erase 的動作就會越來越困難,成功抹除所需要的 erase pulse 次數也會越來越多,因此 erase 指令所需要的時間就會越來越長。

當我們下達抹除暫停的指令時,如果剛好是在 erase pulse 進行的中間,這個 erase pulse 就會被中斷,而一個時間很短的 erase pulse 通常對抹除浮動閘極中的電子沒什麼幫助,因此如果我們很頻繁的使用抹除暫停的指令去中斷一個抹除的動作,這個抹除動作所需要的總時間有可能會比預期的要長。

小結 #

這一回我們說明了 SPI NOR flash 的寫入、抹除等待機制,以及要如何偵測它。我們也說明了寫入或抹除可以被暫停的機制,以及暫停可能會帶來什麼影響。

下一回我們要繼續說明在抹除之後,資料寫入要如何運作,以及資料要怎麼設定保護。

(責任編輯:賴佩萱)

Powered by BetterDocs

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *