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