STM32學習筆記——SpiFlash

FLASH快閃記憶體是屬於記憶體器件的一種,“Flash”。快閃記憶體則是一種非易失性( Non-Volatile )記憶體,在沒有電流供應的條件下也能夠長久地保持資料,

其儲存特性相當於硬碟,這項特性正是快閃記憶體得以成為各類便攜型數字裝置的儲存介質的基礎。

各類 DDR 、 SDRAM 或者 RDRAM 都屬於揮發性

記憶體,只要停止電流供應記憶體中的資料便無法保持,因此每次電腦開機都需要把資料重新載入記憶體。

FLASH晶片介紹——W25Q64

W25Q64 (64M-bit(兆位)==>8MB(兆位元組)),W25Q16(16M-bit==>2MB)和 W25Q32(32M-bit==>4MB)是為系統提供一個最小的空間、引腳 和功耗的儲存器解決方案的序列 Flash 儲存器。25Q 系列比普通的序列 Flash 儲存器更靈活,效能 更優越。基於雙倍/四倍的 SPI,它們能夠可以立即完成提供資料給 RAM,包括儲存聲音、文字和資料。晶片支援的工作電壓 2。7V 到 3。6V,正常工作時電流小於 5mA,掉電時低於 1uA。所有晶片提供 標準的封裝。

W25Q64原理框圖:

STM32學習筆記——SpiFlash

記憶體空間分配:

W25Q64/16/32 由每頁 256 位元組組成。每頁的 256 位元組用一次頁程式設計指令即可完成。每次可以擦 除 16 頁(1 個扇區)、128 頁(32KB 塊)、256 頁(64KB 塊)和全片擦除。

W25Q64 的記憶體空間結構:一頁 256 位元組,4K(4096 位元組)為一個扇區,16 個扇區為 1 塊,容量 為 8M 位元組,共有 128 個塊,2048 個扇區。

W25Q16記憶體空間結構:容量2M位元組,32個塊,對應的扇區32*16=512個扇區。

記憶體之間各種單位之間的關係:256位元組=1頁,16頁=1扇區,16扇區=1塊。

在我們操作flash地址時,格式一般為一個6位16進位制數,換算成二進位制數每位對應的含義分別對應了他的塊地址(前兩位),扇區地址(第三位),頁地址(第四位)和業內地址(後兩位)。具體關係如下:

STM32學習筆記——SpiFlash

相關暫存器:

對W25Q64晶片的操作,同樣是由相應的控制暫存器和狀態暫存器完成的

STM32學習筆記——SpiFlash

匯流排忙標誌位(BUSY)

BUSY位是一個只讀位,在狀態暫存器中的S0位。當W25Q64在執行“頁程式設計”、“扇區擦除”、“塊區擦除”、“晶片擦除”以及“寫狀態暫存器”指令時,該位被硬體自動置1。這時候,除了“讀狀態暫存器”指令外的所有操作指令將會被晶片忽略。當晶片執行完這些指令後,硬體會自動將該位清零,表示晶片器件可以接收其他的指令。

防寫位(WEL)

WEL位是一個只讀位,在狀態暫存器的S1位。在執行完“寫使能”指令後,該位會被硬體自動置1。當晶片掉電後和執行“寫禁能”、“頁程式設計”、“扇區擦除”、“塊區擦除”以及“晶片擦除”指令都會進入“防寫狀態”。

塊區保護位(BP2、BP1、BP0)

BP2、BP1、BP0這3位為可讀可寫位,分別在狀態暫存器的S4、S3以及S2位。這3個位預設狀態為0,即塊區處於未保護狀態。可以利用“寫狀態暫存器”指令對這幾個位進行置1來達到塊區保護的目的。塊區保護狀態為:沒有保護、部分保護和全部保護狀態。

注:當狀態暫存器的SRP位為1或讀防寫管腳(/WP)為低電平時,這3個位不可被更改。

底部和頂部塊保護位(TB)

TB位是一個可讀可寫位,在狀態暫存器的S5位,預設值為0。可以利用“寫狀態暫存器”指令對這個位進行置1或清零。當TB = 0時,表示保護位從頂部開始,當TB = 1時,表示保護位從底部開始。

注:當狀態暫存器的SRP位為1或讀防寫管腳(/WP)為低電平時,這個位不可被更改。

扇區/塊保護(SEC)

SEC位為一個可讀可寫位,在狀態暫存器的S6位,預設值為0。可以利用“寫狀態暫存器”指令對這個位進行置1或清零。當SEC = 0時,表示每次保護的區域大小為4K;當SEC = 1時,表示每次保護的區域大小為8K。

狀態暫存器保護位(SRP0、SRP1)

SRP0和SRP1這2位為可讀可寫位,分別在狀態暫存器的S7和S8(狀態暫存器2)位。這兩個位的預設值為0,可以利用“寫狀態暫存器”指令對這個位進行置1或清零。這2個位和讀防寫管腳(/WP)決定了狀態暫存器防寫的方式。狀態暫存器防寫的方式有:軟體保護,硬體保護、電源鎖定或一次性可程式設計(OTP)保護。

快速SPI通訊使能(QE)

QE位為一個可讀可寫位,在狀態暫存器的S9(狀態暫存器2)位,預設值為0。以利用“寫狀態暫存器”指令對這個位進行置1或清零。當QE = 0時,W25Q54設定為標準速度模式或快速模式,保持管腳(/HOLE)和讀防寫管腳(/WP)啟用;當QE = 1時,W25Q54設定為高速模式,儲存管腳(/HOLE)和讀防寫管腳(/WP)被設定為IO2和IO3功能使用。

具體操作步驟

相關指令表:

STM32學習筆記——SpiFlash

工作時序圖

1,寫使能

Write Enable指令將狀態暫存器中的Write Enable Latch (WEL)位設定為1,在每個頁面程式,扇區擦除,塊擦除,晶片擦除和寫狀態暫存器指令執行前,都需要設定寫使能為1。寫使能指令先將CS引腳拉低,傳送指令程式碼“06h”進入資料輸入(DI)引腳上,在CLK的上升沿進行採集,然後將CS引腳拉高。

STM32學習筆記——SpiFlash

2,寫失能

Write Disable指令操作順序和使能一樣,只不過是將傳送的指令改為“04h”

STM32學習筆記——SpiFlash

3,讀狀態暫存器指令

當/CS 拉低之後,開始把 05h 從 DI0 引腳送到晶片,在CLK 的上升沿資料被晶片採集,當晶片認出採集到的資料時 05h 時,晶片就會把“狀態奇存器〞的值從 DO引腳輸出,資料在CLK 的下降沿輸出,高位在前。“讀狀態奇存器”指令在任何時候都可以用,甚至在程式設計、擦除和寫狀態奇存器的過程中也可以用,這樣,就可以從狀態奇存器的 BUSY 位判斷程式設計、擦除和寫狀態奇存器週期有沒有結束,從而讓我們知道晶片是否可以接收下一條指令了。如果/CS 不被拉高,狀態暫存器的值將一直從 DO 引腳輸出。/CS 拉高之後,讀指令結束。

STM32學習筆記——SpiFlash

4,寫狀態暫存器

在執行“寫狀態暫存器”指令之前,需要先執行“寫使能”指令。先拉低/CS引腳,然後把01h從DIO引腳送到晶片,然後再把你想要設定的狀態暫存器值透過DIO引腳送到晶片,拉高/CS引腳,指令結束,如果此時沒有把/CS引腳拉高,或者是拉的晚了,值將不會被寫入,指令無效。

只有“狀態暫存器”當中的“SRP, TB、BP2,BP1、BPO位”可以被寫入,其它“只讀位“值不會變。在該指令執行的過程中,狀態暫存器中的BUSY位為1,這時候可以用“讀狀態暫存器”指令讀出狀態暫存器的值判斷,當指令執行完畢, BUSY位將自動變為0,WEL位也自動變為0

透過對“TB” “BP2”“BP1” “BPO”位寫1,就可以實現將晶片的部分或全部儲存區域設定為只讀。透過對“SRP位”寫1,再把/P引腳拉低,就可以實現禁止寫入狀態暫存器的功能。

STM32學習筆記——SpiFlash

5,讀取資料

“讀資料”指令允許讀出一個位元組或一個以上的位元組被讀出。先把/CS引腳拉低,然後把03h透過DIO引腳送到晶片,之後再送入24位的地址,這些資料在CLK的上升沿被晶片採集。晶片接收完24位地址之後,就會把相應地址的資料在CIK引腳的下降沿從DO引腳送出去,高位在前。當讀完這個地址的資料之後,地址自動增加,然後透過DO引腳把下一個地址的資料送出去,形成一個數據流。也就是說,只要時鐘在工作,透過一條讀指令,就可以把整個晶片儲存區的資料讀出來。把/cS引腳拉高, “讀資料”指令結束。當晶片在執行程式設計、擦除和讀狀態暫存器指令的週期內, “讀資料”指令不起作用。

STM32學習筆記——SpiFlash

6,按頁寫入資料

執行“頁程式設計”指令之前,需要先執行“寫使能”指令,而且要求待寫入的區域都為1,也就是需要先把待寫入的區域擦除。先把/CS引腳拉低,然後把程式碼02h透過DIO引腳送到晶片,然後再把24位地址送到晶片,然後接著送要寫的位元組到晶片。在寫完資料之後,把/CS引腳拉高。

寫完一頁(256個位元組)之後,必須把地址改為0,不然的話,如果時鐘還在繼續,地址將自動變為頁的開始地址。在某些時候,需要寫入的位元組不足256個位元組的話,其它寫入的位元組都是無意義的。如果寫入的位元組大於了256個位元組,多餘的位元組將會加上無用的位元組覆蓋剛剛寫入的的256個位元組。所以需要保證寫入的位元組小於等於256個位元組。

在指令執行過程中,用“讀狀態暫存器”可以發現BUSY位為1,當指令執行完畢, BUSY位自動變為0。如果需要寫入的地址處於“防寫”狀態, “頁程式設計”指令無效。

STM32學習筆記——SpiFlash

7,獲取裝置資訊

出於相容性原因,W25Q64BV提供了幾個指令以電子方式確定裝置的身份。Read JEDEC ID指令與用於SPI的JEDEC標準相容相容序列儲存器在2003年被採用。指令透過驅動/CS引腳啟動降低並移動指令程式碼“9Fh”。JEDEC分配給Winbond (EFh)的製造商ID位元組然後將兩個裝置ID位元組,記憶體型別(ID15-ID8)和容量(ID7-ID0)移出以最有效位(MSB)為首的CLK下降沿,如圖29所示。用於儲存型別和

容量值參見廠商和裝置標識表。

STM32學習筆記——SpiFlash

STM32模組程式設計思路

配置SPI模組功能管腳相應的GPIO管腳。

配置SPI模組工作方式。

使能SPI模組時鐘。

根據SPI SPI主模式設定步驟設定SPI工作方式。

編寫SPI讀寫位元組函式。

根據目前器件的指令操作器件。