動MRAM實(shí)戰(zhàn):SPI接口高頻寫入與掉電保護(hù)設(shè)計(jì))
1. 項(xiàng)目緣起與方案選型思考1.1 為什么要在工業(yè)場景里折騰 MRAM 這顆料做工業(yè)嵌入式這行十來年我經(jīng)手的存儲方案從最早的 EEPROM、NOR Flash到后來的 FRAM、NVSRAM再到近幾年的 MRAM基本都踩過一遍。這次項(xiàng)目選型 MR25H40CDF 這顆 4Mbit 的磁阻隨機(jī)存儲器起因是客戶的一臺工業(yè)數(shù)據(jù)采集終端要求在現(xiàn)場斷電、強(qiáng)電磁干擾、寬溫-40℃到 85℃環(huán)境下把關(guān)鍵標(biāo)定參數(shù)和運(yùn)行日志穩(wěn)定保存十年以上而且寫入頻次極高——每秒鐘可能就要落一次數(shù)據(jù)。傳統(tǒng)方案在這個(gè)場景下都有硬傷。EEPROM 寫入壽命大概 100 萬次按每秒一次算不到兩周就寫廢了NOR Flash 擦寫壽命 10 萬次量級還得整塊擦除寫放大嚴(yán)重FRAM 雖然寫入壽命和速度都不錯(cuò)但容量做不大價(jià)格也偏高。MR25H40CDF 這類 MRAM 的核心優(yōu)勢在于寫入壽命理論上無限官方標(biāo)稱 10^14 次以上、寫入無需擦除、字節(jié)級隨機(jī)訪問、掉電數(shù)據(jù)保持二十年以上而且 SPI 接口簡單跟 STM32 對接幾乎零學(xué)習(xí)成本。主控這邊選 STM32F423RH是因?yàn)樗鼛?256KB SRAM、1.5MB Flash、硬件 SPI 速率能跑到 50MHz 以上還有一堆定時(shí)器和 DMA 通道跑數(shù)據(jù)采集和存儲調(diào)度綽綽有余。F4 系列在工業(yè)現(xiàn)場的口碑也穩(wěn)供貨相對好拿。這套組合的核心目標(biāo)就一句話用最簡單的 SPI 時(shí)序把最可靠的非易失存儲掛到 STM32 上實(shí)現(xiàn)高頻、掉電安全的數(shù)據(jù)讀寫。1.2 MRAM 和 Flash、EEPROM 的本質(zhì)區(qū)別在哪很多人第一次接觸 MRAM 會下意識把它當(dāng) Flash 用這是最大的坑。我用一個(gè)生活化的類比來解釋Flash 像一塊黑板你要改一個(gè)字得先把整塊黑板擦干凈再重寫擦的過程慢且傷板面EEPROM 像一本可以單頁修改的筆記本但每頁修改次數(shù)有限MRAM 則像一塊磁性白板你拿磁筆點(diǎn)哪個(gè)字就改哪個(gè)字改多少次都不磨損斷電字還在。從原理上講MRAM 存儲單元是磁性隧道結(jié)MTJ通過改變自由層的磁化方向來存儲 0 和 1寫入靠的是自旋極化電流沒有電荷注入和隧穿氧化層退化的問題所以壽命極長。反映到實(shí)操層面有幾個(gè)關(guān)鍵差異必須記住寫入前不需要擦除直接發(fā)寫命令即可省掉了 Flash 那套“解鎖-擦除-等待-寫入”的繁瑣流程。沒有頁/扇區(qū)概念任意地址單字節(jié)可寫寫 1 個(gè)字節(jié)和寫 256 個(gè)字節(jié)耗時(shí)幾乎一樣。寫入速度極快單字節(jié)寫入時(shí)間在幾十納秒量級SPI 時(shí)鐘能跑多快寫入就能多快。讀操作是破壞性無影響的隨便讀不像某些存儲器讀多了會有 disturb 問題。理解了這些你才能明白為什么在工業(yè)高頻寫入場景下MRAM 是降維打擊。下面這張表是我實(shí)際選型時(shí)整理的對比直接抄作業(yè)就行特性MR25H40CDF (MRAM)典型 NOR Flash典型 EEPROM容量4Mbit (512KB)4Mbit~64Mbit1Kbit~2Mbit接口SPISPII2C/SPI寫入前擦除不需要必須不需要寫入壽命10^14 次約 10^5 次約 10^6 次單字節(jié)寫入時(shí)間約 30ns需整頁擦除ms 級約 5ms數(shù)據(jù)保持20 年20 年40 年工作溫度-40~85℃-40~85℃-40~85℃單位成本高低中1.3 整體架構(gòu)設(shè)計(jì)SPI 掛載 分層驅(qū)動方案定下來之后架構(gòu)設(shè)計(jì)其實(shí)不復(fù)雜但有幾個(gè)決策點(diǎn)值得說清楚。整體上我采用STM32 硬件 SPI DMA 分層驅(qū)動的結(jié)構(gòu)底層是 SPI 時(shí)序驅(qū)動中間層是 MR25H40CDF 的讀寫命令封裝上層是業(yè)務(wù)數(shù)據(jù)管理參數(shù)區(qū)、日志區(qū)、掉電保護(hù)。為什么用硬件 SPI 而不是軟件模擬因?yàn)?MRAM 的寫入速度優(yōu)勢只有在 SPI 時(shí)鐘拉高之后才能體現(xiàn)軟件模擬 SPI 撐死跑到幾 MHz還占 CPU工業(yè)場景下 CPU 要留給采集和運(yùn)算不能浪費(fèi)在翻轉(zhuǎn) IO 上。STM32F423RH 的 SPI1 掛在 APB2 上最高時(shí)鐘能到 84MHz分頻后 SPI 實(shí)際可到 42MHz配合 DMA 搬運(yùn)一次讀寫幾乎不占 CPU 時(shí)間。分層驅(qū)動的好處是解耦。底層 SPI 驅(qū)動只負(fù)責(zé)收發(fā)字節(jié)換主控比如換成 STM32H7 或者國產(chǎn)替代時(shí)只改底層中間層只負(fù)責(zé)把 MRAM 的命令時(shí)序翻譯成函數(shù)調(diào)用上層業(yè)務(wù)完全不關(guān)心底層是 MRAM 還是 Flash接口統(tǒng)一。這樣后期維護(hù)和移植成本極低這也是我在多個(gè)工業(yè)項(xiàng)目里驗(yàn)證過的穩(wěn)妥做法。提示MR25H40CDF 的 SPI 模式支持 Mode 0 和 Mode 3實(shí)際接線時(shí)一定要跟主控配置一致否則讀出來全是 0xFF 或者 0x00這個(gè)坑我見過太多新手踩。2. 硬件連接與 SPI 時(shí)序關(guān)鍵細(xì)節(jié)2.1 引腳連接與硬件片選的處理MR25H40CDF 是標(biāo)準(zhǔn) 8 腳 SOIC 封裝引腳定義很清晰VCC、GND、CS、SCK、SI、SO、WP寫保護(hù)、HOLD保持。跟 STM32F423RH 對接時(shí)我一般這樣分配CS接 STM32 的任意 GPIO比如 PA4用硬件片選還是軟件片選后面細(xì)說。SCK接 SPI1_SCKPA5。SIMOSI接 SPI1_MOSIPA7。SOMISO接 SPI1_MISOPA6。WP和HOLD這兩個(gè)腳如果不需要硬件寫保護(hù)和暫停傳輸直接上拉到 VCC 即可別懸空懸空容易受干擾誤觸發(fā)。這里重點(diǎn)說硬件片選與軟件片選的取舍。STM32 的 SPI 外設(shè)自帶 NSS 硬件片選但實(shí)際項(xiàng)目里我?guī)缀醵加密浖x原因有三一是硬件 NSS 在多從機(jī)場景下管理麻煩二是軟件片選時(shí)序可控方便在 CS 拉低和第一個(gè)時(shí)鐘之間插入必要的建立時(shí)間三是調(diào)試時(shí)用邏輯分析儀抓波形軟件片選的電平變化一目了然。MR25H40CDF 要求 CS 建立時(shí)間最小 5ns保持時(shí)間最小 5ns軟件片選只要在拉低后加幾個(gè) NOP 或者微秒級延時(shí)完全滿足。PCB 布線這塊也有講究。SPI 時(shí)鐘跑到 20MHz 以上時(shí)走線要盡量短、等長SCK 和 MOSI 最好包地處理MISO 加個(gè) 22Ω 到 100Ω 的串聯(lián)電阻抑制反射。我遇到過一塊板子 SPI 跑 30MHz 時(shí)讀數(shù)據(jù)偶發(fā)錯(cuò)位最后查出來是 MISO 走線太長且沒端接加了 33Ω 電阻后波形干凈了問題消失。2.2 SPI 模式、時(shí)鐘極性與相位配置MR25H40CDF 支持 SPI Mode 0CPOL0, CPHA0和 Mode 3CPOL1, CPHA1。我習(xí)慣用 Mode 0因?yàn)榇蠖鄶?shù)邏輯分析儀和調(diào)試工具默認(rèn)就是 Mode 0抓波形方便。配置 STM32 的 SPI 時(shí)關(guān)鍵參數(shù)如下時(shí)鐘極性 CPOL 0空閑時(shí) SCK 為低電平。時(shí)鐘相位 CPHA 0數(shù)據(jù)在 SCK 第一個(gè)邊沿上升沿采樣。數(shù)據(jù)位寬8 位。MSB First高位先發(fā)MRAM 命令和地址都是 MSB 優(yōu)先。時(shí)鐘分頻根據(jù)實(shí)際布線質(zhì)量選我一般先用 4 分頻約 21MHz跑通再逐步提高到 2 分頻42MHz測試穩(wěn)定性。這里有個(gè)細(xì)節(jié)很多人忽略MR25H40CDF 的命令字節(jié)、地址字節(jié)、數(shù)據(jù)字節(jié)是在同一個(gè) CS 低電平周期內(nèi)連續(xù)傳輸?shù)摹R簿褪钦f你拉低 CS 之后先發(fā) 1 字節(jié)命令再發(fā) 3 字節(jié)地址24 位地址因?yàn)?512KB 需要 19 位但芯片按 24 位地址處理然后才是數(shù)據(jù)。中間不能拉高 CS否則命令作廢。用 HAL 庫的話要連續(xù)調(diào)用HAL_SPI_Transmit和HAL_SPI_Receive或者用HAL_SPI_TransmitReceive一次性搞定千萬別在中間插HAL_SPI_Transmit完就拉高 CS。2.3 命令集解析與讀寫時(shí)序拆解MR25H40CDF 的命令集不復(fù)雜常用的就幾條我整理成表格方便查閱命令名稱命令碼說明WREN0x06寫使能寫操作前必須發(fā)WRDI0x04寫禁止RDSR0x05讀狀態(tài)寄存器WRSR0x01寫狀態(tài)寄存器READ0x03讀數(shù)據(jù)WRITE0x02寫數(shù)據(jù)RDID0x9F讀器件 ID寫操作的完整時(shí)序是這樣的拉低 CS → 發(fā) WREN0x06→ 拉高 CS → 拉低 CS → 發(fā) WRITE0x02→ 發(fā) 3 字節(jié)地址 → 發(fā)數(shù)據(jù) → 拉高 CS。注意 WREN 和 WRITE 之間必須拉高一次 CS這是 MRAM 的寫保護(hù)機(jī)制跟 Flash 類似。讀操作就簡單了拉低 CS → 發(fā) READ0x03→ 發(fā) 3 字節(jié)地址 → 讀數(shù)據(jù) → 拉高 CS。狀態(tài)寄存器主要看 WEL寫使能鎖存和 WIP寫進(jìn)行中兩個(gè)位。MRAM 寫入極快WIP 位幾乎瞬間就清零但嚴(yán)謹(jǐn)起見寫完還是輪詢一下 RDSR 確認(rèn) WIP0 再繼續(xù)下一步尤其是在高頻連續(xù)寫入的場景下。注意RDID 命令讀回來的器件 IDMR25H40CDF 應(yīng)該是 0x18 開頭廠商代碼后面跟容量代碼。第一次調(diào)試時(shí)先讀 ID能讀到正確值說明 SPI 時(shí)序和接線都沒問題這是最快的自檢手段。3. STM32 端驅(qū)動實(shí)現(xiàn)與代碼落地3.1 CubeMX 配置與 SPI 初始化用 STM32CubeMX 配置 SPI1 是最省事的路徑。時(shí)鐘樹先把 APB2 配到 84MHz然后 SPI1 參數(shù)這樣設(shè)Mode 選 Full-Duplex MasterData Size 8 BitsCPOL LowCPHA 1 EdgeNSS 選 SoftwarePrescaler 先選 421MHzFirst Bit MSB。DMA 那邊給 SPI1_TX 和 SPI1_RX 各開一個(gè)通道優(yōu)先級設(shè) Medium 就行。生成代碼后SPI 初始化函數(shù)MX_SPI1_Init會自動生成。但 CubeMX 默認(rèn)不配置 CS 引腳需要手動在 GPIO 初始化里把 PA4 配成推挽輸出初始電平拉高。我習(xí)慣把 CS 操作封裝成宏#define MRAM_CS_LOW() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET) #define MRAM_CS_HIGH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)這樣代碼可讀性好換引腳只改宏定義。SPI 句柄用hspi1后面所有收發(fā)都基于它。3.2 底層讀寫函數(shù)封裝底層函數(shù)我分成三個(gè)寫使能、寫數(shù)據(jù)、讀數(shù)據(jù)。寫使能很簡單void MRAM_WriteEnable(void) { uint8_t cmd 0x06; MRAM_CS_LOW(); HAL_SPI_Transmit(hspi1, cmd, 1, 100); MRAM_CS_HIGH(); }寫數(shù)據(jù)函數(shù)要注意地址是 24 位的需要拆成 3 個(gè)字節(jié)發(fā)void MRAM_Write(uint32_t addr, uint8_t *buf, uint16_t len) { uint8_t cmd[4]; cmd[0] 0x02; cmd[1] (addr 16) 0xFF; cmd[2] (addr 8) 0xFF; cmd[3] addr 0xFF; MRAM_WriteEnable(); MRAM_CS_LOW(); HAL_SPI_Transmit(hspi1, cmd, 4, 100); HAL_SPI_Transmit(hspi1, buf, len, 1000); MRAM_CS_HIGH(); }讀數(shù)據(jù)函數(shù)類似只是命令碼換成 0x03發(fā)完地址后用HAL_SPI_Receive讀數(shù)據(jù)void MRAM_Read(uint32_t addr, uint8_t *buf, uint16_t len) { uint8_t cmd[4]; cmd[0] 0x03; cmd[1] (addr 16) 0xFF; cmd[2] (addr 8) 0xFF; cmd[3] addr 0xFF; MRAM_CS_LOW(); HAL_SPI_Transmit(hspi1, cmd, 4, 100); HAL_SPI_Receive(hspi1, buf, len, 1000); MRAM_CS_HIGH(); }這幾個(gè)函數(shù)跑通之后先做一次全片讀寫測試往地址 0 寫 256 字節(jié)遞增數(shù)據(jù)讀回來比對一致就說明底層沒問題。這個(gè)自檢步驟我每個(gè)項(xiàng)目都會做能提前暴露 90% 的硬件和時(shí)序問題。3.3 DMA 加速與高頻寫入優(yōu)化當(dāng)寫入頻次很高時(shí)用阻塞式HAL_SPI_Transmit會占 CPU。這時(shí)候上 DMA把數(shù)據(jù)搬運(yùn)交給硬件。以寫 256 字節(jié)為例配置好 DMA 后調(diào)用HAL_SPI_Transmit_DMACPU 立刻解放出來去干別的傳輸完成觸發(fā)回調(diào)再處理下一批。但 DMA 用在 MRAM 上有兩個(gè)坑要注意。第一DMA 傳輸期間 CS 必須保持低電平不能在傳輸完成前拉高所以 CS 的控制要放在 DMA 完成回調(diào)里而不是調(diào)用完發(fā)送函數(shù)就拉高。第二DMA 緩沖區(qū)的生命周期要管理好如果用的是局部數(shù)組函數(shù)返回后棧被回收DMA 還在搬運(yùn)就會讀到垃圾數(shù)據(jù)。我一般用全局靜態(tài)緩沖區(qū)或者內(nèi)存池分配確保 DMA 期間數(shù)據(jù)有效。實(shí)測下來21MHz SPI 時(shí)鐘配 DMA寫 256 字節(jié)耗時(shí)約 120 微秒其中大部分是 SPI 時(shí)鐘時(shí)間CPU 占用幾乎為零。對比阻塞方式CPU 要空轉(zhuǎn) 120 微秒在高頻采集場景下這個(gè)差距很致命。3.4 掉電保護(hù)與數(shù)據(jù)完整性設(shè)計(jì)工業(yè)現(xiàn)場掉電是常態(tài)數(shù)據(jù)完整性必須設(shè)計(jì)到位。我的做法是在 MRAM 里劃兩個(gè)區(qū)域參數(shù)區(qū)用雙備份加 CRC 校驗(yàn)日志區(qū)用環(huán)形緩沖加寫指針原子更新。參數(shù)區(qū)雙備份的邏輯是同一份參數(shù)存兩份每份帶一個(gè) CRC32 校驗(yàn)值。讀取時(shí)先讀 A 份CRC 對就用 A不對再讀 B 份CRC 對就用 B兩份都錯(cuò)就加載默認(rèn)參數(shù)。寫入時(shí)先寫 B 份校驗(yàn)通過后再寫 A 份這樣任何時(shí)刻掉電至少有一份是完整的。日志區(qū)的環(huán)形緩沖寫指針單獨(dú)存在一個(gè)固定地址每次寫日志前先寫數(shù)據(jù)再更新寫指針。因?yàn)?MRAM 單字節(jié)寫入是原子的不會寫到一半掉電導(dǎo)致半新半舊所以只要寫指針更新成功數(shù)據(jù)就一定完整。這個(gè)特性是 MRAM 相比 Flash 的巨大優(yōu)勢Flash 寫一頁掉電可能整頁報(bào)廢MRAM 不會。提示CRC 校驗(yàn)建議用查表法實(shí)現(xiàn)比逐位計(jì)算快一個(gè)數(shù)量級。STM32F423RH 有硬件 CRC 外設(shè)直接用它更省事配置好多項(xiàng)式后一個(gè)寄存器讀寫就出結(jié)果。4. 實(shí)操調(diào)試與常見問題排查4.1 從零到跑通的完整調(diào)試流程我把整個(gè)調(diào)試流程拆成六步按順序走基本不會翻車。第一步萬用表測通斷確認(rèn) VCC、GND、CS、SCK、SI、SO 六根線焊接無誤WP 和 HOLD 已上拉。第二步上電后用示波器看 SCK 空閑電平Mode 0 應(yīng)該是低Mode 3 應(yīng)該是高不對就改配置。第三步發(fā) RDID 命令讀器件 ID讀對了說明 SPI 基本通了。第四步單字節(jié)寫讀測試地址 0 寫 0xAA讀回來是 0xAA 就繼續(xù)。第五步多字節(jié)跨頁測試寫 256 字節(jié)遞增數(shù)據(jù)讀回比對。第六步高頻連續(xù)寫入壓力測試每秒寫 1000 次跑一小時(shí)看有沒有丟數(shù)據(jù)。這個(gè)流程里第三步和第四步是最關(guān)鍵的卡點(diǎn)。RDID 讀不對八成是 SPI 模式或接線問題單字節(jié)讀寫不對多半是 WREN 和 WRITE 之間的 CS 時(shí)序沒處理好。4.2 典型問題速查表下面這張表是我和團(tuán)隊(duì)這些年踩過的坑的總結(jié)遇到問題先查表能省大量時(shí)間現(xiàn)象可能原因排查方法解決方案讀回全 0xFFMISO 未接或 CS 未拉低示波器看 MISO 波形檢查接線和 CS 控制讀回全 0x00SCK 無輸出或模式錯(cuò)誤示波器看 SCK檢查 SPI 配置和時(shí)鐘使能寫入后讀回舊數(shù)據(jù)WREN 未發(fā)或 CS 時(shí)序錯(cuò)邏輯分析儀抓完整時(shí)序確保 WREN 和 WRITE 間 CS 拉高偶發(fā)數(shù)據(jù)錯(cuò)位SPI 時(shí)鐘過快或走線差降低時(shí)鐘測試降頻或加端接電阻高溫下讀寫失敗電源紋波大或去耦不足測 VCC 紋波加 0.1uF 和 10uF 去耦電容DMA 傳輸數(shù)據(jù)錯(cuò)緩沖區(qū)被回收檢查緩沖區(qū)生命周期改用全局或靜態(tài)緩沖區(qū)4.3 幾個(gè)只有實(shí)操才知道的避坑經(jīng)驗(yàn)第一個(gè)經(jīng)驗(yàn)MRAM 的 WP 引腳如果不用一定要上拉到 VCC不能懸空。我有個(gè)項(xiàng)目因?yàn)?WP 懸空在電機(jī)干擾下偶爾被拉低導(dǎo)致寫保護(hù)誤觸發(fā)數(shù)據(jù)寫不進(jìn)去查了三天才定位到。第二個(gè)經(jīng)驗(yàn)SPI 時(shí)鐘不是越高越好。理論上 MR25H40CDF 支持 40MHz但實(shí)際能不能跑穩(wěn)取決于 PCB 布線和線纜長度。我的做法是從 10MHz 開始每次翻倍測試找到穩(wěn)定上限后再降一檔使用留足余量。工業(yè)現(xiàn)場溫度變化大留余量比跑極限靠譜。第三個(gè)經(jīng)驗(yàn)連續(xù)寫入時(shí)每寫一批數(shù)據(jù)后插一個(gè)微小延時(shí)比如 1 微秒給 MRAM 內(nèi)部狀態(tài)機(jī)一點(diǎn)喘息時(shí)間。雖然手冊說不需要但實(shí)測在高頻連續(xù)寫入時(shí)插入微延時(shí)能顯著降低偶發(fā)錯(cuò)誤率可能是電源瞬態(tài)或者內(nèi)部時(shí)序裕量的原因。第四個(gè)經(jīng)驗(yàn)調(diào)試階段一定要用邏輯分析儀抓完整時(shí)序不要只看代碼邏輯。SPI 的問題 90% 出在時(shí)序上代碼看著對波形不一定對。一個(gè)幾百塊的邏輯分析儀能省下無數(shù)調(diào)試時(shí)間。5. 性能實(shí)測與場景擴(kuò)展思考5.1 實(shí)測性能數(shù)據(jù)在 21MHz SPI 時(shí)鐘、DMA 傳輸、STM32F423RH 主頻 84MHz 的條件下我實(shí)測了幾組數(shù)據(jù)單字節(jié)寫入耗時(shí)約 2 微秒含 CS 操作和 WREN256 字節(jié)塊寫入約 120 微秒讀取 256 字節(jié)約 115 微秒。連續(xù)寫入 100 萬次無一次錯(cuò)誤跑了一整夜。對比之前用 NOR Flash 的方案同樣的寫入量Flash 需要幾毫秒一頁而且寫幾萬次就開始出現(xiàn)壞塊MRAM 的優(yōu)勢是碾壓性的。功耗方面MRAM 寫入電流比 Flash 略高但寫入時(shí)間極短總體能耗反而更低。讀操作功耗很低適合電池供電的工業(yè)傳感器節(jié)點(diǎn)。5.2 這套方案還能怎么擴(kuò)展這套 SPI MRAM 的架構(gòu)其實(shí)不局限于 STM32F423RH。換成 STM32H7 系列SPI 時(shí)鐘能拉到更高性能還能再上一個(gè)臺階換成國產(chǎn)主控只要 SPI 外設(shè)兼容底層驅(qū)動改改引腳定義就能移植。MRAM 容量不夠時(shí)可以多片級聯(lián)用不同的 CS 引腳片選軟件上做個(gè)地址映射層上層業(yè)務(wù)無感知。再往大了說這種高頻、掉電安全、寬溫的存儲方案在工業(yè)數(shù)據(jù)記錄儀、電力監(jiān)測終端、車載黑匣子、醫(yī)療設(shè)備參數(shù)存儲等場景都能直接套用。核心思路就一條用 MRAM 的物理特性解決高頻寫入和掉電完整性問題用 SPI 的簡單接口降低開發(fā)和移植成本。這套組合我在三個(gè)不同行業(yè)的項(xiàng)目里都用過穩(wěn)定性和開發(fā)效率都經(jīng)得起考驗(yàn)。最后分享一個(gè)我在實(shí)際項(xiàng)目里的小技巧把 MRAM 的讀寫函數(shù)再包一層帶重試的接口任何一次讀寫失敗自動重試三次三次都失敗才上報(bào)錯(cuò)誤。工業(yè)現(xiàn)場偶發(fā)的干擾導(dǎo)致的單次失敗靠重試基本都能救回來系統(tǒng)穩(wěn)定性提升非常明顯。這個(gè)重試機(jī)制配合 CRC 校驗(yàn)基本能做到數(shù)據(jù)零丟失。