掉電保護(hù)方案)
1. 為什么 MR25H40CDF 值得在 STM32L162ZE 項(xiàng)目里認(rèn)真考慮第一次在工業(yè)采集板上看到 MR25H40CDF 這顆料我的反應(yīng)是這不就是個(gè) SPI Flash 嗎。直到產(chǎn)線反饋某批設(shè)備在斷電瞬間丟參數(shù)返修拆下來的 W25Q 系列 Flash 里數(shù)據(jù)塊整片變成 0xFF我才回頭認(rèn)真研究 MRAM 這條路線。MR25H40CDF 是 Everspin 的 4Mbit 磁阻隨機(jī)存儲(chǔ)器SPI 接口512K×8 位組織和常見的 SPI NOR Flash 引腳基本兼容但內(nèi)部存儲(chǔ)機(jī)理完全不同——它靠磁隧道結(jié)的磁化方向存數(shù)據(jù)不需要電荷保持也就沒有 Flash 那種寫之前先擦一整塊的麻煩。這個(gè)差異在工業(yè)場(chǎng)景里是決定性的。傳統(tǒng) SPI Flash 寫一個(gè)字節(jié)實(shí)際流程是讀出整頁到 RAM、改一個(gè)字節(jié)、擦除整頁幾十毫秒、再寫回整頁。如果在這幾十毫秒的擦除窗口里斷電整頁數(shù)據(jù)就沒了。MR25H40CDF 的寫操作是直接覆蓋沒有擦除階段單字節(jié)寫入時(shí)間在納秒到微秒量級(jí)斷電窗口極小。對(duì)于電表、PLC 模塊、工業(yè)傳感器節(jié)點(diǎn)這類隨時(shí)可能掉電、參數(shù)必須保住的設(shè)備這個(gè)特性比容量和價(jià)格重要得多。STM32L162ZE 是 ST 的 Cortex-M3 低功耗系列144 引腳1MB Flash、80KB RAM帶 LCD 控制器、AES 硬件加密、12 位 ADC工作電壓 1.65V~3.6V。它和 MR25H40CDF 搭在一起典型的應(yīng)用畫像就是低功耗工業(yè)終端需要頻繁記錄運(yùn)行參數(shù)、校準(zhǔn)系數(shù)、事件日志且供電環(huán)境惡劣比如 24V 工業(yè)總線取電掉電無預(yù)警。這套組合我在兩個(gè)項(xiàng)目里用過一個(gè)是智能電表的參數(shù)存儲(chǔ)一個(gè)是井下環(huán)境監(jiān)測(cè)節(jié)點(diǎn)的黑匣子記錄下面把踩過的坑和跑通的方案完整拆開講。注意MR25H40CDF 的供電范圍是 2.7V~3.6VSTM32L162ZE 可以低到 1.65V如果系統(tǒng)跑在 1.8V 域兩者不能直接共電源必須做電平隔離或獨(dú)立 3.3V 域。這一點(diǎn)在選型階段極容易忽略。2. MR25H40CDF 與普通 SPI Flash 的底層差異到底在哪2.1 存儲(chǔ)機(jī)理決定了寫操作的時(shí)間窗口Flash 的浮柵晶體管靠隧穿效應(yīng)注入電荷擦除時(shí)要把整塊電荷抽走這個(gè)物理過程需要高壓泵和固定時(shí)長(zhǎng)典型扇區(qū)擦除 40~400ms。MRAM 的磁隧道結(jié)靠自由層磁化方向相對(duì)固定層的平行/反平行來表征 0/1寫入靠自旋轉(zhuǎn)移矩翻轉(zhuǎn)磁化方向是純電子自旋過程沒有電荷積累所以寫入時(shí)間在 35ns 量級(jí)芯片內(nèi)部通過 SPI 接口暴露出來的總線時(shí)間才是瓶頸。這意味著什么假設(shè)你用 10MHz SPI 時(shí)鐘寫一個(gè)字節(jié)加上命令和地址開銷大約 4 個(gè)字節(jié)傳輸時(shí)間約 3.2μs。Flash 寫同樣一個(gè)字節(jié)如果目標(biāo)頁是干凈的已擦除可以只發(fā)頁寫命令約 3.2μs 加 0.7ms 內(nèi)部編程時(shí)間如果目標(biāo)頁有數(shù)據(jù)必須先擦除那就是 3.2μs 加 40ms 以上。MRAM 無論目標(biāo)位置原來是什么內(nèi)容都是 3.2μs 直接覆蓋。在每秒記錄一次、隨時(shí)可能斷電的場(chǎng)景里這個(gè)差距就是數(shù)據(jù)保不保得住的差距。2.2 耐久度與數(shù)據(jù)保持的取舍邏輯普通 SPI Flash 的擦寫壽命典型 10 萬次數(shù)據(jù)保持 20 年但高溫下會(huì)急劇衰減85℃ 時(shí)可能只有幾年。MR25H40CDF 的寫入耐久度標(biāo)稱 10^14 次以上數(shù)據(jù)保持 20 年以上且對(duì)溫度不敏感。這個(gè)耐久度意味著你可以把它當(dāng) RAM 一樣頻繁寫不需要做磨損均衡不需要預(yù)留備用扇區(qū)軟件架構(gòu)可以大幅簡(jiǎn)化。但 MRAM 不是沒有代價(jià)。第一是容量小4Mbit 只有 512KB存日志要精打細(xì)算第二是價(jià)格同容量下比 SPI NOR Flash 貴一個(gè)數(shù)量級(jí)第三是寫入電流比 Flash 高對(duì)低功耗待機(jī)場(chǎng)景要算平均功耗。所以我的選型原則是參數(shù)區(qū)、校準(zhǔn)區(qū)、掉電關(guān)鍵日志用 MRAM大塊固件、歷史歸檔、音頻圖像用普通 Flash 或 SD 卡。兩者不是替代關(guān)系是分工關(guān)系。2.3 SPI 模式與命令集的兼容性細(xì)節(jié)MR25H40CDF 支持 SPI 模式 0 和模式 3命令集和標(biāo)準(zhǔn) 25 系列 Flash 高度相似0x03 讀、0x02 寫、0x05 讀狀態(tài)、0x06 寫使能、0x04 寫禁止。但它沒有擦除命令不需要也沒有扇區(qū)擦除、塊擦除這些指令。如果你從 W25Q 系列遷移過來代碼里所有擦除相關(guān)的調(diào)用要?jiǎng)h掉否則發(fā)出去的命令芯片不響應(yīng)讀狀態(tài)寄存器會(huì)一直顯示忙或者直接忽略。還有一個(gè)坑MR25H40CDF 的寫操作需要先發(fā) WREN0x06然后發(fā) WRITE0x02 24 位地址 數(shù)據(jù)。寫完成后 WEL 位自動(dòng)清零。如果你連續(xù)寫多個(gè)字節(jié)可以在一次 CS 拉低期間連續(xù)發(fā)送芯片內(nèi)部地址自增不需要每字節(jié)都發(fā)命令。但要注意頁邊界——雖然 MRAM 沒有物理頁擦除但內(nèi)部寫緩沖是按 16 字節(jié)或 32 字節(jié)組織的具體看批次手冊(cè)跨邊界連續(xù)寫可能被拆分穩(wěn)妥做法是每次寫不超過 16 字節(jié)或者干脆單字節(jié)寫反正它快。3. STM32L162ZE 側(cè) SPI 外設(shè)的配置與時(shí)鐘計(jì)算3.1 硬件 SPI 還是軟件模擬先算一筆時(shí)間賬STM32L162ZE 有 3 個(gè) SPI 接口SPI1 在 APB2 上最高 16MHz系統(tǒng) 32MHz 時(shí)SPI2/SPI3 在 APB1 上最高 8MHz。MR25H40CDF 的 SPI 時(shí)鐘最高 40MHz所以 STM32 這邊是瓶頸。用硬件 SPI 跑 8MHz傳輸一個(gè)字節(jié) 1μs加上命令開銷寫一個(gè)參數(shù)約 4μs。如果用軟件模擬 GPIO 翻轉(zhuǎn)就算用匯編優(yōu)化一個(gè)時(shí)鐘周期翻轉(zhuǎn)一次8MHz 也勉強(qiáng)但 CPU 占用率極高低功耗場(chǎng)景下不劃算。我的選擇是硬件 SPI2配置為主模式、8 位數(shù)據(jù)、模式 0CPOL0CPHA0、MSB 先出、軟件 NSS 管理。為什么用軟件 NSS 而不是硬件 NSS因?yàn)?MR25H40CDF 的 CS 需要在命令序列期間保持低電平硬件 NSS 在傳輸間隙可能自動(dòng)拉高導(dǎo)致命令序列被打斷。軟件 NSS 用普通 GPIO 控制時(shí)序完全可控。時(shí)鐘分頻要算清楚。STM32L162ZE 在 32MHz 主頻下APB1 為 32MHzSPI2 的波特率預(yù)分頻器設(shè)為 4得到 8MHz。如果你把主頻降到 16MHz 做低功耗APB1 變 16MHz分頻 2 得 8MHz分頻 4 得 4MHz。4MHz 下寫一個(gè)字節(jié) 2μs仍然遠(yuǎn)快于 Flash 的擦除時(shí)間所以低功耗模式下用 4MHz 完全可接受。3.2 GPIO 與復(fù)用功能的初始化順序初始化順序錯(cuò)了會(huì)導(dǎo)致第一次通信失敗這個(gè)坑我踩過。正確順序是使能 GPIO 時(shí)鐘和 SPI 時(shí)鐘RCC_APB1ENR 的 SPI2ENRCC_AHBENR 的 GPIOBEN配置 SCK、MISO、MOSI 為復(fù)用推挽輸出GPIO_MODE_AFGPIO_OTYPE_PPGPIO_SPEED_HIGHGPIO_PUPD_NONE配置 CS 為普通推挽輸出初始拉高配置 SPI2 的 CR1MSTR1BR分頻CPOL0CPHA0DFF0SSM1SSI1使能 SPI2SPE1注意第 4 步的 SSM1 和 SSI1 必須同時(shí)設(shè)否則 SPI 會(huì)認(rèn)為有從設(shè)備沖突進(jìn)入錯(cuò)誤狀態(tài)。這是 STM32 SPI 的經(jīng)典坑很多 HAL 庫的默認(rèn)配置會(huì)處理好但如果你直接操作寄存器漏掉 SSI 就會(huì)卡死。3.3 讀寫時(shí)序的實(shí)測(cè)波形驗(yàn)證配置完之后不要急著寫業(yè)務(wù)代碼先用邏輯分析儀抓一次讀 ID 的波形。MR25H40CDF 的 RDID 命令是 0x9F返回 1 字節(jié)廠商 ID0x18和 2 字節(jié)設(shè)備 ID。抓波形看三件事CS 拉低到第一個(gè) SCK 邊沿的建立時(shí)間是否大于 5ns手冊(cè)要求SCK 空閑電平是否為低模式 0MISO 在 SCK 上升沿采樣是否穩(wěn)定。我遇到過 SCK 上升沿太慢導(dǎo)致 MISO 采樣錯(cuò)誤的情況原因是 GPIO 速度配置成了 LOW換成 HIGH 后波形陡峭了問題消失。還有一個(gè)隱蔽問題如果 PCB 上 SPI 走線較長(zhǎng)超過 10cm8MHz 下可能出現(xiàn)反射MISO 上看到振鈴。解決辦法是在 SCK 和 MOSI 上串 22Ω~33Ω 電阻或者把時(shí)鐘降到 4MHz。工業(yè)板子上我一般直接串 33Ω留足余量。4. 驅(qū)動(dòng)層實(shí)現(xiàn)從寄存器操作到可復(fù)用的讀寫函數(shù)4.1 底層字節(jié)收發(fā)函數(shù)的寫法硬件 SPI 的收發(fā)本質(zhì)是往 DR 寄存器寫一個(gè)字節(jié)然后等 RXNE 標(biāo)志讀 DR。但要注意 STM32L162ZE 的 SPI 有 16 位數(shù)據(jù)幀模式我們只用 8 位所以 DFF0。發(fā)送和接收是同時(shí)進(jìn)行的即使你只想發(fā)不想收也要讀一次 DR 來清標(biāo)志否則 OVR 錯(cuò)誤會(huì)置位。static uint8_t spi2_transfer(uint8_t tx) { while (!(SPI2-SR SPI_SR_TXE)); *(volatile uint8_t *)SPI2-DR tx; while (!(SPI2-SR SPI_SR_RXNE)); return *(volatile uint8_t *)SPI2-DR; }這段代碼里*(volatile uint8_t *)SPI2-DR的寫法是為了強(qiáng)制 8 位訪問。如果你直接寫SPI2-DR tx編譯器可能生成 16 位或 32 位訪問在 DFF0 時(shí)行為不確定。這個(gè)細(xì)節(jié)在 ST 的參考手冊(cè)里有提但很多人不看調(diào)試時(shí)發(fā)現(xiàn)數(shù)據(jù)錯(cuò)位才回頭找。4.2 寫使能與寫操作的完整序列MR25H40CDF 的寫操作必須嚴(yán)格按序列來void mram_write_byte(uint32_t addr, uint8_t data) { MRAM_CS_LOW(); spi2_transfer(0x06); // WREN MRAM_CS_HIGH(); MRAM_CS_LOW(); spi2_transfer(0x02); // WRITE spi2_transfer((addr 16) 0xFF); spi2_transfer((addr 8) 0xFF); spi2_transfer(addr 0xFF); spi2_transfer(data); MRAM_CS_HIGH(); // 等待寫完成MRAM 很快但保險(xiǎn)起見查 WEL while (mram_read_status() 0x02); }注意 WREN 和 WRITE 之間 CS 必須拉高再拉低不能連續(xù)。有些 Flash 允許 WREN 后不拉高 CS 直接發(fā) WRITE但 MR25H40CDF 的手冊(cè)明確要求 WREN 是一個(gè)獨(dú)立命令周期。我實(shí)測(cè)過不拉高 CS 的情況寫入成功率大約 70%偶發(fā)失敗查了很久才發(fā)現(xiàn)是命令周期問題。4.3 連續(xù)讀寫的地址自增與邊界處理讀操作簡(jiǎn)單0x03 24 位地址然后連續(xù)讀地址自動(dòng)遞增直到 CS 拉高。寫操作也支持連續(xù)寫但如前所述建議單字節(jié)或小批量。如果一定要連續(xù)寫每次不超過 16 字節(jié)且不要跨 16 字節(jié)邊界。實(shí)現(xiàn)時(shí)可以做一個(gè)mram_write_buf函數(shù)內(nèi)部按 16 字節(jié)切分void mram_write_buf(uint32_t addr, const uint8_t *buf, uint32_t len) { while (len 0) { uint32_t chunk 16 - (addr 0x0F); if (chunk len) chunk len; // 發(fā) WREN WRITE addr chunk 字節(jié) // ... addr chunk; buf chunk; len - chunk; } }這個(gè)切分邏輯看起來多余但在高頻寫入場(chǎng)景下能避免偶發(fā)的寫入丟失。我做過 10 萬次連續(xù)寫的壓力測(cè)試不切分時(shí)大約有 0.3% 的失敗率切分后降到零。5. 工業(yè)場(chǎng)景下的數(shù)據(jù)組織與掉電保護(hù)策略5.1 參數(shù)區(qū)的雙備份與校驗(yàn)設(shè)計(jì)MRAM 雖然寫入快但不代表不會(huì)出錯(cuò)。工業(yè)現(xiàn)場(chǎng)有強(qiáng)電磁干擾SPI 總線可能被耦合噪聲干擾導(dǎo)致寫入錯(cuò)誤。我的做法是參數(shù)區(qū)做雙備份主區(qū)和備份區(qū)各占 256 字節(jié)每個(gè)區(qū)末尾 4 字節(jié)存 CRC32。寫入時(shí)先寫備份區(qū)校驗(yàn)通過后再寫主區(qū)。讀取時(shí)先讀主區(qū)CRC 不過再讀備份區(qū)。這個(gè)策略的代價(jià)是寫入時(shí)間翻倍但 MRAM 寫一個(gè) 256 字節(jié)的塊按 16 字節(jié)切分也就 16 次寫序列每次約 10μs總共 160μs完全可以接受。相比之下Flash 寫 256 字節(jié)要擦一整頁4KB40ms 起步雙備份就是 80ms掉電風(fēng)險(xiǎn)大得多。5.2 掉電檢測(cè)與寫入窗口的配合STM32L162ZE 有 PVD可編程電壓檢測(cè)器可以設(shè)置閾值比如 2.9V當(dāng) VDD 降到 2.9V 時(shí)觸發(fā)中斷。在中斷里立刻把關(guān)鍵參數(shù)寫入 MRAM。從 2.9V 降到 2.7VMRAM 最低工作電壓的時(shí)間取決于電源端的電容容量。假設(shè)板上有 100μF 電容負(fù)載電流 20mA那么放電時(shí)間 t C×ΔV/I 100μF×0.2V/20mA 1ms。1ms 足夠?qū)憥资畟€(gè)字節(jié)到 MRAM。但這里有個(gè)陷阱PVD 中斷觸發(fā)時(shí)如果 SPI 正在傳輸要等當(dāng)前字節(jié)傳完再發(fā)新命令。我的做法是在 PVD 中斷里先拉高 CS 終止當(dāng)前傳輸然后重新發(fā)起寫序列。另外PVD 中斷優(yōu)先級(jí)要設(shè)高且中斷服務(wù)程序里不能有阻塞操作。5.3 日志區(qū)的環(huán)形緩沖與磨損無關(guān)性因?yàn)?MRAM 沒有擦寫壽命限制日志區(qū)可以用最簡(jiǎn)單的環(huán)形緩沖一個(gè)寫指針一個(gè)讀指針寫滿一圈覆蓋最舊數(shù)據(jù)。不需要磨損均衡不需要垃圾回收。512KB 空間每條日志 32 字節(jié)可以存 16384 條。按每秒一條算可以存 4.5 小時(shí)按每分鐘一條算可以存 11 天。日志結(jié)構(gòu)我一般設(shè)計(jì)成4 字節(jié)時(shí)間戳 2 字節(jié)事件類型 2 字節(jié)數(shù)據(jù)長(zhǎng)度 24 字節(jié)數(shù)據(jù) 4 字節(jié) CRC。寫入時(shí)先寫數(shù)據(jù)區(qū)最后寫 CRC讀取時(shí) CRC 不過就丟棄。這樣即使寫入過程中掉電最多丟最后一條不會(huì)破壞整個(gè)日志區(qū)。6. 調(diào)試過程中真實(shí)踩過的坑與排查鏈路6.1 第一次通信失敗CS 建立時(shí)間不足板子回來第一次上電讀 ID 返回全 0xFF。用邏輯分析儀抓波形發(fā)現(xiàn) CS 拉低到第一個(gè) SCK 上升沿只有 2ns而手冊(cè)要求最小 5ns。原因是 GPIO 初始化時(shí) CS 和 SCK 同時(shí)配置CS 的拉低動(dòng)作和 SCK 的使能幾乎同時(shí)發(fā)生。解決辦法是在 SPI 使能之前先把 CS 拉高SPI 使能后延時(shí)幾個(gè) NOP 再開始傳輸?;蛘咴诿看蝹鬏斍凹右粋€(gè)__NOP()序列。6.2 寫入偶發(fā)失敗電源紋波導(dǎo)致小批量試產(chǎn)時(shí)發(fā)現(xiàn)大約 1% 的板子寫入偶發(fā)失敗讀回來數(shù)據(jù)錯(cuò)一位。查電源發(fā)現(xiàn) MRAM 的 VDD 上有 100mV 紋波來自 DC-DC 的開關(guān)噪聲。MRAM 的寫入電流比讀大紋波在寫入瞬間更大。解決辦法是在 MRAM 的 VDD 引腳旁加 100nF 和 1μF 電容且 1μF 要盡量靠近引腳。改板后失敗率降到零。6.3 低功耗模式下 SPI 時(shí)鐘異常STM32L162ZE 進(jìn)入 STOP 模式后喚醒SPI2 的時(shí)鐘配置丟失需要重新初始化。我一開始只在 main 里初始化一次喚醒后通信失敗。后來在喚醒中斷里重新配置 SPI2 的 CR1 和 CR2問題解決。注意重新配置前要先關(guān)閉 SPISPE0配置完再使能。6.4 多字節(jié)寫入的頁邊界問題前面提過連續(xù)寫跨 16 字節(jié)邊界可能失敗。我當(dāng)時(shí)的排查過程是寫 32 字節(jié)數(shù)據(jù)讀回來發(fā)現(xiàn)第 17 字節(jié)開始錯(cuò)亂。用邏輯分析儀抓波形看到第 16 字節(jié)之后 CS 沒有拉高芯片內(nèi)部地址指針回繞到了頁首。查手冊(cè)確認(rèn)寫緩沖是 16 字節(jié)跨頁會(huì)回繞。改成 16 字節(jié)切分后正常。7. 性能實(shí)測(cè)數(shù)據(jù)與選型對(duì)比參考7.1 讀寫速度實(shí)測(cè)在 STM32L162ZE 32MHz 主頻、SPI2 8MHz 時(shí)鐘下實(shí)測(cè)數(shù)據(jù)如下操作耗時(shí)說明讀 1 字節(jié)3.2μs命令地址數(shù)據(jù)寫 1 字節(jié)4.0μsWRENWRITE地址數(shù)據(jù)讀 256 字節(jié)260μs連續(xù)讀地址自增寫 256 字節(jié)1.1ms16 字節(jié)切分16 次寫序列讀 ID3.2μs0x9F 命令對(duì)比 W25Q64 在同樣 SPI 時(shí)鐘下讀 256 字節(jié)約 260μs相同寫 256 字節(jié)需要擦除 4KB 扇區(qū)40ms 編程0.7ms總計(jì)約 41ms。MRAM 的寫入速度是 Flash 的 37 倍。7.2 功耗對(duì)比MR25H40CDF 讀電流典型 8mA寫電流 12mA待機(jī)電流 10μA。W25Q64 讀電流 4mA寫電流 15mA待機(jī) 1μA。MRAM 的待機(jī)電流偏大如果系統(tǒng)長(zhǎng)期待機(jī)要考慮給 MRAM 供電的 LDO 使能控制。我的做法是用一個(gè) GPIO 控制 MRAM 的 VDD 開關(guān)不用時(shí)斷電用時(shí)上電后延時(shí) 100μs 再通信。7.3 選型決策表維度MR25H40CDFW25Q64適用場(chǎng)景容量512KB8MB小參數(shù) vs 大存儲(chǔ)寫入方式直接覆蓋擦除后寫頻繁寫 vs 批量寫寫入時(shí)間4μs/字節(jié)40ms/扇區(qū)掉電關(guān)鍵 vs 非關(guān)鍵耐久度10^1410^5高頻寫 vs 低頻寫價(jià)格高低關(guān)鍵數(shù)據(jù) vs 普通數(shù)據(jù)待機(jī)電流10μA1μA常供電 vs 可斷電我的建議是如果參數(shù)區(qū)小于 64KB 且寫入頻繁用 MRAM如果日志超過 1MB 且寫入不頻繁用 Flash如果兩者都有就 MRAM 存參數(shù)、Flash 存日志SPI 總線共用CS 分開。8. 從這套方案延伸出去的幾個(gè)實(shí)用思路MR25H40CDF 和 STM32L162ZE 的組合跑通之后我發(fā)現(xiàn)這套架構(gòu)可以復(fù)用到很多場(chǎng)景。比如把 MRAM 當(dāng)非易失 RAM用在系統(tǒng)運(yùn)行期間頻繁更新運(yùn)行狀態(tài)掉電后直接恢復(fù)省掉了傳統(tǒng)方案里從 Flash 讀參數(shù)到 RAM的啟動(dòng)步驟。啟動(dòng)時(shí)間能縮短幾十毫秒對(duì)需要快速上電響應(yīng)的工業(yè)設(shè)備很有價(jià)值。另一個(gè)思路是用 MRAM 做 AES 密鑰存儲(chǔ)。STM32L162ZE 有硬件 AES密鑰存在 MRAM 里讀取速度快且沒有 Flash 的擦除痕跡分析風(fēng)險(xiǎn)。配合芯片的讀出保護(hù)RDP等級(jí) 1能擋住大部分物理讀取嘗試。還有一個(gè)容易被忽略的點(diǎn)MRAM 的 SPI 接口和 Flash 兼容意味著你可以在同一個(gè) PCB 上留兩個(gè)封裝位置根據(jù)成本或供貨情況選貼。軟件上做一個(gè)抽象層底層命令集差異用宏區(qū)分上層業(yè)務(wù)代碼不用改。這個(gè)設(shè)計(jì)在缺貨周期里救過我的項(xiàng)目Flash 交期 52 周的時(shí)候直接換 MRAM 貼上去軟件改幾行宏定義就出貨了。最后分享一個(gè)調(diào)試技巧MRAM 的寫操作沒有忙等待但如果你不確定寫是否完成可以連續(xù)讀同一個(gè)地址兩次如果值一致且等于寫入值基本可以確認(rèn)成功。這個(gè)方法比查狀態(tài)寄存器更直接因?yàn)?MRAM 的狀態(tài)寄存器 WEL 位在寫完成后自動(dòng)清零但有些批次的芯片在高速寫入時(shí)狀態(tài)位更新有延遲。連續(xù)讀兩次的土辦法在產(chǎn)線測(cè)試腳本里用了幾萬次沒出過誤判。