日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【CW32無線抄表項目】外置FlashW25QFV介紹

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2026-03-31 21:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、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 0Mode 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ù)引腳:若模塊上有 WPHOLD,必須接 3.3V,否則無法擦寫。

三、硬內(nèi)部閃存結(jié)構(gòu)

1.W25Q64FV 串行閃存(Serial Flash)的內(nèi)部架構(gòu)框圖(Block Diagram

wKgZPGnLyXKACVLbAAFhuyC0KUQ602.jpg

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é)議邏輯

wKgZO2nLyXKAW4RjAAAygAOnmEE110.jpg

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 0Mode 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)對照表

wKgZPGnLyXOADNi0AADa5m_yzzo165.jpg

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):使用 DIDO。 每次時鐘周期只傳 1 位數(shù)據(jù),就像單車道。

雙線 SPI (Dual SPI):將 DI 和 DO 變成 IO0IO1,兩根線同時傳數(shù)據(jù)。 速度提升 2 到 3 倍。

四線 SPI (Quad SPI):這是最關(guān)鍵的突破。 它把原本用來寫保護(hù)的 WP 和暫停通信的 HOLD 引腳也“征用”了,變成了 IO2IO3。 這樣就有 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ā)硬件沖突。

chaijie_default.pngwKgZO2nLyXSAYKHhAAHpJGOJ9OQ098.jpgchaijie_default.png

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ū)域的總存儲大小。

單位:通常以 KBMB 為單位。

數(shù)值:它是受保護(hù)塊數(shù)量的累加值。例如,如果保護(hù)了 4 個塊,受保護(hù)容量就是 4 *64KB= 256KB;如果全片保護(hù),則顯示為 8MBALL

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

wKgZPGnLyXSAI7oYAAA0qGhYLTc695.jpg

/**
 * @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ī)約

chaijie_default.png

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)

chaijie_default.pngchaijie_default.png

A23-A16A15-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)
chaijie_default.png

將 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 指令時序圖分析

wKgZO2nLyXeAUt7HAAFXhiZR-AE381.jpg

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) 指令

wKgZPGnLyXiABdTkAACYtCXqMZo766.jpg

左圖分析:標(biāo)準(zhǔn) SPI 模式 (Standard SPI)

第一步:拉低片選 (CS)

圖中看到 CS從高電平跳變到低電平(下降沿),這代表單片機告訴 Flash:“準(zhǔn)備好,我要下令了”。

第二步:確認(rèn)時鐘 (CLK) 模式

注意圖中虛線標(biāo)出的 Mode 3Mode 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)寄存器

wKgZO2nLyXiAZiYDAADPbMws7Ho651.jpg

左圖分析:標(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)寄存器

wKgZPGnLyXmAWiiSAAA2LuCEpJw625.jpgchaijie_default.png

上圖分析:標(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) 指令 頁編程

wKgZO2nLyXqAFwugAABgFg3BAFQ741.jpgwKgZPGnLyXuAIYllAAB-iCiyhUc253.jpg

上圖分析:標(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ū)擦除

wKgZO2nLyXyAbrDTAAAt_gFYB40421.jpgwKgZPGnLyXyAPhwkAAA-yLJfEiY800.jpg

左圖分析:標(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) 指令

wKgZO2nLyXyAKq41AABFoOT0r5Q147.jpgwKgZPGnLyXyAUW69AABscOx3ld8262.jpg

左圖分析:標(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存儲模塊》

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 無線抄表
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    17437
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    326

    瀏覽量

    1971
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    CW32無線表項目】主控及射頻芯片介紹

    對于開發(fā)者而言,CW32F030 的硬件設(shè)計在同類 M0+ 芯片中具有極強的競爭力。
    的頭像 發(fā)表于 04-01 17:06 ?4818次閱讀
    【<b class='flag-5'>CW32</b><b class='flag-5'>無線</b><b class='flag-5'>抄</b><b class='flag-5'>表項目</b>】主控及射頻芯片<b class='flag-5'>介紹</b>

    CW32移植Free-RTOS】CW32開發(fā)者扶持計劃

    CW32配置Free-RTOS全過程,CW32開發(fā)者扶持計劃
    的頭像 發(fā)表于 04-18 09:38 ?7581次閱讀
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>開發(fā)者扶持計劃

    CW32快速開發(fā)入門

    CW32快速開發(fā)入門
    的頭像 發(fā)表于 04-24 18:56 ?3833次閱讀
    <b class='flag-5'>CW32</b>快速開發(fā)入門

    項目展示】基于CW32的遙控循跡小車

    CW32循跡小車.zip_免費高速下載|百度網(wǎng)盤-分享無限制? 一、概述 CW32循跡、遙控小車具有循跡和遙控兩種功能,小車的硬件模塊由CW32F030C8T6小藍(lán)板、智能小車控制底板、BT04-E
    的頭像 發(fā)表于 05-31 17:33 ?2666次閱讀
    【<b class='flag-5'>項目</b>展示】基于<b class='flag-5'>CW32</b>的遙控循跡小車

    CW32無線表項目】W25Q+CW32程序示例

    /Armink/SFUD 一、程序分析 硬件總線映射(引腳與時鐘的“避坑點”) ? #define FLASH_SPIx CW_SPI2// 注意:CW32 中 SPI1 在 APB2 總線,而 SPI2 通常
    的頭像 發(fā)表于 03-31 21:29 ?4992次閱讀
    【<b class='flag-5'>CW32</b><b class='flag-5'>無線</b><b class='flag-5'>抄</b><b class='flag-5'>表項目</b>】W<b class='flag-5'>25Q+CW</b>32程序示例

    cw32和stm32的區(qū)別

    cw32和stm32的區(qū)別 CW32和STM32是兩種常見的單片機,被廣泛應(yīng)用于各種電子設(shè)備中。在本文中,我們將深入探討CW32和STM32之間的區(qū)別和優(yōu)劣勢。 1. 硬件性能 硬件性能是衡量單片機
    的頭像 發(fā)表于 08-16 11:15 ?6591次閱讀

    cw32和gd32的區(qū)別

    cw32和gd32的區(qū)別 CW32和GD32是兩種不同的芯片系列,分別由WCH和GigaDevice公司推出,兩者有很多不同之處,下面我們來詳細(xì)介紹。 首先從CW32系列開始,
    的頭像 發(fā)表于 08-16 11:15 ?3432次閱讀

    CW32的SPI單工模式主從通信介紹

    CW32的SPI單工模式主從通信介紹
    的頭像 發(fā)表于 10-24 15:50 ?2153次閱讀
    <b class='flag-5'>CW32</b>的SPI單工模式主從通信<b class='flag-5'>介紹</b>

    CW32 PWM輸出功能介紹

    CW32 PWM輸出功能介紹
    的頭像 發(fā)表于 09-27 16:12 ?2400次閱讀
    <b class='flag-5'>CW32</b> PWM輸出功能<b class='flag-5'>介紹</b>

    CW32實時時鐘(RTC)介紹

    CW32實時時鐘(RTC)介紹
    的頭像 發(fā)表于 10-24 15:36 ?2439次閱讀
    <b class='flag-5'>CW32</b>實時時鐘(RTC)<b class='flag-5'>介紹</b>

    應(yīng)用筆記-CW32 自舉程序中使用的 ISP 協(xié)議

    ,通過UART串口方便地實現(xiàn)對CW32微控制器片上FLASH主存儲器的擦除和燒寫。本應(yīng)用筆記將介紹如何進(jìn)入CW32微控制器ISP模式,以及所使用的ISP協(xié)議,并詳細(xì)介紹支持的每個命令。
    發(fā)表于 06-06 13:37 ?7次下載

    基于CW32的物聯(lián)網(wǎng)應(yīng)用

    CW32】基于CW32的物聯(lián)網(wǎng)應(yīng)用
    的頭像 發(fā)表于 11-02 15:55 ?2145次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應(yīng)用

    CW32單片機在智能馬桶的應(yīng)用介紹

    和調(diào)節(jié)。本文將介紹CW32單片機在智能馬桶的詳細(xì)應(yīng)用。圖:CW32的智能馬桶控制板CW32單片機在智能馬桶的應(yīng)用介紹1.溫度感應(yīng)與控制智能馬
    的頭像 發(fā)表于 12-20 10:09 ?1640次閱讀
    <b class='flag-5'>CW32</b>單片機在智能馬桶的應(yīng)用<b class='flag-5'>介紹</b>

    CW32無線表項目】示例通信程序講解

    一、整體功能概述 這套程序模擬了一個真實的無線傳感器網(wǎng)絡(luò)(如表系統(tǒng))的通信流程: 主機(Master / 采集端): 負(fù)責(zé)發(fā)起通信。它首先發(fā)送“暗號”( kunkun )尋找從機,收到從機的確
    的頭像 發(fā)表于 03-31 21:16 ?520次閱讀

    CW32無線表項目】W25Q_CW32_DMA簡介

    ‘專業(yè)的搬運工’。 你只要告訴它:‘從哪搬(源)、搬到哪(目的)、搬多少(數(shù)量)’,然后 CPU 就可以去喝咖啡了,搬運工作全交給 DMA 硬件電路自動完成。等搬完了,它會敲敲門告訴 CPU:‘老板,活干完了?。ㄖ袛啵?。 階段一:CW32F030—DMA框圖 一共三件事:
    的頭像 發(fā)表于 03-31 21:41 ?846次閱讀
    【<b class='flag-5'>CW32</b><b class='flag-5'>無線</b><b class='flag-5'>抄</b><b class='flag-5'>表項目</b>】W<b class='flag-5'>25Q_CW</b>32_DMA簡介
    崇文区| 宜宾市| 巴东县| 桂平市| 灵宝市| 莒南县| 东兴市| 北海市| 兴安盟| 巫山县| 三河市| 达尔| 濮阳市| 萝北县| 疏勒县| 阜新市| 十堰市| 泰州市| 东城区| 肇州县| 丹寨县| 新源县| 杭锦旗| 祥云县| 会理县| 若尔盖县| 孟村| 体育| 吴忠市| 宁德市| 新沂市| 凌海市| 太谷县| 固原市| 稻城县| 高邮市| 泾阳县| 商都县| 新乡县| 云霄县| 通州区|