下面將對W25Q128的常用操作方式進行介紹。
1、只發送指令——寫使能、寫失能
寫使能是指狀態寄存器中的WEL位置1(發送寫使能指令后硬件自動設置),失能就是清零操作。在發送頁寫,扇區擦除,塊擦除,片擦除,寫狀態寄存器,擦寫安全寄存器指令之前,必須先等待WEL 位置1 ,這些操作完成后,WEL會自動硬件清零。寫失能是將狀態寄存器中的WEL軟件清零,寫失能這個操作很少用到,大多數情況都是硬件自動完成。
根據SPI的操作時序,將指令(06h或04h)通過DI(MOSI)發送給W25Q128,期間DO(MISO)處于高阻狀態,時序圖如圖6-11和圖6-12所示。
圖6-13 寫使能時序
圖6-14 寫失能時序
2、發送指令,返回數據——讀狀態寄存器
讀狀態寄存器指令允許讀8位狀態寄存器位。讀狀態寄存指令在任何時間都可使用,可以用05H/35H/15H分別讀取W25Q128的三個狀態寄存器。實際上用的最多的只有05H讀取狀態寄存器1的第0位(BUSY位),用來查看相應指令周期是否結束,芯片是否可以接收新的指令。
根據SPI的操作時序,將指令05H通過DI發送,而后通過DO讀回狀態寄存器的值,時序圖如圖6-15所示。注意通常我們只讀一個字節,時序圖后續字節為芯片備用擴展的。
圖6-15 讀狀態寄存器時序圖
3、發送指令+數據——寫狀態寄存器
寫狀態寄存器的作用主要實現對Flash某些區域的數據或者狀態保護,一旦寫入保護狀態,在狀態解除之前,這塊區域是禁止寫入和擦除的。這部分在本教程中沒有應用,有興趣的讀者可以根據時序圖和手冊資料了解一下,時序圖如圖6-16所示。
圖6-16 寫狀態寄存器時序圖
4、讀數據
讀數據指令允許從存儲器讀一個字節和連續多個字節。
首先要確認BUSY位為0,然后根據SPI的操作時序,首先寫入指令代碼03H,而后緊跟3個字節的地址。當W25Q128收到地址后,會將相應地址處的數據根據SPI時序輸出來;如果連續讀多個字節,那每經過8個時鐘周期地址自動加1,并且輸出相應數據,一直到CS拉高,時序圖如圖6-17所示。
圖6-17 讀數據時序圖
5、寫入數據(頁編程)
W25Q128一次寫入的數據只能小于等于256字節,并且不能一次性跨頁寫入。當遇到跨頁時,應先寫滿一頁,等待BUSY位為0,再次往下一頁寫。(如果寫滿一頁繼續往下寫則會跳到緩存區的頁首位置開始寫,之前數據會被覆蓋)
在寫入數據之前,該頁必須被擦除過,然后根據寫入地址和寫入的字節數計算是否跨頁以及頁數。根據SPI的操作時序,首先通過寫使能將WEL置1,然后寫入指令代碼02H,而后緊跟著3個字節的地址,而后接著發送要存儲的數據,時序圖如圖6-18所示。
圖6-18 頁編程時序圖
寫入數據完畢后,W25Q128將數據從緩存搬移到非易失區所消耗的時間要了解一下,在手冊的84頁有介紹,大概是(30+(x-1)*2.5)us ~ (50+(x-1)*12) us之間(x為寫入的字節),搬移完成后,WEL位會自動清零,BUSY自動清零。
6、扇區擦除、塊擦除
可以使用20H、52H和D8H分別對扇區擦除、32K塊擦除和64K塊擦除。根據SPI的操作時序,在寫入擦除指令之前首先通過寫使能將WEL置1,然后寫入指令代碼20H/52H/D8H中的一個,而后緊跟著3個字節的擦除首地址。
地址發送完畢后,必須將CS拉高,擦除指令才開始執行,并且需要一定的擦除時間,在這個時間內,只能讀狀態寄存器,其他操作均不能進行。扇區、32K塊和64K的擦除典型時間分別是100ms、120ms和150ms,最大時間分別是400ms、1.6s、2s。當擦除完成,WEL和BUSY位自動清零,就可以再次接收新的操作指令,時序圖如圖6-19所示。
圖6-19 扇區和塊擦除時序圖
7、全片擦除
可以使用C7H/60H指令對整片進行擦除操作。根據SPI的操作時序,在寫入擦除指令之前首先通過寫使能將WEL置1,然后寫入指令代碼C7H或者60H,發送完畢拉高CS后,擦除指令開始執行。
整片擦除過程中,只能讀狀態寄存器,其他操作均不能進行。整片擦除的典型時間是40秒,最大時間是200秒。當擦除完成后,WEL和BUSY位自動清零,就可以再次接收新的操作指令,時序圖如圖6-20所示。
圖6-20 全片擦除時序圖
接下來根據W25Q128的時序編寫驅動程序,該驅動文件可以驅動W25Qxx系列的Flash存儲芯片,不同型號的ID不同,W25Qxx初始化時會通過判斷芯片ID來識別是否通信成功。
6.9.3 串口控制Flash讀寫實驗
由于Flash與EEPROM實現的功能類似,本節通過改寫串口發送指令控制EEPROM讀寫數據的例程,設計了串口發送指令控制Flash讀寫。幫助大家更好的體會串口實用例程以及Flash讀寫流程。
Flash讀數據指令格式:“f-read 地址 字節長度”,其中地址范圍為0~1610241024,e2read、地址、字節長度之間由空格隔開,比如從地址1開始讀取5字節數據:f-read 1 5。單片機收到指令后執行多字節讀操作,通過串口助手返回讀出的數據。
Flash寫數據指令格式:“f-write 地址 數據”,地址范圍為0~1610241024,f-write、地址、數據之間同樣由空格隔開,比如從地址1開始寫入hello:f-write 1 hello。單片機收到指令后執行多字節寫操作,寫入成功后通過串口助手返回“f-write done.”
如果發送指令格式錯誤,返回“bad parameter.”,如果發送指令錯誤,將返回發送的數據。由于程序中設定的串口接收和發送緩沖區最大為256字節,因此該實驗單次讀取或者寫入的字節數應小于256字節。
106.10 邏輯分析儀測試SPI信號
當進行SPI通信出現異常時,可以通過邏輯分析儀進行通信時序上的問題查找,如圖6-18所示。從圖上可以看出SCK空閑時是高電平,即CPOL=1;從CLK的跳沿箭頭上可以看出,是后沿讀取數據,即CPHA=1。數據分析可以通過MISO和MOSI解析后的數據判斷出。通過分析儀的數據解析功能,可以直觀看到STM32與Flash之間的通信數據,從而進一步確定問題所在。
圖6-21 Kingst LA5016邏輯分析儀解析SPI數據
-
單片機
+關注
關注
6040文章
44592瀏覽量
636897 -
SPI
+關注
關注
17文章
1717瀏覽量
91839 -
EEPROM
+關注
關注
9文章
1027瀏覽量
81773 -
IIC
+關注
關注
11文章
302瀏覽量
38405 -
uart
+關注
關注
22文章
1242瀏覽量
101538
發布評論請先 登錄
相關推薦
評論