一、W25QFV基礎(chǔ)內(nèi)容
1.SPI通信基礎(chǔ)知識
SPI(Serial Peripheral Interface)是同步串行外設(shè)接口,它就像一個“全雙工”的傳送帶,單片機和 Flash 之間可以同時收發(fā)數(shù)據(jù)。
四根線邏輯:
SCK (Serial Clock):時鐘線,由主機(CW32)提供,決定傳輸節(jié)奏。
MOSI (Master Out Slave In):主機輸出,從機輸入。數(shù)據(jù)從 CW32 流向 W25Q。
MISO (Master In Slave Out):主機輸入,從機輸出。數(shù)據(jù)從 W25Q 流回 CW32。
CS/NSS (Chip Select):片選信號,低電平有效。它是整個通信的“開關(guān)”,必須先拉低才能通話。
通信模式:W25Q 系列通常支持 Mode 0 和 Mode 3。 咱們在 CW32 中配置的是 SPI_CPOL_High 和 SPI_CPHA_2Edge(Mode 3),確保在 48MHz 高頻下數(shù)據(jù)采樣依然穩(wěn)定。
2、W25Q64 存儲架構(gòu)(必須理解)
很多人分不清扇區(qū)和塊,導(dǎo)致擦除時誤刪數(shù)據(jù)。記住這個公式:
1 Page (頁) = 256 字節(jié):寫入的基本單位。
1 Sector (扇區(qū)) = 16 頁 = 4KB:擦除的最小單位。
1 Block (塊) = 16 扇區(qū) = 64KB:大面積清空的單位。
總?cè)萘?/strong>:128 個塊 = 8MB。
核心規(guī)則:Flash 的物理特性是“只能把 1 變成 0”。因此,寫入新數(shù)據(jù)前必須先擦除(變?yōu)槿?0xFF)。
二、硬件連接與引腳分配
SPI2 接口分配
在 CW32F030 中,我們選擇了 SPI2 避開 PAN3031 無線模塊的 SPI1。
PB12 (CS):軟件控制片選。
PB10 (SCK):時鐘。
PB14 (MISO):數(shù)據(jù)接收。
PB15 (MOSI):數(shù)據(jù)發(fā)送。
注意事項
供電:嚴(yán)禁接 5V,必須接 3.3V。
保護(hù)引腳:若模塊上有 WP 或 HOLD,必須接 3.3V,否則無法擦寫。
三、硬內(nèi)部閃存結(jié)構(gòu)
1.W25Q64FV 串行閃存(Serial Flash)的內(nèi)部架構(gòu)框圖(Block Diagram)

2.存儲層級結(jié)構(gòu)(右側(cè)部分:倉庫的組織)
這部分的圖表展示了 W25Q64 的“倉庫”是如何劃分房間的:
Block(塊):整個芯片共有 128 個 Block(從 Block 0 到 Block 127),每個 Block 的容量是 64KB。
Sector(扇區(qū)):每個 Block 內(nèi)部又劃分為 16 個 Sector(從 Sector 0 到 Sector 15),每個 Sector 的容量是 4KB。
這就是為什么你的程序中 SPI_FLASH_SectorErase 是以 4KB 為單位擦除的,因為它對應(yīng)圖中左側(cè)的小方格。
Page(頁):在最底層,數(shù)據(jù)被存放在 Page 中。圖中下方的 256-Byte Page Buffer 說明了每次寫入(Program)操作的最大單位是 256 字節(jié)。
地址范圍示例:
Sector 0 的地址范圍是 000000h 到 000FFFh。
Sector 1 的地址范圍是 001000h 到 001FFFh。
3.控制與邏輯(中間部分:管理辦公室)
這部分展示了芯片處理你指令的“大腦”:
SPI Command & Control Logic:這是指揮中心。它接收你通過單片機發(fā)送的 03h(讀)、02h(寫)、06h(寫使能)等指令,并將其翻譯成內(nèi)部操作。
Status Register(狀態(tài)寄存器):這就是我們之前用來解除“寫保護(hù)”的地方。它連接著 Write Control Logic,控制著芯片是否允許被擦除或?qū)懭搿?/p>
High Voltage Generators:Flash 存儲需要高電壓來“泵”電子進(jìn)入存儲單元。這個模塊負(fù)責(zé)產(chǎn)生擦除和編程所需的高壓。
4.外部接口(左側(cè)部分:大門)
這是你連接單片機的 6 根線:
/CS, CLK, DI(IO0), DO(IO1):標(biāo)準(zhǔn)的 SPI 通信引腳。
/WP (Write Protect) 和 /HOLD:硬件保護(hù)和掛起引腳。圖中顯示它們直接連向控制邏輯。正如我們之前討論的,如果模塊上沒有這些引腳,它們通常在 PCB 內(nèi)部被連到了高電平。
四、芯片初始化與協(xié)議邏輯

1.上電與初始化 (Power On & Initialization)
起始點:當(dāng)芯片接通電源(Power On)后,它并不能立即工作,而是先進(jìn)入 設(shè)備初始化(Device Initialization) 階段。
默認(rèn)模式:初始化完成后,芯片會默認(rèn)進(jìn)入 標(biāo)準(zhǔn) SPI(Standard SPI)模式。在這個模式下,它同時支持你之前提到的雙線(Dual SPI)和四線(Quad SPI)指令。
2.模式切換:SPI ? QPI
圖中的中間部分展示了如何在兩種主要的通信協(xié)議之間轉(zhuǎn)換:
進(jìn)入 QPI (Enable QPI):通過發(fā)送指令 38h,芯片可以從 SPI 模式切換到 QPI(Quad Peripheral Interface)操作 模式。
注:QPI 模式下,指令本身也通過 4 根線發(fā)送,速度比標(biāo)準(zhǔn) SPI 更快。
退出 QPI (Disable QPI):通過發(fā)送指令 FFh,芯片會退回到標(biāo)準(zhǔn)的 SPI 模式。
3.軟件復(fù)位機制 (Reset)
圖中兩條回環(huán)的曲線展示了軟件復(fù)位的邏輯:
復(fù)位指令串:無論是處于 SPI 還是 QPI 模式,只要連續(xù)發(fā)送 66h (Reset Enable) + 99h (Reset) 這一組指令,芯片就會強制退回到“設(shè)備初始化”狀態(tài)。
意義:如果你在代碼運行中發(fā)現(xiàn)芯片“卡死”或不響應(yīng)(比如你之前遇到的 JedecID 讀出全為 0xFF 的情況),可以通過這組復(fù)位指令嘗試讓芯片重新初始化,而無需物理斷電。
4. SPI 與 QPI 操作模式 (6.1 節(jié))
這部分定義了單片機(主機)與 Flash(從機)之間“對話”的物理方式。
標(biāo)準(zhǔn) SPI (Standard SPI):
Mode 0:空閑時 CLK 為低電平。
Mode 3:空閑時 CLK 為高電平。
信號線:使用 CLK、/CS、DI (數(shù)據(jù)入) 和 DO (數(shù)據(jù)出) 四根線。
時序:在 CLK 上升沿寫入數(shù)據(jù),在下降沿讀取數(shù)據(jù)。
模式支持:支持 Mode 0 和 Mode 3。
多線增強模式 (Dual / Quad SPI):
Dual SPI:將 DI 和 DO 變成雙向引腳(IO0, IO1),速度翻倍。
Quad SPI:利用所有四根數(shù)據(jù)線(IO0-IO3),速度提升 4-6 倍。需要先設(shè)置狀態(tài)寄存器中的 QE 位 才能開啟。
QPI 模式:
一種極速模式,連“指令碼”都通過 4 根線發(fā)送(原本需要 8 個時鐘,現(xiàn)在只需 2 個)。通過 38h 指令切換進(jìn)入。
5.硬件輔助功能 (6.1.5 節(jié))
暫停功能 (Hold Function):
當(dāng) /CS 為低(選中狀態(tài))時,拉低 /HOLD 引腳可以暫停當(dāng)前的 SPI 通信。
應(yīng)用場景:如果 SPI 總線上掛了多個設(shè)備,而單片機突然需要處理更高優(yōu)先級的任務(wù),可以先“掛起”Flash,處理完后再恢復(fù),無需重新發(fā)送指令。注意:此功能在 Quad/QPI 模式下不可用。
6.寫入保護(hù)機制 (6.2 節(jié))
這是你之前遇到“寫不進(jìn)去”問題的理論根源。為了防止由于噪聲或意外掉電導(dǎo)致數(shù)據(jù)損壞,芯片設(shè)計了多層“鎖”:
上電自動鎖:
VCC 門限:電壓低于閾值時,芯片自動復(fù)位并禁止所有操作。
啟動延遲:上電后有一段延遲時間 (tPUW),期間禁止編程和擦除指令。
寫使能鎖 (WEL):
關(guān)鍵點:上電后默認(rèn)是“寫禁止”狀態(tài)。
邏輯:在執(zhí)行頁編程、扇區(qū)擦除或?qū)憼顟B(tài)寄存器前,必須先發(fā)送 Write Enable (06h) 指令。
自動回鎖:完成一次編程或擦除后,芯片會自動回到“寫禁止”狀態(tài)。
軟件/硬件組合鎖:
軟件鎖:通過狀態(tài)寄存器中的 BP0-BP2 位,可以鎖定特定區(qū)域(甚至整片區(qū)域)為只讀。
硬件鎖:配合 /WP 引腳。如果軟件鎖被激活且 /WP 為低,則狀態(tài)寄存器無法被更改。
7.開發(fā)者 Tips
關(guān)于時鐘:確認(rèn)你的 CW32 SPI 極性配置與手冊中的 Mode 0 或 Mode 3 匹配。
關(guān)于速度:雖然標(biāo)準(zhǔn) SPI 簡單,但對于 500 個節(jié)點的大數(shù)據(jù)上報,未來可以考慮開啟 Dual/Quad 模式提速。
關(guān)于穩(wěn)定:在重要擦寫操作前,務(wù)必檢查狀態(tài)寄存器的 WEL 位。
關(guān)于防死機:如果通信紊亂,建議發(fā)送軟件復(fù)位指令序列 (66h + 99h)。
8.W25Q64FV 狀態(tài)寄存器
8.1 實時狀態(tài)位:芯片在干什么?
這兩位是你編寫底層驅(qū)動函數(shù)(如 WaitForWriteEnd)時必須頻繁讀取的。
BUSY (S0 - 只讀):
功能:當(dāng)芯片正在執(zhí)行頁編程、扇區(qū)/塊擦除或?qū)憼顟B(tài)寄存器時,該位為 1。
注意:此時芯片進(jìn)入“閉關(guān)模式”,除了讀取狀態(tài)和暫停指令外,會忽略其他所有指令。
實戰(zhàn)意義:在48MHz 系統(tǒng)中,如果兩次寫入操作之間不檢查 BUSY 位,由于 CPU 跑得比 Flash 寫入快得多,會導(dǎo)致數(shù)據(jù)丟失。
WEL (S1 - 只讀):
功能:寫使能鎖存位。執(zhí)行完 06h 指令后變?yōu)?1。
復(fù)位邏輯:在掉電、執(zhí)行完寫入/擦除指令后,該位會自動歸 0。
實戰(zhàn)意義:這解釋了為什么你每寫入之前都必須重新發(fā)送一次寫使能指令。
8.2 存儲保護(hù)位:哪些數(shù)據(jù)不準(zhǔn)改?
這就是遇到“讀 ID 正常但寫不進(jìn)數(shù)據(jù)”的根本原因。
BP2, BP1, BP0 (S4, S3, S2):
功能:定義 Flash 陣列中受保護(hù)(只讀)的范圍。默認(rèn)值為 0(不保護(hù))。
TB (S5) & SEC (S6):
TB (Top/Bottom Protect):決定從芯片的“頭”開始鎖,還是從“尾”開始鎖。
TB = 0:從頂部(Upper)地址開始保護(hù)。
TB = 1:從底部(Lower)地址開始保護(hù)。
SEC (Sector/Block Protect):決定鎖定的精度。
SEC = 0:以 64KB 的“塊” 為單位進(jìn)行保護(hù)。
SEC = 1:以 4KB 的“扇區(qū)” 為單位進(jìn)行精細(xì)保護(hù)。
CMP (S14):
當(dāng) CMP = 0 時(默認(rèn)狀態(tài)):你設(shè)置的位代表“哪一小塊被保護(hù)”。
例如:設(shè)置 SEC=1, TB=1, BP=001,則只有地址 000000h – 000FFFh 這 4KB 區(qū)域被鎖死,其余地方都能寫。
當(dāng) CMP = 1 時:邏輯完全反轉(zhuǎn),你設(shè)置的位代表“哪一小塊不被保護(hù)”。
例如:同樣的配置在 CMP=1 時,除了那 4KB,剩下的 8,188KB 全部變只讀。這非常適合用來鎖定整個數(shù)據(jù)庫,只留出一個小窗口寫當(dāng)前配置。
8.3 系統(tǒng)配置與安全:高級功能
SRP0 & SRP1 (S7, S8):
功能:定義狀態(tài)寄存器本身的保護(hù)方式(軟件、硬件、掉電鎖定或永久鎖定)。
實戰(zhàn)對照表:

SUS (Suspend Status):
功能:暫停指示燈。
狀態(tài)標(biāo)識:這是一個只讀位。
觸發(fā)條件:當(dāng)你發(fā)送 75h (Erase/Program Suspend) 指令后,該位會被硬件自動置為 1。
清除條件:當(dāng)你發(fā)送 7Ah (Resume) 指令,或者芯片掉電重啟后,該位會歸 0。
LB1-LB3 (S11-S13):
功能:安全寄存器鎖定位。這是一次性編程(OTP)的。一旦鎖定,對應(yīng)的安全寄存器將永久變?yōu)橹蛔x。
QE (S9 - Quad Enable):
功能:開啟四線 SPI/QPI 模式的“開關(guān)”。
代價:一旦開啟 QE,芯片上的 WP 和 HOLD 引腳功能會被禁用,轉(zhuǎn)為數(shù)據(jù)線 IO2 和 IO3。
1.SPI 線數(shù)的演變:從“單車道”到“四車道”
標(biāo)準(zhǔn)的 SPI 確實是通過 DI(數(shù)據(jù)入)和 DO(數(shù)據(jù)出)進(jìn)行單位(1-bit)傳輸?shù)模?W25Q64FV 支持多種“提速”模式:
標(biāo)準(zhǔn) SPI (Standard SPI):使用 DI 和 DO。 每次時鐘周期只傳 1 位數(shù)據(jù),就像單車道。
雙線 SPI (Dual SPI):將 DI 和 DO 變成 IO0 和 IO1,兩根線同時傳數(shù)據(jù)。 速度提升 2 到 3 倍。
四線 SPI (Quad SPI):這是最關(guān)鍵的突破。 它把原本用來寫保護(hù)的 WP 和暫停通信的 HOLD 引腳也“征用”了,變成了 IO2 和 IO3。 這樣就有 4 根線同時跑數(shù)據(jù),速度提升 4 到 6 倍。
2.什么是“極速” QPI 模式?
QPI(Quad Peripheral Interface)是 Quad SPI 的“完全體”。
在普通 Quad SPI 模式下,你發(fā)送“指令”(比如讀取數(shù)據(jù))時,仍然得通過 IO0 這一根線慢慢發(fā) 8 個時鐘周期。 但在 QPI 模式 下:
指令也要并傳:連“指令碼”和“地址”都是 4 根線一起發(fā)。
效率翻倍:發(fā)送 1 字節(jié)指令原本要 8 個時鐘,現(xiàn)在只需要 2 個時鐘。
適用場景:非常適合你的網(wǎng)關(guān)在短時間內(nèi)需要從 Flash 讀取大量 500 個從機節(jié)點配置的場景。
3.為什么必須手動設(shè)置 QE 位?
這就是手冊里那個 QE (Quad Enable) 位的核心作用:
引腳功能切換:默認(rèn)情況下,WP 是用來防止誤擦除的,HOLD 是用來暫停 SPI 的。
激活四線:當(dāng)你把 QE 位置 1 時,芯片內(nèi)部邏輯會徹底關(guān)掉寫保護(hù)和暫停功能,把這兩個引腳的控制權(quán)交給數(shù)據(jù)傳輸引擎,變成 IO2 和 IO3。
不可逆風(fēng)險:手冊警告,如果你的電路板上 WP 或 HOLD 是直接接死在 GND 上的,一旦你強行開啟 QE 位,會產(chǎn)生硬件短路沖突!
WARNING:如果你的 WP 或 HOLD 引腳直接接了地(或者沒接),嚴(yán)禁將 QE 位置 1,否則會引發(fā)硬件沖突。



8.4 系統(tǒng)配置與安全:高級功能
PROTECTED BLOCK(S)(受保護(hù)的塊)
它指出了被鎖定的物理塊編號。
物理結(jié)構(gòu):W25Q64 共有 128 個塊(編號從 0 到 127),每個塊的大小固定為 64KB。
含義:表格中的這一項會列出具體哪些塊變成了“只讀”。例如,顯示 124 thru 127 表示第 124、125、126、127 這四個塊被鎖定了。
PROTECTED ADDRESSES(受保護(hù)的地址)
它給出了被鎖定區(qū)域的十六進(jìn)制地址范圍。
尋址空間:W25Q64 的總地址范圍是 000000h 到 7FFFFFh(總計 8MB)。
作用:它能讓你在編寫程序時,直觀地通過地址判斷某個變量存放在這里是否安全。例如,如果地址顯示 7C0000h – 7FFFFFh,那么任何針對這個范圍內(nèi)地址的擦除或?qū)懭胫噶疃紩恍酒雎浴?/p>
PROTECTED DENSITY(受保護(hù)的容量)
它描述了被鎖定區(qū)域的總存儲大小。
單位:通常以 KB 或 MB 為單位。
數(shù)值:它是受保護(hù)塊數(shù)量的累加值。例如,如果保護(hù)了 4 個塊,受保護(hù)容量就是 4 *64KB= 256KB;如果全片保護(hù),則顯示為 8MB 或 ALL。
PROTECTED PORTION (2)(受保護(hù)的部分/比例)
它是一個描述性的標(biāo)簽,用來說明受保護(hù)區(qū)域在整片芯片中的位置和占比。
L (Lower):代表從芯片的底部(低地址,即 0 地址處)開始向上保護(hù)。
U (Upper):代表從芯片的頂部(高地址,即 7FFFFFh 處)開始向下保護(hù)。
比例:例如 Upper 1/32 表示芯片頂部 1/32 的容量被保護(hù)。
| BP2 | BP1 | BP0 | 受保護(hù)塊范圍 (Blocks) | 受保護(hù)地址范圍 (Addresses) | 受保護(hù)容量 | 保護(hù)比例/備注 |
| 0 | 0 | 0 | NONE | NONE | NONE | 無保護(hù)(出廠默認(rèn)) |
| 0 | 0 | 1 | 126 和 127 | 7E0000h – 7FFFFFh | 128 KB | Upper 1/64 |
| 0 | 1 | 0 | 124 到 127 | 7C0000h – 7FFFFFh | 256 KB | Upper 1/32 |
| 0 | 1 | 1 | 120 到 127 | 780000h – 7FFFFFh | 512 KB | Upper 1/16 |
| 1 | 0 | 0 | 112 到 127 | 700000h – 7FFFFFh | 1 MB | Upper 1/8 |
| 1 | 0 | 1 | 96 到 127 | 600000h – 7FFFFFh | 2 MB | Upper 1/4 |
| 1 | 1 | 0 | 64 到 127 | 400000h – 7FFFFFh | 4 MB | Upper 1/2 |
| 1 | 1 | 1 | 0 到 127 | 000000h – 7FFFFFh | 8 MB | ALL(整片鎖死) |
示例1:
例如,如果你想保護(hù)最開始的 $$4text{KB$$ 扇區(qū)(存 500 個從機的配置),你需要設(shè)置:
SEC = 1 (扇區(qū)級保護(hù))
TB = 1 (從底部地址開始)
BP[2:0] = 001
結(jié)果:地址 000000h – 000FFFh 被永久鎖定,除非再次修改狀態(tài)寄存器。
根據(jù) W25Q64FV 手冊的位定義圖,我們要配置的是 Status Register-1。
| 位 (Bit) | 標(biāo)識 | 設(shè)定值 | 功能描述 |
| S7 | SRP0 | 0 | 軟件保護(hù)模式 |
| S6 | SEC | 1 | 開啟扇區(qū)級保護(hù)(讓保護(hù)粒度細(xì)化到 4KB) |
| S5 | TB | 1 | 保護(hù)底部 (Bottom) 區(qū)域(從地址 0 開始向上鎖定) |
| S4 | BP2 | 0 | 塊保護(hù)位 2 |
| S3 | BP1 | 0 | 塊保護(hù)位 1 |
| S2 | BP0 | 1 | 塊保護(hù)位 0(結(jié)合 SEC/TB,鎖定 1 個 4KB 單元) |
| S1 | WEL | 0 | 寫使能位(只讀位,由硬件指令控制) |
| S0 | BUSY | 0 | 忙標(biāo)志位(只讀位) |
當(dāng) SRP0 = 0 (默認(rèn)值):軟件保護(hù)模式。 只要你發(fā)送了 Write Enable (06h) 指令,你就可以通過 SPI 指令隨意修改狀態(tài)寄存器(包括那些保護(hù)位 BP0-BP2)。這時候,引腳 /WP 是不起作用的。
當(dāng) SRP0 = 1:進(jìn)入“準(zhǔn)硬件保護(hù)”狀態(tài)。 此時看 /WP 引腳的電平:
如果 /WP 為高電平:依然是軟件保護(hù),可以改。
如果 /WP 為低電平:硬件鎖定模式。狀態(tài)寄存器被“焊死”了,任何 SPI 指令都改不了它。
SRP0 就像是保險柜的“電子鎖使能”。SRP0=0 時,你有密碼就能開;SRP0=1 且 /WP 拉低時,相當(dāng)于不僅要密碼,還得插一把實體鑰匙才能開。
TB = 1 (從底部 Bottom 開始保護(hù))
保護(hù)范圍: 從地址 000000h 開始向上覆蓋。
適用場景: 你要把 500 個從機的配置存放在最開始的 4KB 扇區(qū)。
優(yōu)勢: 大多數(shù)單片機的 Bootloader 或核心配置參數(shù)習(xí)慣放在地址 0 附近。如果你把這部分鎖死,程序最核心的“根”就安全了。
TB = 0 (從頂部 Top 開始保護(hù))
保護(hù)范圍: 從芯片最高地址(比如 8MB 芯片的 7FFFFFh)向下覆蓋。
適用場景: 如果你把 Flash 的末尾用來存字庫、固件包或者不經(jīng)常變動的大型靜態(tài)資源。
二進(jìn)制組合:0110 0100十六進(jìn)制轉(zhuǎn)換:0x64

/**
* @brief 鎖定 Flash 底部第一個 4KB 扇區(qū) (0x000000 - 0x000FFF)
* @note 用于保護(hù) 500 個從機配置不被誤操作擦除
*/
void FLASH_Lock_Config_Sector(void)
{
// 1. 發(fā)送寫使能指令 (06h)
// 修改狀態(tài)寄存器前必須先開啟寫使能鎖存器 (WEL)
SPI_FLASH_WriteEnable();
// 2. 寫入狀態(tài)寄存器 1 (01h)
// 寫入計算值 0x64,對應(yīng)手冊表 7.1.11 中的 4KB Lower 1/2048 保護(hù)
SPI_FLASH_WriteStatusReg1(0x64);
// 3. 等待內(nèi)部寫入周期完成
// 寫入非易失性寄存器需要一定的硬件處理時間 (tW)
SPI_FLASH_WaitForWriteEnd();
printf("rn[系統(tǒng)] 500節(jié)點配置區(qū) (0x0000) 已永久鎖定!rn");
}
/**
* @brief 解除全片鎖定 (在需要批量更新從機名單時調(diào)用)
*/
void FLASH_Unlock_All(void)
{
SPI_FLASH_WriteEnable();
// 將 BP0-BP2, SEC, TB 全部清零
SPI_FLASH_WriteStatusReg1(0x00);
SPI_FLASH_WaitForWriteEnd();
printf("rn[提醒] Flash 已進(jìn)入全區(qū)讀寫模式。rn");
}
示例2:
列舉一個在網(wǎng)關(guān)開發(fā)中非常實用的場景:鎖定最后 256KB 的區(qū)域用于存放“固件備份”或“OTA 升級包”。
在 多節(jié)點的網(wǎng)關(guān)中,如果遠(yuǎn)程升級失敗,則必須確保 Flash 中存有一份絕對安全的“出廠固件”。
根據(jù)7.1.11 映射表,我們要實現(xiàn)的是保護(hù)芯片最高地址處的 4 個塊。
SEC = 0:使用 64KB 塊級保護(hù)。
TB = 0:從 頂部 (Upper) 開始向下鎖定。
BP2=0, BP1=1, BP0=0:對應(yīng) Upper 1/32 比例(即 256KB)。
狀態(tài)寄存器 1 (SR1) 位排列:
SRP0(0) | SEC(0) | TB(0) | BP2(0) | BP1(1) | BP0(0) | WEL(0) | BUSY(0)
二進(jìn)制:0000 1000十六進(jìn)制:0x08
/**
* @brief 配置 Flash 存儲區(qū)的寫保護(hù)范圍
* @param ConfigValue: 寫入狀態(tài)寄存器 1 的十六進(jìn)制值
*/
void W25Q_Set_Protection(uint8_t ConfigValue)
{
// 1. 發(fā)送寫使能指令 (06h)
// 所有的擦除、編程、寫狀態(tài)寄存器操作前必須發(fā)此指令
SPI_FLASH_WriteEnable();
// 2. 寫入狀態(tài)寄存器 1 (01h)
// 此操作會將保護(hù)配置寫入非易失性存儲單元
SPI_FLASH_WriteStatusReg1(ConfigValue);
// 3. 等待寫入完成
// 寫入狀態(tài)寄存器需要硬件處理時間 tW
SPI_FLASH_WaitForWriteEnd();
}
/**
* @brief 實戰(zhàn):保護(hù)水表配置區(qū)與固件備份區(qū)
*/
void Flash_Security_Init(void)
{
// 場景 A:保護(hù)底部 4KB (存 500 個從機 ID)
// 對應(yīng)位:SEC=1, TB=1, BP=001 -> 0x64
W25Q_Set_Protection(0x64);
printf("Config Area (Bottom 4KB) Protected.rn");
// 場景 B:保護(hù)頂部 256KB (存固件鏡像)
// 對應(yīng)位:SEC=0, TB=0, BP=010 -> 0x08
// W25Q_Set_Protection(0x08);
}
注意:
WEL 位自動清零:一旦 WriteStatusReg1 指令完成,芯片會自動把 WEL 位清零。這意味著下一次想修改保護(hù)范圍,必須再次調(diào)用 WriteEnable()。
寫指令被忽略:如果你的 4G 模塊代碼嘗試向受保護(hù)的 0x7C0000 地址寫入數(shù)據(jù),F(xiàn)lash 會正常接收 SPI 信號但不執(zhí)行任何動作。這會導(dǎo)致 Buffercmp 校驗失敗并報錯 Error 1。
寄存器鎖定 (SRP0/1):如果你不小心把 SRP0 或 SRP1 設(shè)置成了硬件保護(hù)模式且 WP 接了地,那么即使在代碼里發(fā)出解鎖指令也無法更改保護(hù)范圍了。
五、W25Q64指令系統(tǒng)與通訊規(guī)約

5.1 身份驗證:Manufacturer and Device ID
在正式讀寫數(shù)據(jù)前,第一步永遠(yuǎn)是“對暗號”。
核心指令:9Fh (JEDEC ID)。
識別碼分析:
Manufacturer ID: EFh (代表 Winbond 華邦)。
Memory Type: 40h (代表 SPI 模式)。
Capacity: 17h (代表 64Mb 容量)。 64Mb 位容量 (Mb) 8 MB字節(jié)容量 (MB)
意義:你在調(diào)試時讀出的 0xEF4017 就是由這三個字節(jié)組成的。如果讀不到這個數(shù),說明 SPI 物理鏈路或時鐘極性(Mode)配置有誤。
5.2 核心指令集 (Standard SPI Instructions)


A23-A16、A15-A8、A7-A0 組合起來就是一個完整的 24 位物理地址。
為什么是 3 個字節(jié)? 2^24 次方等于 16,777,216。這意味著用 3 個字節(jié)的地址,最大可以管理 16MB 的存儲空間。
A23-A16 (Byte 2):地址的高位字節(jié)(最重要的一段門牌號)。
A15-A8 (Byte 3):地址的中間字節(jié)。
A7-A0 (Byte 4):地址的低位字節(jié)。
這就像你寄快遞。Byte 1 是“寄東西”;Byte 2 是“省”;Byte 3 是“市”;Byte 4 是“區(qū)”。只有這四個字節(jié)加在一起,快遞員(Flash 硬件)才知道具體要把東西送到哪。
| 維度 | 理解 | 實際底層邏輯 | 理由 |
| 指令 (Instruction) | 8 位 | 8 位 (1 Byte) | 表中 Byte 1 的固定長度。 |
| 地址 (Address) | 24 位 | 24 位 (3 Bytes) | 對應(yīng) A23-A0,決定了 16MB 的尋址空間。 |
| 數(shù)據(jù)寬度 (Data) | 16 位 | 8 位 (1 Byte) | SPI 物理上是串行的(1位),邏輯上以 8位 為一幀。 |
第一類:光桿司令(只有 Byte 1)
例子:Write Enable (06h)、Write Disable (04h)。
原因:這些是“全局開關(guān)”。比如“準(zhǔn)許寫”,它不需要指定地址,只要說一聲就行。所以 Byte 2 之后全是空的。
第二類:查崗指令(Byte 1 + 寄存器數(shù)據(jù))
例子:Read Status Register-1 (05h)。
后面跟的是 (S7-S0):這代表你發(fā)出 05h 后,F(xiàn)lash 會在接下來的 Byte 2 時間里回傳它的狀態(tài)位。
原因:你想看它的健康報告,不需要地址,直接讀就行。
第三類:精準(zhǔn)打擊(Byte 1 + 3字節(jié)地址)
例子:Sector Erase (20h)、Page Program (02h)。
后面跟的是 A23...A0:
如果你說“擦除”,F(xiàn)lash 會問:“擦哪兒?”
所以你必須在 Byte 2、3、4 告訴它具體的 24 位地址。
Page Program (02h) 后面還有 D7-D0:那是你要寫入的真實數(shù)據(jù)(Data)。
SPI_ReadWriteByte(0x02); // Byte 1: 指令 (動詞:頁編程) SPI_ReadWriteByte((Addr >> 16) & 0xFF); // Byte 2: 地址高 8 位 (A23-A16) SPI_ReadWriteByte((Addr >> 8) & 0xFF); // Byte 3: 地址中 8 位 (A15-A8) SPI_ReadWriteByte(Addr & 0xFF); // Byte 4: 地址低 8 位 (A7-A0)

將 Table 7.2.2 中的指令按功能分類介紹:
控制類:
06h (Write Enable): 寫使能。這是所有擦除和寫入操作的“開門指令”,執(zhí)行后狀態(tài)寄存器的 WEL 位會置 1。
01h (Write Status Register): 寫狀態(tài)寄存器。這就是我們用來實現(xiàn)“底座 4KB 永久鎖定”的關(guān)鍵。
擦除類:
20h (Sector Erase 4KB): 以扇區(qū)為單位擦除。 你的 500 個節(jié)點配置信息通常占用一個或多個扇區(qū)。
讀寫類:
02h (Page Program): 頁編程。一次最多寫入 256 字節(jié)。
03h (Read Data): 普通讀取。
5.3 指令發(fā)送的“字節(jié)流”邏輯
你需要解釋手冊表格中 BYTE 2 到 BYTE 6 的含義,這對寫代碼非常關(guān)鍵:
地址發(fā)送:大多數(shù)指令(如 02h, 03h, 20h)后面都緊跟三個字節(jié)的地址(A23-A16, A15-A8, A7-A0)。
Dummy Byte (啞字節(jié)):像 0Bh (Fast Read) 這種指令,中間需要一個 Dummy 字節(jié)(通常發(fā) 0xFF)給芯片內(nèi)部留出反應(yīng)時間。
數(shù)據(jù)流:指令和地址發(fā)完后,緊接著就是連續(xù)的數(shù)據(jù)字節(jié)流。
注意:
1. “頁卷回”風(fēng)險(Note 3)—— 開發(fā)者最容易掉的坑
內(nèi)容:Page Program 最多支持 256 字節(jié)。如果發(fā)送超過 256 字節(jié),地址會卷回(Wrap)到當(dāng)前頁的開頭并覆蓋之前的數(shù)據(jù)。
技術(shù)影響: 假設(shè)一次性存入 500 個水表的 ID(假設(shè)每個 ID 8 字節(jié),共 4000 字節(jié)),你不能只發(fā)一個 02h 指令。
對策: 你必須編寫一個“自動分頁寫入”函數(shù)。每寫 256 字節(jié),必須重新發(fā)送起始地址并檢測 BUSY 位。
2. 安全寄存器的物理隔離(Note 5)
內(nèi)容: 芯片額外提供了 3 個各 256 字節(jié)的 Security Registers(安全寄存器),它們有獨立的地址空間(001000h、002000h、003000h)。
建議: 建議把網(wǎng)關(guān)的核心出廠配置(如網(wǎng)關(guān)唯一的通信密鑰、4G 模塊的授權(quán)碼)存在這里,而不是主存儲區(qū)。因為這里支持 OTP(一次性編程)鎖定,一旦鎖定,物理上無法改寫,防黑客效果極佳。
3. 雙線/四線模式下的“位分片”(Note 6 - 11, 14)
內(nèi)容: 詳細(xì)描述了在 Dual/Quad/QPI 模式下,地址位和數(shù)據(jù)位是如何分布在 IO0-IO3 上的。
關(guān)鍵點: 在 QPI 模式下(Note 14),指令碼(C7-C0)也是通過 4 根線并傳的。
對策: 如果你發(fā)現(xiàn)切換到 QPI 后讀出的 ID 變了,多半是 SPI 控制器的字節(jié)序或位序配置與 Note 14 的時鐘周期(CLK #0, 1)對不上。
| 分類 | 涉及注釋 | 核心要點 |
| 數(shù)據(jù)傳輸 | Note 1 | 必須 MSB First(最高有效位在前)。 |
| 效率提升 | Note 2 | 讀取狀態(tài)寄存器或 ID 時,CS 不拉高數(shù)據(jù)會一直重復(fù),適合做死循環(huán)查詢(Polling)。 |
| 尋址限制 | Note 12, 13 | 執(zhí)行 Word Read 必須 2 字節(jié)對齊(A0=0);執(zhí)行 Octal Word Read 必須 16 字節(jié)對齊。 |
| 模式控制 | Note 15, 16 | QPI 模式下的“啞時鐘”(Dummy Clocks)數(shù)量和“卷回長度”是可以通過參數(shù) P7-P0 編程修改的。 |
4. 關(guān)于地址對齊(Note 12/13):
在你的水表數(shù)據(jù)結(jié)構(gòu)體設(shè)計時,建議將結(jié)構(gòu)體大小設(shè)置為 16 字節(jié)的倍數(shù)。這樣在調(diào)用高速讀取指令時,地址永遠(yuǎn)是自然對齊的,不會觸發(fā) Note 12/13 的限制。
5. 于頁邊界寫入:
很多開發(fā)者認(rèn)為 02h 指令可以從地址 0 一直寫到地址 8MB,這是錯誤的。受 Note 3 限制,寫入一旦超過頁邊界(256字節(jié)),數(shù)據(jù)會像“貪吃蛇撞墻”一樣回到頁首。在處理 比如500 個節(jié)點的數(shù)據(jù)上報時,務(wù)必在代碼中加入頁邊界判斷邏輯。
5.4 指令時序圖分析

Mode 0 (CPOL=0, CPHA=0)
狀態(tài):時鐘線(CLK)平時休息時是低電平。
動作:CLK 一旦從低變高(第一個邊沿),單片機和 Flash 就立刻抓取數(shù)據(jù)。
特點:反應(yīng)最快,效率極高。
Mode 1 (CPOL=0, CPHA=1)
狀態(tài):時鐘線平時也是低電平。
動作:CLK 從低變高時,大家先“準(zhǔn)備”一下數(shù)據(jù);等到 CLK 從高變低(第二個邊沿)時,才真正抓取數(shù)據(jù)。
特點:給了硬件半個時鐘周期的緩沖時間。
Mode 2 (CPOL=1, CPHA=0)
狀態(tài):時鐘線平時休息時是高電平。
動作:CLK 一旦從高變低(第一個邊沿),立即抓取數(shù)據(jù)。
特點:采樣發(fā)生在下降沿。
Mode 3 (CPOL=1, CPHA=1)
狀態(tài):時鐘線平時也是高電平。
動作:CLK 從高變低時準(zhǔn)備數(shù)據(jù),等 CLK 從低變高(第二個邊沿)時抓取數(shù)據(jù)。
特點:這是 W25Q64 最常用的模式之一。因為它在上升沿采樣,且平時 CLK 為高,抗干擾能力較強。
W25Q64 的時序主要分為以下幾類模板:
單字節(jié)模板:只有指令,沒有地址和數(shù)據(jù)。如 Write Enable (06h)、Reset (99h)。
指令 + 地址模板:先發(fā)指令,再發(fā) 24 位地址。如 Sector Erase (20h)。
指令 + 地址 + 數(shù)據(jù)輸出模板:發(fā)完指令和地址,F(xiàn)lash 開始往外吐數(shù)據(jù)。如 Read Data (03h)。
指令 + 地址 + 啞周期 + 數(shù)據(jù)輸出模板:中間多了一個緩沖。如 Fast Read (0Bh)。
Write Enable (06h) 指令

左圖分析:標(biāo)準(zhǔn) SPI 模式 (Standard SPI)
第一步:拉低片選 (CS)
圖中看到 CS從高電平跳變到低電平(下降沿),這代表單片機告訴 Flash:“準(zhǔn)備好,我要下令了”。
第二步:確認(rèn)時鐘 (CLK) 模式
注意圖中虛線標(biāo)出的 Mode 3 和 Mode 0。無論空閑時是高還是低,數(shù)據(jù)都是在 CLK 的上升沿被 Flash 采樣的。
第三步:發(fā)送指令 (DI IO_0)
在 8 個時鐘脈沖內(nèi),單片機在 DI 線上依次送出二進(jìn)制位。
指令是 06h,換算成二進(jìn)制是 0000 0110。
你看圖中 DI 線的波形:前 5 位是低電平,第 6、7 位跳高,最后一位變低。這就是典型的串行發(fā)送。
第四步:忽視輸出 (DO / IO_1)
你會發(fā)現(xiàn) DO 線上寫著 High Impedance(高阻態(tài))。因為這是“寫使能”指令,F(xiàn)lash 只需要聽,不需要回答,所以它的輸出引腳處于斷開狀態(tài)。
右圖分析:極速 QPI 模式
這就是你之前好奇的“四線模式”。
核心區(qū)別:帶寬翻了 4 倍
在左圖中,發(fā)一個 06h 需要 8 個時鐘周期。
在右圖中,單片機同時利用 IO_0, IO_1, IO_2, IO_3 四根線發(fā)數(shù)據(jù)。
指令 06h (0000 0110) 被拆分了:第一個時鐘周期傳前 4 位,第二個周期傳后 4 位。
結(jié)果:只需 2 個時鐘周期 就發(fā)完了。對于 500 個節(jié)點頻繁寫入的場景,這種模式能顯著降低 CPU 占用。
Read Status Registere (50h) 指令 讀取狀態(tài)寄存器

左圖分析:標(biāo)準(zhǔn) SPI 模式 (Standard SPI)
第一步:拉低片選 (CS)
圖中看到 CS 從高電平跳變到低電平(下降沿),這代表單片機告訴 Flash:“準(zhǔn)備好,我要下達(dá)一條臨時配置 使能指令了”。
第二步:確認(rèn)時鐘 (CLK) 模式
依然兼容 Mode 0 和 Mode 3。數(shù)據(jù)在 CLK 的上升沿被 Flash 穩(wěn)定采樣,這保證了在高頻通訊下的指令準(zhǔn)確性。
第三步:發(fā)送指令 (DI / IO_0)
在 8 個時鐘脈沖內(nèi),單片機在 DI 線上依次送出二進(jìn)制位。 指令是 50h,換算成二進(jìn)制是 0101 0000。 觀察圖中 DI 線的波形:第 1 位低,第 2 位高,第 3 位低,第 4 位高,隨后連續(xù) 4 位保持低電平。這種“跳變”波形就是 50h 指令的唯一特征。
第四步:忽視輸出 (DO / IO_1)
DO 線上顯示為 High Impedance(高阻態(tài))。因為 50h 只是一個聲明類的“使能”動作,F(xiàn)lash 此時只需要聽指令,不會返回任何數(shù)據(jù)。
右圖分析:極速 QPI 模式
這就是為了在追求極致效率的場景下設(shè)計的“并行模式”。
核心區(qū)別:位寬翻了 4 倍
在左圖中,串行發(fā)送一個 50h 指令需要 8 個時鐘周期。 在右圖中,單片機利用 IO_0 到 IO_3 四根數(shù)據(jù)線同時發(fā)力。 指令 50h (0101 0000) 被拆分成了兩個部分:第一個時鐘周期并行傳輸高 4 位 (0101),第二個周期并行傳輸?shù)?4 位 (0000)。
結(jié)果:只需 2 個時鐘周期
指令傳輸耗時縮短到了原來的 1/4。在多任務(wù)高并發(fā)的環(huán)境下,這種節(jié)省能有效降低總線占有率,讓 CPU 有更多時間處理其它業(yè)務(wù)邏輯。
50h 不會置位 WEL 位。它僅僅是為了緊隨其后的 Write Status Register (01h) 指令服務(wù),使其修改后的寄存器值在斷電后自動消失(易失性)。這在需要動態(tài)調(diào)整內(nèi)存保護(hù)范圍、但又不希望頻繁擦寫硬件寄存器的應(yīng)用中非常有用。
Write Status Register (01h) 指令 寫狀態(tài)寄存器


上圖分析:標(biāo)準(zhǔn) SPI 模式 (Standard SPI)
第一步:拉低片選 (/CS) 圖中看到 /CS 從高電平跳變到低電平(下降沿),開啟通訊。注意:在執(zhí)行此圖操作前,你必須已經(jīng)先發(fā)送過 06h(寫使能)指令,否則這一整張圖的操作都會被 Flash 忽略。
第二步:確認(rèn)時鐘 (CLK) 模式 支持 Mode 0 和 Mode 3。數(shù)據(jù)在 CLK 的上升沿 被采樣。對于寫寄存器這種關(guān)鍵操作,時序的穩(wěn)定性直接決定了你的 500 個水表節(jié)點名單是否會被“鎖死”。
第三步:發(fā)送指令 (DI / IO0) 在第 0 到 7 個時鐘脈沖內(nèi),單片機送出二進(jìn)制位 0000 0001 (01h)。這是告訴 Flash:“我要改寫你的狀態(tài)寄存器了”。
第四步:順序?qū)懭爰拇嫫鲾?shù)據(jù)
Status Register 1 in:在第 8 到 15 個脈沖,單片機送入 8 位數(shù)據(jù)(S7-S0)。這是你設(shè)置 BP、SEC、TB 位的地方。
Status Register 2 in:在第 16 到 23 個脈沖,緊接著送入第二個 8 位數(shù)據(jù)(S15-S8)。這是設(shè)置 QE(四線使能)或 CMP 位的地方。
關(guān)鍵細(xì)節(jié):圖中星號(*)標(biāo)注了 MSB(最高位)在前。
第五步:忽視輸出 (DO / IO1) DO 線上依然是 High Impedance(高阻態(tài))。因為此時是單片機向 Flash “下達(dá)命令”,F(xiàn)lash 只負(fù)責(zé)記錄,不回話。
下圖分析:極速 QPI 模式
核心區(qū)別:極高的寫入效率 在 SPI 模式下,改寫兩個寄存器總共需要 24 個時鐘周期(8 指令 + 8 SR1 + 8 SR2)。 而在 QPI 模式下:
發(fā)送指令 (01h):僅需 2 個時鐘(IO0-IO3 同時傳位)。
寫入 SR1:僅需 2 個時鐘。
寫入 SR2:僅需 2 個時鐘。
結(jié)果:總共只需要 6 個時鐘周期 就能完成配置。這對于在 FreeRTOS 任務(wù)中需要快速切換保護(hù)狀態(tài)的操作來說,極大地減少了 CPU 的阻塞時間。
MSB(Most Significant Bit) 就是最高有效位。
LSB (Least Significant Bit) 翻譯過來叫 最低有效位。
舉例說明:發(fā)送數(shù)字 0x41 (二進(jìn)制 0100 0001)
假設(shè)我們要把這個數(shù)據(jù)從單片機發(fā)給外設(shè):
情況 A:MSB First (SPI 模式)
電線上出現(xiàn)的順序是:0 -> 1 -> 0 -> 0 -> 0 -> 0 -> 0 -> 1
結(jié)果:對方收到后按原樣拼好,還是 0x41。
情況 B:LSB First (某些傳感器或串口)
電線上出現(xiàn)的順序是:1 -> 0 -> 0 -> 0 -> 0 -> 0 -> 1 -> 0
結(jié)果:如果你用 MSB 的邏輯去讀,讀出來的數(shù)就變成了 1000 0010 (即 0x82)。數(shù)據(jù)徹底錯了!
進(jìn)階概念:大端與小端 (Endianness)
這是教小白時最容易混淆的。MSB/LSB 關(guān)注的是一個字節(jié)內(nèi)部的位順序,而大端/小端關(guān)注的是多個字節(jié)組合時的順序。
大端模式 (Big-Endian):高位字節(jié)存在低地址。
小端模式 (Little-Endian):低位字節(jié)存在低地址(STM32/CW32 內(nèi)部通常用這個)。
Page Program (02h) 指令 頁編程


上圖分析:標(biāo)準(zhǔn) SPI 模式 (Standard SPI)
第一步:拉低片選 (CS) 圖中看到 CS 從高電平跳變到低電平(下降沿),開啟一次寫入會話。 注意:在執(zhí)行此操作前,必須先發(fā)送過 06h (寫使能),否則寫入無效。
第二步:確認(rèn)時鐘 (CLK) 模式 支持 Mode 0 和 Mode 3。數(shù)據(jù)在 CLK 的上升沿 被采樣。對于大數(shù)據(jù)量(256 字節(jié))寫入,穩(wěn)定的時鐘邊沿是防止數(shù)據(jù)位偏移的關(guān)鍵。
第三步:發(fā)送指令與地址 (DI / IO0)
在第 0 到 7 個時鐘脈沖內(nèi),單片機送出二進(jìn)制位 0000 0010 (02h)。
緊接著發(fā)送 24 位地址 (A23-A0)。這決定了數(shù)據(jù)從哪個位置開始存。
第四步:順序?qū)懭霐?shù)據(jù)流 (Data Byte 1 to 256)
地址發(fā)完后,緊接著送入數(shù)據(jù)字節(jié)。
Data Byte 1:在第 32 到 39 個脈沖送入。
持續(xù)寫入:只要不拉高 CS,可以一直往后發(fā)數(shù)據(jù),最高支持 256 字節(jié)。
圖中星號(*)再次強調(diào)了 MSB(最高位)在前。
第五步:忽視輸出 (DO / IO1) DO 線全程處于 High Impedance(高阻態(tài)),因為寫入過程中 Flash 只需要接收信息。
下圖分析:極速 QPI 模式
核心區(qū)別:吞吐量質(zhì)的飛躍 在 SPI 模式下,寫滿一頁(256 字節(jié))需要發(fā)送大量的時鐘脈沖;而在 QPI 模式下:
發(fā)送指令 (02h):僅需 2 個時鐘。
發(fā)送地址:僅需 6 個時鐘。
發(fā)送數(shù)據(jù):每個字節(jié)僅需 2 個時鐘。
結(jié)果:數(shù)據(jù)傳輸速度提升了 4 倍。對于 500 個節(jié)點并發(fā)產(chǎn)生的大量數(shù)據(jù),QPI 模式能極大縮短總線占用時間。
Sector Erase (20h)指令 扇區(qū)擦除


左圖分析:標(biāo)準(zhǔn) SPI 模式 (Standard SPI)
第一步:拉低片選 (/CS) 圖中看到 /CS 從高電平跳變到低電平(下降沿),開啟擦除會話。注意:執(zhí)行此操作前,必須先發(fā)送過 06h (寫使能),確保狀態(tài)寄存器的 WEL 位為 1。
第二步:確認(rèn)時鐘 (CLK) 模式 支持 Mode 0 和 Mode 3。數(shù)據(jù)在 CLK 的上升沿 被采樣。對于擦除地址的傳輸,時序的精準(zhǔn)決定了你是否會“誤抹除”其它重要數(shù)據(jù)。
第三步:發(fā)送指令 (DI / IO0) 在第 0 到 7 個時鐘脈沖內(nèi),單片機送出二進(jìn)制位 0010 0000 (20h)。這是告訴 Flash:“我要擦除一個 4KB 的扇區(qū)”。
第四步:發(fā)送 24 位地址 (DI / IO0) 在第 8 到 31 個脈沖,單片機送出目標(biāo)扇區(qū)的起始地址(A23-A0)。圖中星號(*)標(biāo)注了 MSB(最高位)在前。Flash 會根據(jù)這個地址鎖定對應(yīng)的 4KB 空間。
第五步:忽視輸出 (DO / IO1) DO 線全程處于 High Impedance(高阻態(tài))。擦除指令是單向命令,F(xiàn)lash 在此階段不返回數(shù)據(jù)。
右圖分析:極速 QPI 模式
核心區(qū)別:指令與地址傳輸極速化 在 SPI 模式下,發(fā)送“指令+地址”需要 32 個時鐘周期。而在 QPI 模式下:
發(fā)送指令 (20h):僅需 2 個時鐘(IO0-IO3 并行)。
發(fā)送地址:僅需 6 個時鐘。
結(jié)果:總共只需 8 個時鐘 即可啟動擦除任務(wù)。這在 500 節(jié)點高并發(fā)、任務(wù)切換頻繁的 FreeRTOS 環(huán)境下,能顯著降低總線占用率。
Fast Read (0Bh) 指令


左圖分析:標(biāo)準(zhǔn) SPI 模式 (Standard SPI)
第一步:拉低片選 (/CS) 圖中看到 CS 從高電平跳變到低電平(下降沿),開啟讀取會話。與寫入指令不同,讀取指令不需要先發(fā)“寫使能”。
第二步:確認(rèn)時鐘 (CLK) 模式 支持 Mode 0 和 Mode 3。數(shù)據(jù)在 CLK 的上升沿 被采樣。
第三步:發(fā)送指令與地址 (DI / IO0)
指令:單片機送出 0Bh。
地址:緊接著送出 24 位地址。到這里為止,它和普通讀?。?3h)長得一模一樣。
第四步:引入“啞時鐘” (8 Dummy Clocks) 這是最關(guān)鍵的區(qū)別!在地址發(fā)完后的第 32 到 39 個時鐘周期,DI 線上發(fā)什么都無所謂(Don't care)。
意義:這 8 個節(jié)拍是給 Flash 內(nèi)部電路留出的“取貨時間”。
第五步:數(shù)據(jù)輸出 (DO / IO1) 從第 40 個時鐘開始,F(xiàn)lash 準(zhǔn)時在 DO 線上吐出第一個字節(jié)。只要你不拉高 CS,它會一直按順序吐出 500 個節(jié)點的所有數(shù)據(jù)。
右圖分析:極速 QPI 模式
核心區(qū)別:帶寬與靈活度
極速傳輸:指令僅需 2 個時鐘,地址僅需 6 個時鐘。
可調(diào)啞時鐘:QPI 模式下,你可以通過 C0h 指令設(shè)置啞時鐘的數(shù)量(2, 4, 6 或 8 個)。
IO 切換:在 Dummy 階段結(jié)束后,IO0-IO3 會立即從輸入模式切換為輸出模式,四線同時“開火”吐數(shù)據(jù)。
資料鏈接:
https://telesky.yuque.com/bdys8w/01/zr02y6vd0r7mnzcl?singleDoc# 《W25Qxx存儲模塊》
審核編輯 黃宇
-
無線抄表
+關(guān)注
關(guān)注
0文章
41瀏覽量
17437 -
CW32
+關(guān)注
關(guān)注
1文章
326瀏覽量
1971
發(fā)布評論請先 登錄
【項目展示】基于CW32的遙控循跡小車
【CW32無線抄表項目】W25Q+CW32程序示例
cw32和stm32的區(qū)別
cw32和gd32的區(qū)別
應(yīng)用筆記-CW32 自舉程序中使用的 ISP 協(xié)議
CW32單片機在智能馬桶的應(yīng)用介紹
【CW32無線抄表項目】示例通信程序講解
【CW32無線抄表項目】W25Q_CW32_DMA簡介
【CW32無線抄表項目】外置FlashW25QFV介紹
評論