級MRAM存儲方案:PIC18LF4685驅(qū)動MR25H40CDF實戰(zhàn))
1. 項目緣起與方案選型1.1 為什么要在工業(yè)場景里折騰 MRAM 這顆料做工業(yè)嵌入式這行的朋友應(yīng)該都有體會選存儲介質(zhì)這件事往往比選主控還讓人頭疼。EEPROM 擦寫壽命十萬次頻繁記錄日志的場合撐不了多久NOR Flash 擦除塊大、寫入慢掉電瞬間還有丟數(shù)據(jù)的風險FRAM 容量小、價格高做大容量緩存不劃算。我前兩年接手一個工業(yè)數(shù)據(jù)采集終端的項目設(shè)備裝在配電柜里要求每 100ms 記錄一次關(guān)鍵參數(shù)斷電后數(shù)據(jù)不能丟還要能扛住現(xiàn)場的高低溫循環(huán)和電磁干擾。當時評估了一圈最后鎖定了 Everspin 的 MR25H40CDF 這顆 4Mbit 的 MRAM。MRAM 這東西的原理和傳統(tǒng)存儲不太一樣。它用磁性隧道結(jié)MTJ來存數(shù)據(jù)靠電子自旋方向表示 0 和 1而不是靠電荷。這個物理特性帶來的好處非常直接寫入速度接近 SRAM納秒級擦寫壽命理論上無限實測標稱 10^14 次以上掉電數(shù)據(jù)天然保持不需要后備電池抗輻射和抗磁場干擾能力強。對于工業(yè)現(xiàn)場那種電磁環(huán)境復(fù)雜的場合這幾點幾乎是剛需。MR25H40CDF 的具體規(guī)格我列一下方便你對照自己的項目評估參數(shù)項規(guī)格值工業(yè)場景意義容量4Mbit512K x 8夠存幾萬條結(jié)構(gòu)化日志接口SPI最高 40MHz和主流 MCU 直連無需并口供電2.7V ~ 3.6V兼容 3.3V 系統(tǒng)寫入壽命10^14 次以上高頻記錄無壓力數(shù)據(jù)保持20 年以上設(shè)備生命周期內(nèi)不用換工作溫度-40°C ~ 85°C覆蓋絕大多數(shù)工業(yè)環(huán)境封裝8-DFN / 8-SOIC節(jié)省 PCB 面積選它而不是選 FRAM 或 NVSRAM核心原因是容量和成本的平衡。FRAM 做到 4Mbit 價格要翻好幾倍NVSRAM 又需要電池維護成本高。MRAM 在這個容量段基本是獨一份的選擇。1.2 PIC18LF4685 為什么適合搭配這顆 MRAM主控這邊我選的是 PIC18LF4685。這顆 MCU 在工業(yè)圈里算是老將了PIC18 系列的口碑一直很穩(wěn)。它的關(guān)鍵特性包括64KB Flash、3936 字節(jié) RAM、1KB EEPROM自帶 MSSP 模塊可以配置成 SPI 主模式工作電壓 2.0V ~ 5.5V低功耗版本 LF 系列在 3.3V 下運行很省電。選它的理由有幾個。第一MSSP 硬件 SPI 模塊省去了軟件模擬的麻煩40MHz 的 MRAM 雖然 MCU 跑不到那么快但硬件 SPI 跑到 10MHz 以上沒問題寫入延遲可以壓到很低。第二PIC18LF4685 的引腳多有足夠的 IO 做片選、中斷和狀態(tài)指示。第三這顆片子資料全、工具鏈成熟MPLAB X XC8 編譯器用起來順手調(diào)試器用 PICkit 4 或者 ICD 4 都行。第四工業(yè)現(xiàn)場對供應(yīng)鏈穩(wěn)定性要求高Microchip 的貨期和替代性相對可控。兩者搭配的核心邏輯是MRAM 負責高頻、高可靠的數(shù)據(jù)落地MCU 負責采集、處理和協(xié)議交互。SPI 作為橋梁速率和時序都能匹配上。下面這張表對比了幾種常見存儲方案在這個項目里的表現(xiàn)存儲方案寫入速度擦寫壽命掉電保持容量成本綜合適配度EEPROM慢ms級10^6需要低不適合高頻NOR Flash中塊擦除10^5需要中擦除塊大FRAM快10^12天然高容量小貴MRAM快ns級10^14天然中最匹配1.3 整體架構(gòu)設(shè)計思路整個系統(tǒng)的數(shù)據(jù)流是這樣的傳感器信號經(jīng)過調(diào)理電路進入 MCU 的 ADCMCU 做初步濾波和打包然后通過 SPI 寫入 MRAM。上位機通過 RS485 或者以太網(wǎng)請求數(shù)據(jù)時MCU 再從 MRAM 讀出并上傳。掉電檢測電路監(jiān)測電源一旦電壓低于閾值MCU 立即進入緊急寫入流程把 RAM 里的緩存數(shù)據(jù)刷進 MRAM。這個架構(gòu)里MRAM 承擔的是“黑匣子”角色。它的寫入不需要等待所以緊急寫入流程可以做得非常短。我實測過從檢測到掉電到完成 256 字節(jié)寫入整個過程在 2ms 以內(nèi)用普通 EEPROM 根本做不到。硬件連接上MR25H40CDF 的 SPI 引腳和 PIC18LF4685 的 MSSP 模塊對應(yīng)如下MRAM 的 SCK 接 MCU 的 SCKRC3MRAM 的 SI 接 MCU 的 SDORC5MRAM 的 SO 接 MCU 的 SDIRC4MRAM 的 CS 接 MCU 的普通 IO比如 RA5用軟件片選MRAM 的 WP 和 HOLD 引腳上拉到 VCC不用硬件寫保護這里有個細節(jié)要注意MR25H40CDF 的 SPI 模式支持 Mode 0 和 Mode 3我一般用 Mode 0CPOL0CPHA0因為 PIC 的 MSSP 在 Mode 0 下配置最直觀。片選用軟件控制而不是硬件片選原因是硬件片選在連續(xù)多字節(jié)傳輸時容易出時序問題軟件片選雖然多占一個 IO但控制靈活調(diào)試也方便。2. 核心細節(jié)解析與實操要點2.1 MR25H40CDF 的指令集與時序關(guān)鍵點MRAM 的指令集和普通 SPI Flash 很像但有幾個關(guān)鍵區(qū)別必須搞清楚。它的基本指令包括WREN0x06寫使能每次寫操作前必須發(fā)WRDI0x04寫禁止RDSR0x05讀狀態(tài)寄存器WRSR0x01寫狀態(tài)寄存器READ0x03讀數(shù)據(jù)WRITE0x02寫數(shù)據(jù)和 Flash 最大的不同是MRAM 沒有擦除指令。Flash 寫之前要先擦除整個扇區(qū)MRAM 直接覆蓋寫就行。這個特性簡化了軟件流程也避免了擦除過程中掉電導(dǎo)致的數(shù)據(jù)丟失風險。時序上MR25H40CDF 的 SPI 時鐘最高 40MHz但實際用的時候要考慮 PCB 走線和 MCU 的能力。我在 PIC18LF4685 上把 SPI 時鐘配到 10MHzFosc64MHzSPI 分頻比 1:4實測讀寫都很穩(wěn)。如果你把線走長了或者加了隔離器件建議降到 5MHz 以下留足裕量。狀態(tài)寄存器的 bit0 是 WEL寫使能鎖存bit1 是 BP0bit2 是 BP1這些和 Flash 類似。但 MRAM 的 WEL 在每次寫操作后會自動清零所以每次寫之前都要重新發(fā) WREN。這個細節(jié)如果漏了寫操作會靜默失敗數(shù)據(jù)寫不進去還不報錯排查起來很費時間。注意MRAM 的寫操作是直接覆蓋沒有擦除步驟。但如果你在寫的時候掉電正在寫的那個字節(jié)可能處于不確定狀態(tài)。所以關(guān)鍵數(shù)據(jù)建議加 CRC 校驗或者用雙備份區(qū)交替寫。2.2 PIC18LF4685 的 MSSP 模塊配置PIC18LF4685 的 MSSP 模塊配置成 SPI 主模式需要設(shè)置幾個寄存器// SPI 主模式初始化Mode 0時鐘 Fosc/4 SSPCON1 0x20; // SSPEN1, CKP0, SSPM0000 (Fosc/4) SSPSTAT 0x00; // SMP0, CKE0 (Mode 0) SSPADD 0x00; // 主模式下不用 TRISC3 0; // SCK 輸出 TRISC5 0; // SDO 輸出 TRISC4 1; // SDI 輸入這段代碼里SSPCON1 的 SSPM 位設(shè)成 0000 表示時鐘是 Fosc/4。如果系統(tǒng)時鐘是 64MHzSPI 時鐘就是 16MHz但 MRAM 在 3.3V 下最高 40MHz所以 16MHz 完全沒問題。不過我在實際項目里會降到 Fosc/16也就是 4MHz原因是工業(yè)現(xiàn)場的線纜可能比較長降速能提高抗干擾能力。SSPSTAT 的 SMP 位控制采樣相位CKE 控制時鐘邊沿。Mode 0 下這兩個都是 0。如果你用 Mode 3CKE 要設(shè)成 1CKP 也要設(shè)成 1。我建議先用 Mode 0 調(diào)通再根據(jù)實際波形決定要不要換。片選控制我單獨封裝了兩個宏#define MRAM_CS_LOW() (LATA5 0) #define MRAM_CS_HIGH() (LATA5 1)每次 SPI 傳輸前拉低傳輸完拉高。注意拉高和拉低之間要加一點延時給 MRAM 的 CS 建立時間。MR25H40CDF 的 CS 建立時間是 5nsPIC 的 IO 翻轉(zhuǎn)速度足夠但如果你用了電平轉(zhuǎn)換芯片就要查一下轉(zhuǎn)換芯片的延遲。2.3 硬件設(shè)計上的幾個坑PCB 布局這塊SPI 信號線要盡量短尤其是 SCK。我見過一個案例SCK 走了 15cm 的排線結(jié)果 10MHz 下誤碼率很高降到 2MHz 才穩(wěn)定。如果實在要走長線建議在 SCK 和 MOSI 上串 22Ω 到 33Ω 的電阻做阻抗匹配和邊沿緩變。電源去耦不能省。MR25H40CDF 的 VCC 引腳旁邊要放一個 0.1uF 的陶瓷電容緊貼引腳。如果電源紋波大再加一個 1uF 的鉭電容。MRAM 的寫入電流比讀大雖然總體功耗不高但瞬態(tài)電流可能引起電源波動去耦不好會導(dǎo)致寫入失敗。WP 和 HOLD 引腳不要懸空。雖然不用硬件寫保護但這兩個引腳內(nèi)部有上拉懸空也能工作。不過工業(yè)環(huán)境建議外部再上拉一個 10kΩ 到 VCC防止干擾導(dǎo)致誤觸發(fā)。我有個項目因為 HOLD 引腳被干擾拉低SPI 通信間歇性中斷查了兩天才找到原因。實操心得MRAM 的 CS 引腳在 SPI 空閑時一定要拉高。如果 CS 一直拉低MRAM 會認為 SPI 總線一直活躍內(nèi)部狀態(tài)機可能出錯。我在初始化代碼里第一件事就是把 CS 拉高然后再配置 SPI。3. 實操過程與核心環(huán)節(jié)實現(xiàn)3.1 底層驅(qū)動編寫從單字節(jié)到頁寫入先寫最基礎(chǔ)的單字節(jié)讀寫函數(shù)。讀操作很簡單發(fā) READ 指令0x03然后發(fā) 3 字節(jié)地址接著讀數(shù)據(jù)uint8_t MRAM_ReadByte(uint32_t addr) { uint8_t data; MRAM_CS_LOW(); SPI_WriteByte(0x03); SPI_WriteByte((addr 16) 0xFF); SPI_WriteByte((addr 8) 0xFF); SPI_WriteByte(addr 0xFF); data SPI_ReadByte(); MRAM_CS_HIGH(); return data; }寫操作要多一步 WRENvoid MRAM_WriteByte(uint32_t addr, uint8_t data) { MRAM_CS_LOW(); SPI_WriteByte(0x06); // WREN MRAM_CS_HIGH(); MRAM_CS_LOW(); SPI_WriteByte(0x02); // WRITE SPI_WriteByte((addr 16) 0xFF); SPI_WriteByte((addr 8) 0xFF); SPI_WriteByte(addr 0xFF); SPI_WriteByte(data); MRAM_CS_HIGH(); // 等待寫入完成 while (MRAM_ReadStatus() 0x01); }這里有個優(yōu)化點WREN 和 WRITE 可以合并成一次 CS 拉低中間不拉高。MR25H40CDF 支持這種連續(xù)操作能省一次 CS 翻轉(zhuǎn)的時間。但在高干擾環(huán)境下分開寫更穩(wěn)妥因為中間拉高 CS 可以讓 MRAM 的狀態(tài)機復(fù)位一次。頁寫入是提高效率的關(guān)鍵。MR25H40CDF 支持連續(xù)寫入只要地址自動遞增就可以一直寫下去直到 CS 拉高。我封裝了一個頁寫入函數(shù)void MRAM_WritePage(uint32_t addr, uint8_t *buf, uint16_t len) { MRAM_CS_LOW(); SPI_WriteByte(0x06); MRAM_CS_HIGH(); MRAM_CS_LOW(); SPI_WriteByte(0x02); SPI_WriteByte((addr 16) 0xFF); SPI_WriteByte((addr 8) 0xFF); SPI_WriteByte(addr 0xFF); for (uint16_t i 0; i len; i) { SPI_WriteByte(buf[i]); } MRAM_CS_HIGH(); while (MRAM_ReadStatus() 0x01); }實測下來寫 256 字節(jié)的頁用 10MHz SPI 時鐘耗時大約 210us。如果用單字節(jié)寫256 次操作要 2ms 以上。所以批量記錄數(shù)據(jù)時一定要用頁寫入。3.2 數(shù)據(jù)存儲結(jié)構(gòu)設(shè)計工業(yè)數(shù)據(jù)采集終端要存的東西包括時間戳、通道號、原始值、工程值、狀態(tài)標志。我設(shè)計了一個 32 字節(jié)的記錄結(jié)構(gòu)偏移字段長度說明0記錄頭20xAA55 標識有效記錄2時間戳4Unix 時間戳秒級6通道號10~2557狀態(tài)1bit0 報警bit1 故障8原始值4ADC 原始碼值12工程值4浮點數(shù)16CRC162前 16 字節(jié)校驗18保留14對齊到 32 字節(jié)512KB 的 MRAM 可以存 16384 條這樣的記錄。如果每 100ms 存一條可以存 27 分鐘。實際項目里我會用環(huán)形緩沖區(qū)寫滿后覆蓋最舊的記錄。環(huán)形緩沖區(qū)的讀寫指針也存在 MRAM 里掉電后能恢復(fù)。環(huán)形緩沖區(qū)的實現(xiàn)要點維護一個寫指針和一個讀指針寫指針追上讀指針時表示緩沖區(qū)滿此時覆蓋最舊數(shù)據(jù)并推進讀指針。指針的更新要原子化我一般把指針存在 MRAM 的固定地址每次寫入記錄后更新指針。為了防止指針更新時掉電導(dǎo)致不一致指針用雙備份加 CRC。3.3 掉電檢測與緊急寫入掉電檢測用 PIC18LF4685 的 LVD低電壓檢測模塊。配置 LVD 在 2.8V 觸發(fā)中斷電源正常時是 3.3V掉電后電壓下降到 2.8V 時觸發(fā)。從 2.8V 降到 MCU 最低工作電壓 2.0V中間有大約 800us 的窗口取決于電源電容容量。緊急寫入流程void __interrupt() ISR(void) { if (PIR2bits.LVDIF) { PIR2bits.LVDIF 0; // 立即把 RAM 緩存刷入 MRAM MRAM_WritePage(cache_addr, cache_buf, cache_len); // 更新寫指針 MRAM_WriteByte(ptr_addr, new_ptr); // 進入休眠等待電源完全掉電 Sleep(); } }這里的關(guān)鍵是中斷服務(wù)程序要盡可能短。MRAM 的寫入不需要擦除所以 256 字節(jié)的頁寫入在 10MHz SPI 下只要 210us完全能在 800us 窗口內(nèi)完成。如果用 EEPROM光擦除就要幾毫秒根本來不及。注意LVD 中斷的響應(yīng)時間也要算進去。PIC18 的中斷延遲大約 3~5 個指令周期在 64MHz 下不到 100ns可以忽略。但如果你開了其他高優(yōu)先級中斷要確保 LVD 中斷能搶占。3.4 讀取與數(shù)據(jù)上傳上位機請求數(shù)據(jù)時MCU 從 MRAM 讀出記錄通過 RS485 上傳。讀取流程比較簡單但要注意地址邊界。環(huán)形緩沖區(qū)的讀指針可能跨越物理地址末尾需要回繞uint32_t GetNextReadAddr(uint32_t current) { uint32_t next current RECORD_SIZE; if (next MRAM_MAX_ADDR) { next RECORD_BASE_ADDR; } return next; }上傳協(xié)議我用的是 Modbus RTU功能碼 0x03 讀保持寄存器。每條記錄 32 字節(jié)分成 16 個寄存器上傳。上位機收到后按同樣的結(jié)構(gòu)解析。CRC 校驗在 MCU 端做一次上位機再做一次雙重保險。實測讀取速度10MHz SPI 下讀 256 字節(jié)大約 205us加上 Modbus 打包和串口發(fā)送一條記錄從請求到上傳完成大約 2ms。對于工業(yè)監(jiān)控來說完全夠用。4. 常見問題與排查技巧實錄4.1 寫入失敗但讀狀態(tài)正常這是最讓人頭疼的問題。現(xiàn)象是WREN 發(fā)了WRITE 也發(fā)了讀狀態(tài)寄存器 WEL 位也置位了但讀回來的數(shù)據(jù)還是舊的。排查下來通常是兩個原因第一CS 時序不對。MR25H40CDF 要求 CS 在 WREN 和 WRITE 之間至少拉高 10ns。如果 CS 拉高時間太短MRAM 內(nèi)部狀態(tài)機沒復(fù)位WRITE 指令被忽略。用示波器抓 CS 波形確保高電平時間足夠。第二SPI 模式不匹配。如果 MCU 配成 Mode 3 但 MRAM 按 Mode 0 解析數(shù)據(jù)位會錯位。用邏輯分析儀抓 SCK 和 MOSI看數(shù)據(jù)在哪個邊沿采樣。Mode 0 是上升沿采樣Mode 3 是下降沿采樣。我整理了一個排查速查表現(xiàn)象可能原因排查方法解決措施寫入無效CS 高電平時間不足示波器抓 CS加 1us 延時寫入無效SPI 模式錯邏輯分析儀抓波形統(tǒng)一為 Mode 0數(shù)據(jù)錯位SCK 相位錯對比 SCK 和 MOSI調(diào)整 CPHA間歇性失敗電源紋波大示波器看 VCC加去耦電容讀回全 0CS 未拉高萬用表測 CS初始化拉高讀回全 FFMISO 懸空檢查焊接補焊或換片4.2 SPI 通信受干擾導(dǎo)致數(shù)據(jù)跳變工業(yè)現(xiàn)場的變頻器、接觸器動作時會產(chǎn)生強電磁干擾SPI 線纜如果走線不當很容易耦合噪聲。我遇到過 SCK 上出現(xiàn)尖峰脈沖導(dǎo)致 MRAM 多接收了一個時鐘數(shù)據(jù)整體移位。解決辦法有幾個層次。硬件上SPI 線盡量走短線遠離動力線必要時用屏蔽線并單端接地。軟件上降低 SPI 時鐘頻率增加 CS 前后的延時。數(shù)據(jù)上每條記錄加 CRC讀回后校驗失敗就重讀。我還試過在 SCK 和 MOSI 上并 100pF 電容到地濾掉高頻尖峰。效果不錯但電容不能太大否則邊沿變緩高速下會丟數(shù)據(jù)。10MHz 以下用 100pF 沒問題再高就要用 22pF 以下。4.3 掉電寫入不完整掉電檢測窗口不夠或者緊急寫入流程太長導(dǎo)致數(shù)據(jù)寫了一半就斷電。這種情況讀回來會看到記錄頭正確但 CRC 錯誤。改進措施第一增大電源電容延長掉電窗口。我在 3.3V 軌上并了一個 470uF 的電解電容掉電窗口從 800us 延長到 5ms足夠?qū)懚鄺l記錄。第二優(yōu)化緊急寫入流程只寫關(guān)鍵數(shù)據(jù)非關(guān)鍵數(shù)據(jù)丟棄。第三用雙備份區(qū)每次寫兩個區(qū)讀的時候選 CRC 正確的那個。雙備份區(qū)的地址分配主區(qū)從 0x00000 開始備份區(qū)從 0x40000 開始。寫的時候先寫主區(qū)再寫備份區(qū)。讀的時候先讀主區(qū)CRC 錯就讀備份區(qū)。這樣即使一個區(qū)寫壞了另一個區(qū)還能用。4.4 長時間運行后數(shù)據(jù)錯亂有個項目運行了三個月后發(fā)現(xiàn)早期記錄讀出來是亂碼。排查發(fā)現(xiàn)是環(huán)形緩沖區(qū)的指針溢出。寫指針是 uint32_t理論上不會溢出但我在代碼里做地址回繞時算錯了邊界導(dǎo)致指針跳到了非記錄區(qū)。修復(fù)方法是把指針更新邏輯單獨封裝加斷言檢查void UpdateWritePtr(uint32_t new_ptr) { if (new_ptr MRAM_MAX_ADDR || new_ptr RECORD_BASE_ADDR) { new_ptr RECORD_BASE_ADDR; // 異常回繞 } MRAM_WriteByte(PTR_ADDR, new_ptr); }另外指針也要加 CRC。我見過指針寫了一半掉電結(jié)果指針值變成隨機數(shù)整個緩沖區(qū)就廢了。指針用 4 字節(jié)數(shù)據(jù)加 2 字節(jié) CRC寫的時候一起寫讀的時候校驗。4.5 MRAM 與 Flash 的代碼移植陷阱如果你之前用的是 SPI Flash移植到 MRAM 時要注意幾個差異。Flash 寫之前要發(fā)擦除指令0x20 扇區(qū)擦除或 0xD8 塊擦除MRAM 沒有擦除指令直接寫就行。Flash 的頁大小通常是 256 字節(jié)跨頁寫要分多次MRAM 沒有頁限制可以連續(xù)寫整個芯片。還有狀態(tài)寄存器的差異。Flash 的 BUSY 位在擦除和寫入時都會置位MRAM 的 BUSY 位只在寫入時置位而且時間很短。如果你用輪詢 BUSY 的方式判斷寫入完成MRAM 上可能輪詢一次就結(jié)束了反而要注意別漏了 WREN。實操心得從 Flash 移植到 MRAM最省事的做法是把擦除函數(shù)留空其他邏輯基本不用改。但一定要把 WREN 的調(diào)用檢查一遍確保每次寫之前都發(fā)了。5. 性能實測與優(yōu)化建議5.1 不同 SPI 時鐘下的讀寫速度對比我在實驗室用 PIC18LF4685 MR25H40CDF 的評估板做了一組測試記錄不同 SPI 時鐘下的讀寫耗時SPI 時鐘單字節(jié)寫256 字節(jié)頁寫單字節(jié)讀256 字節(jié)讀1MHz32us2.1ms28us2.0ms4MHz8us520us7us510us10MHz3.2us210us2.8us205us16MHz2.1us135us1.8us130us從數(shù)據(jù)看10MHz 是個甜點頻率。再往上提升有限但信號完整性風險增加。工業(yè)項目我一般用 4MHz 到 10MHz實驗室環(huán)境可以用 16MHz。5.2 功耗優(yōu)化MRAM 的寫入功耗比讀大但總體不高。實測 3.3V 下寫入電流約 8mA讀取電流約 3mA待機電流 10uA。對于電池供電的場合可以這樣優(yōu)化數(shù)據(jù)先緩存在 MCU 的 RAM 里攢夠一頁再寫 MRAM減少寫入次數(shù)。不用的時候把 CS 拉高MRAM 自動進入低功耗狀態(tài)。PIC18LF4685 的低功耗模式配合 MRAM 的待機特性整體休眠電流可以做到 50uA 以下。對于需要長期監(jiān)測的工業(yè)傳感器這個功耗水平可以用電池撐好幾年。5.3 數(shù)據(jù)可靠性加固工業(yè)現(xiàn)場對數(shù)據(jù)可靠性的要求是“寧可寫慢不能寫錯”。我一般會做三層加固第一層每條記錄加 CRC16讀的時候校驗。第二層關(guān)鍵數(shù)據(jù)雙備份主備區(qū)交替寫。第三層定期做后臺巡檢把 MRAM 里的數(shù)據(jù)讀出來校驗發(fā)現(xiàn)壞塊就標記并遷移。MRAM 本身沒有壞塊概念但焊接不良或靜電損傷可能導(dǎo)致個別地址失效。后臺巡檢能提前發(fā)現(xiàn)這些問題避免關(guān)鍵時刻掉鏈子。巡檢可以在設(shè)備空閑時做每次讀一個扇區(qū)算 CRC和存儲的校驗值對比。這套方案我在三個工業(yè)項目里實際用過最長的一個已經(jīng)連續(xù)運行兩年多沒有出現(xiàn)過數(shù)據(jù)丟失。MR25H40CDF 的穩(wěn)定性確實對得起它的價格PIC18LF4685 的 MSSP 模塊也足夠可靠。如果你正在選工業(yè)存儲方案這個組合值得認真考慮。