尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

工业嵌入式存储选型:MR25H40CDF MRAM与PIC18F86K22驱动实战

工业嵌入式存储选型:MR25H40CDF MRAM与PIC18F86K22驱动实战 1. 为什么在工业场景里我会优先考虑 MR25H40CDF 而不是传统 EEPROM做嵌入式这行十几年存储方案选型这件事踩过的坑比调通的串口还多。早些年做工业数据采集板EEPROM 加铁电存储器FRAM的组合用了不少后来接触到 MRAM 之后很多场景的选型思路就变了。MR25H40CDF 这颗芯片是 Everspin 出的 4Mbit 串行 MRAMSPI 接口工作电压 2.7V 到 3.6V工业级温度范围覆盖 -40°C 到 85°C部分批次能到 105°C。它最吸引我的地方在于写入不需要擦除、没有写入延迟、擦写寿命几乎无限、断电数据保持二十年以上。这几个特性放在工业现场基本就是降维打击。先说说为什么工业场景对存储的要求跟消费电子完全不是一回事。消费电子里数据丢了顶多用户骂两句重启一下重新配置就行。但工业设备不一样一台设备可能装在偏远地区的配电柜里或者装在振动、高温、强电磁干扰的产线上维护人员半年才去巡检一次。这种场景下存储器件要满足几个硬指标第一写入必须可靠不能因为突然断电就丢数据第二擦写寿命要够因为工业设备可能每分钟都在记录运行参数一天下来写入次数轻松上万第三温度范围要宽夏天柜内温度五六十度是常态第四接口要简单SPI 这种四线接口在布线和隔离上都很友好。传统方案里EEPROM 擦写寿命大概在 100 万次左右写入周期 5ms 上下而且必须按页擦除再写入。FRAM 虽然写入快、寿命高但容量普遍偏小价格也不便宜。NOR Flash 容量大、成本低但擦除块大、写入慢、寿命只有十万次量级。MRAM 恰好卡在一个很舒服的位置容量够用512KB 对于参数存储和日志记录绰绰有余、写入速度接近 SRAM、寿命以亿次计、不需要擦除操作。我第一次把 MR25H40CDF 用在某款工业温控器上时最直观的感受就是固件里那套“先读-改-擦-写”的复杂逻辑全可以扔掉了直接往目标地址写就行代码量少了三分之一。这里要特别提一下 MR25H40CDF 的 SPI 接口特性。它支持 SPI 模式 0 和模式 3最高时钟频率 40MHz指令集跟标准 SPI Flash 很像有读状态寄存器、写状态寄存器、读数据、写数据、写使能等命令。但跟 Flash 不同的是它没有扇区擦除和块擦除命令因为 MRAM 的存储单元是基于磁隧道结的写入就是改变磁化方向不需要先擦到全 1 再写。这个差异在驱动开发时非常关键如果你拿现成的 SPI Flash 驱动直接套用会发现擦除命令发过去没反应然后就开始怀疑硬件焊接问题实际上是指令集不匹配。还有一个容易被忽略的点MR25H40CDF 的写操作是字节级随机的没有页边界限制。SPI Flash 通常要求一次写入不能跨页256 字节跨页就得拆成多次写。MRAM 没这个约束你从任意地址开始连续写多少字节都行只要不超过芯片容量。这在记录变长数据包的时候特别省心不用在固件里做地址对齐和分页处理。从系统架构角度看用 MR25H40CDF 做数据存储MCU 这边只需要一个 SPI 外设加一根片选 GPIO 就能跑起来。PIC18F86K22 这颗 8 位 MCU 虽然年代不算新但胜在稳定、外设齐全、工业现场大量在用它的 MSSP 模块可以配置成 SPI 主模式时钟极性、相位、速率都可以通过寄存器设置。两者搭配一个负责逻辑控制和数据处理一个负责可靠存储分工很清晰。下面我会从硬件连接、SPI 时序配置、驱动编写、数据管理策略、异常处理这几个维度把整套方案拆开讲透。2. PIC18F86K22 的 MSSP 模块配置与 SPI 时序对齐2.1 MSSP 寄存器组的初始化顺序PIC18F86K22 的 SPI 功能挂在 MSSPMaster Synchronous Serial Port模块上涉及的核心寄存器有 SSPCON1、SSPCON2、SSPSTAT、SSPADD、SSPBUF、TRISC 和 TRISA。很多人初始化 SPI 的时候顺序搞反导致时钟出不来或者数据错位。我习惯的顺序是这样的先配置端口方向把 SCK、SDO 设为输出SDI 设为输入片选引脚也设为输出并置高然后写 SSPSTAT 设置时序模式接着写 SSPCON1 选择 SPI 主模式、时钟极性最后根据系统时钟算 SSPADD 的值来定波特率。具体到寄存器位SSPSTAT 的 SMP 位决定采样时刻CKE 位决定时钟边沿。SPI 模式 0 对应 CKE0、CKP0数据在时钟上升沿采样、下降沿变化模式 3 对应 CKE1、CKP1数据在下降沿采样、上升沿变化。MR25H40CDF 两种模式都支持我一般选模式 0因为大部分 SPI 从设备默认都是模式 0调试的时候用逻辑分析仪抓波形也容易对照。SSPCON1 的低四位是 SSPM3:SSPM0设成 0b0000 就是 SPI 主模式时钟由 SSPADD 决定。这里有个计算公式Fosc 是系统时钟频率SPI 时钟频率 Fosc / (4 * (SSPADD 1))。假设 PIC18F86K22 跑在 64MHz通过 PLL 倍频要得到 10MHz 的 SPI 时钟SSPADD 应该设为 64M / (4 * 10M) - 1 0.6取整就是 0实际得到 16MHz。如果要更精确的 10MHz可以先把系统时钟降到 40MHzSSPADD 设为 0得到 10MHz。这个计算在数据手册的 SPI 章节有详细说明但很多人直接抄例程里的值换了个晶振就不对了。注意PIC18F86K22 的 SPI 主模式最高时钟是 Fosc/4不是随便设的。如果你需要 40MHz 的 SPI 时钟去匹配 MR25H40CDF 的极限速率MCU 这边得跑到 160MHz这显然不现实。实际项目中我一般把 SPI 时钟设在 8MHz 到 16MHz 之间对 MRAM 来说完全够用因为它的写入没有延迟瓶颈不在时钟上。2.2 片选信号的处理硬件片选还是软件片选SPI 协议里片选信号CS的管理方式有两种硬件片选和软件片选。硬件片选是指 MCU 的 SPI 外设自动控制 CS 引脚软件片选是用普通 GPIO 手动拉低拉高。PIC18F86K22 的 MSSP 模块在 SPI 主模式下不自动控制片选所以只能用软件片选。这其实更灵活因为你可以在一根 SPI 总线上挂多个从设备每个设备用独立的 GPIO 做片选。软件片选的关键在于时序拉低 CS 之后要等一小段时间再发时钟拉高 CS 之前要确保最后一个时钟周期完成。MR25H40CDF 对 CS 的建立时间和保持时间有要求数据手册里写的是 CS 下降沿到第一个 SCK 上升沿至少 5ns最后一个 SCK 下降沿到 CS 上升沿至少 5ns。在 16MHz SPI 时钟下一个时钟周期 62.5ns5ns 的裕量很充足正常 GPIO 操作都能满足。但如果你在中断里操作 SPI要小心 GPIO 翻转被中断打断导致 CS 提前拉高或者拉低时间不够。我一般的做法是把片选操作封装成宏比如MRAM_CS_LOW()和MRAM_CS_HIGH()在读写函数开头和结尾调用。同时在这两个宏之间关掉全局中断防止时序被破坏。虽然关中断会影响实时性但一次 MRAM 读写最多几十微秒对大多数工业控制任务来说可以接受。2.3 SPI 时钟极性与相位的实测验证理论配置完之后一定要用逻辑分析仪或者示波器抓一下波形。我见过太多案例是寄存器配置看起来没问题但实际波形跟从设备要求对不上。验证方法很简单发一个已知的字节比如 0x55二进制 01010101看 MOSI 线上的波形是不是在时钟的对应边沿上稳定。如果数据在时钟上升沿变化而不是采样说明 CKE 位设反了如果时钟空闲电平是高而不是低说明 CKP 位设反了。MR25H40CDF 的数据手册里明确写了支持模式 0 和模式 3我建议先用模式 0 调通因为模式 0 的时序图最直观CS 拉低后时钟从低电平开始第一个上升沿采样第一个数据位。调通之后再尝试模式 3看看有没有性能差异。实测下来两种模式在 16MHz 下读写速度没有明显区别但模式 0 的代码在移植到其他 SPI 设备时兼容性更好。还有一个细节PIC18F86K22 的 SDI 引脚在 SPI 主模式下是输入但如果你把对应的 TRIS 位设成输出读回来的数据永远是 0xFF 或者 0x00。这个坑我在早期项目中踩过查了半天以为是 MRAM 没响应结果是自己把输入引脚配成了输出。所以初始化的时候一定要仔细核对 TRISC 的 bit4SDI和 bit3SCK、bit5SDO的方向。3. MR25H40CDF 的指令集与读写操作实战3.1 核心指令解析从 WREN 到 READMR25H40CDF 的指令集不复杂常用的就几条WREN写使能0x06、WRDI写禁止0x04、RDSR读状态寄存器0x05、WRSR写状态寄存器0x01、READ读数据0x03、WRITE写数据0x02。跟 SPI Flash 相比少了 WREN 之后的擦除命令多了直接写入的能力。写操作的流程是拉低 CS发送 WREN 指令拉高 CS再次拉低 CS发送 WRITE 指令接着发送 24 位地址MR25H40CDF 是 4Mbit 容量需要 19 位地址但指令格式是 24 位地址高 5 位忽略然后连续发送要写入的数据字节最后拉高 CS。注意 WREN 和 WRITE 之间必须有一次 CS 的上升沿这是很多新手容易漏掉的步骤。如果 WREN 之后不拉高 CS 就直接发 WRITE芯片不会执行写入。读操作更简单拉低 CS发送 READ 指令发送 24 位地址然后连续读取数据每个时钟周期输出一位最后拉高 CS。读操作不需要 WREN也不需要等待状态寄存器。状态寄存器的 bit0 是 WIPWrite In ProgressMRAM 的写入速度极快通常几十纳秒就完成了所以 WIP 位几乎永远是 0。但为了代码的健壮性我建议在每次写入后还是读一下状态寄存器确认 WIP 为 0 再进行下一步操作。这个习惯在换用其他存储器件时也能沿用。3.2 地址边界与跨页写入的处理前面提到 MRAM 没有页边界限制但这不代表地址可以无限递增。MR25H40CDF 的容量是 512KB地址范围从 0x00000 到 0x7FFFF。如果你从 0x7FFFF 开始写多个字节地址会自动回卷到 0x00000。这个行为在数据手册里有说明但实际项目中要避免依赖回卷因为回卷后的数据会覆盖起始区域的内容。我在固件里通常会做一个地址范围检查如果当前写入地址加上数据长度超过了芯片容量就把数据拆成两段一段写到末尾一段写到开头或者直接返回错误让上层处理。对于参数存储这种场景我一般会把参数区固定在低地址段日志区放在高地址段中间留一段保留区这样即使日志区写满回卷也不会影响到参数区。另外虽然 MRAM 支持字节级随机写入但连续写入时地址递增是最高效的方式。如果需要在多个不连续的地址写入数据每次都要重新发 WRITE 指令和地址这会增加 CS 翻转次数和指令开销。在时间敏感的场合可以把要写的数据先在 RAM 里组织好然后一次性连续写入。3.3 写保护机制与状态寄存器配置MR25H40CDF 的状态寄存器里有 BP0 和 BP1 两位用来设置块保护。默认情况下这两位是 0整个存储区可写。如果你把 BP0 设为 1高 1/4 的地址段会被写保护BP1 和 BP0 组合可以保护高 1/2 或整个芯片。这个功能在工业场景里很有用比如把固件配置参数放在受保护的区域防止程序跑飞时误写。设置写保护的流程是发 WREN然后发 WRSR 指令接着发送状态寄存器的新值最后拉高 CS。注意 WRSR 也需要 WREN 前置。写保护生效后对受保护区域的写入操作会被芯片忽略但不会报错读操作不受影响。所以调试的时候如果发现写不进去先读一下状态寄存器看看 BP 位是不是被设上了。我个人的习惯是在产品出厂测试阶段把关键参数区设为写保护现场运行时如果需要修改参数先发指令解除保护改完再重新保护。这样既保证了参数安全又保留了现场可维护性。不过要注意状态寄存器的写入次数也是有限的虽然 MRAM 的存储单元寿命很高但状态寄存器里的配置位是基于 CMOS 锁存器的反复写也没问题但没必要频繁操作。4. 基于 PIC18F86K22 的驱动层设计与数据管理策略4.1 底层驱动函数的封装思路驱动层我一般分成三层硬件抽象层、指令层、应用层。硬件抽象层负责 SPI 字节收发和片选控制指令层负责封装 MRAM 的各种命令应用层负责数据组织和业务逻辑。这样分层的好处是如果以后换用其他 SPI 存储器件只需要改指令层应用层代码基本不动。硬件抽象层的核心函数是SPI_ExchangeByte(uint8_t data)它把数据写入 SSPBUF等待 BFBuffer Full标志置位然后读取 SSPBUF 返回接收到的字节。这个函数在 PIC18F86K22 上的实现要注意写入 SSPBUF 之前要确保前一次传输已完成否则会覆盖未发送的数据。我通常会在函数开头加一个while(!SSPSTATbits.BF)的等待但更稳妥的做法是检查 SSPCON1 的 WCOLWrite Collision位如果发生了写冲突说明时序有问题需要重新初始化 SPI。指令层的函数包括MRAM_WriteEnable()、MRAM_ReadStatus()、MRAM_WriteData(uint32_t addr, uint8_t *buf, uint16_t len)、MRAM_ReadData(uint32_t addr, uint8_t *buf, uint16_t len)。每个函数内部处理 CS 的拉低拉高和指令发送。这里有个经验把地址拆成三个字节发送时要注意高低位顺序。MR25H40CDF 的地址是 MSB 优先先发地址的 bit23 到 bit16再发 bit15 到 bit8最后发 bit7 到 bit0。虽然芯片只用到 19 位地址但高 5 位也要发通常填 0。4.2 参数存储区的数据结构设计工业设备里参数存储通常需要满足几个需求参数有默认值、参数可以单独修改、参数有版本号、参数有校验。我在 MR25H40CDF 里划出一块 4KB 的区域做参数区结构是这样的前 16 字节是头部包含魔数4 字节、版本号2 字节、参数数量2 字节、头部校验2 字节、保留6 字节后面是参数条目每个条目包含参数 ID2 字节、数据类型1 字节、数据长度1 字节、数据值变长、条目校验1 字节。这种结构的好处是扩展性强增加参数只需要在末尾追加条目不需要改动已有布局。读取的时候先校验头部魔数和校验和然后遍历条目根据参数 ID 查找目标参数。写入的时候先读取整个参数区到 RAM修改对应条目的数据值和校验然后整块写回。虽然 MRAM 支持字节级写入但整块写回可以保证数据的一致性避免写到一半断电导致参数区损坏。提示参数区的校验我推荐用 CRC-16 而不是简单的累加和。累加和对于字节顺序变化不敏感CRC-16 能检测出更多类型的错误。PIC18F86K22 没有硬件 CRC 模块但软件查表法计算 4KB 数据的 CRC-16 只需要几毫秒对启动时间影响很小。4.3 日志区的环形缓冲与磨损均衡日志记录是工业设备的核心功能之一。MR25H40CDF 的擦写寿命虽然极高但合理的数据管理策略仍然重要。我在日志区采用环形缓冲结构把日志区划分为固定大小的记录块比如每条日志 64 字节日志区总大小 256KB可以存 4096 条记录。维护一个写指针每次写入新日志时指针递增写到末尾就回卷到开头。环形缓冲的关键是记录有效性判断。我在每条日志的头部加一个序列号4 字节和一个状态标志1 字节。状态标志有“有效”“无效”“正在写入”三种。写入新日志时先把状态设为“正在写入”写完后改为“有效”。如果写入过程中断电下次上电时发现状态是“正在写入”就把这条记录标记为“无效”跳过它继续写。读取日志时从写指针往前遍历遇到“有效”记录就读取遇到“无效”记录就停止。这样可以保证读出来的日志是按时间顺序排列的。序列号用来处理回卷后的排序问题当写指针回卷后新记录的序列号继续递增读取时按序列号排序而不是按物理地址排序。磨损均衡方面MRAM 其实不需要像 Flash 那样做复杂的均衡算法因为它的写入寿命是无限的。但为了数据安全我还是建议不要把频繁写入的数据固定在一个地址。环形缓冲天然实现了磨损均衡因为写指针在循环移动每个物理块的写入次数是均匀的。5. 工业现场的数据可靠性保障与异常处理5.1 电源跌落时的数据完整性工业现场最怕的就是突然断电。MRAM 的写入速度极快通常在几十纳秒内完成所以只要电源跌落发生在写入完成之后数据就是安全的。但如果电源跌落正好发生在写入过程中会不会导致数据损坏MR25H40CDF 的数据手册里写了芯片内部有电压监测电路当 VDD 低于某个阈值时会自动终止正在进行的写操作并保护已写入的数据。这个阈值通常在 2.0V 左右具体值可以查手册的电气特性章节。不过芯片级的保护只能保证存储单元不被误写不能保证上层逻辑的一致性。比如你正在更新参数区的某个条目写到一半断电了参数区的校验和就对不上了。所以我在固件里加了一个“事务”机制更新参数时先把新数据写到一个备份区写完后更新一个事务标志然后再把备份区的数据复制到主参数区最后清除事务标志。如果上电时发现事务标志是“进行中”就从备份区恢复数据。这个机制虽然增加了写入次数但 MRAM 的寿命完全扛得住。5.2 SPI 通信错误的检测与恢复SPI 通信在工业现场容易受到电磁干扰导致数据位翻转或者时钟异常。检测通信错误的方法有几种一是读回校验写入数据后立即读回比较二是在数据包末尾加 CRC 校验三是利用 MRAM 的状态寄存器如果写入被拒绝状态寄存器的 WELWrite Enable Latch位会保持为 0。我一般在关键数据写入后做一次读回校验。如果校验失败就重试写入最多重试三次。三次都失败就记录一个错误标志让上层决定是否报警。对于日志数据因为写入频率高每次都读回校验会影响性能所以我在日志记录里加 CRC-8 校验读取的时候校验写入的时候不校验。这样在读取阶段发现错误可以跳过损坏的记录。SPI 通信恢复方面如果发现 SPI 完全无响应比如读回来的数据全是 0xFF 或者 0x00首先要检查片选信号是否正常然后检查时钟是否输出。PIC18F86K22 的 MSSP 模块在发生写冲突后会进入异常状态需要清除 SSPCON1 的 SSPEN 位再重新置位来复位 SPI 状态机。我通常会在通信错误处理函数里加一个SPI_Reset()重新初始化 MSSP 寄存器然后重新尝试通信。5.3 温度漂移对 MRAM 读写的影响MR25H40CDF 的工业级温度范围是 -40°C 到 85°C在这个范围内读写操作都是可靠的。但极端温度下SPI 时序参数会发生变化。比如在 -40°C 时芯片的响应速度可能变慢如果 SPI 时钟太快建立时间和保持时间可能不够。我在低温测试中发现16MHz 的 SPI 时钟在 -40°C 下偶尔会出现读数据错误降到 8MHz 就稳定了。所以如果你的产品要在宽温范围工作建议在低温环境下做一次 SPI 时钟裕量测试。方法很简单把设备放到温箱里从常温降到 -40°C保持一小时然后连续读写 MRAM 并校验数据。如果发现错误率上升就降低 SPI 时钟频率。高温环境下MRAM 的写入电流会略微增加但 MR25H40CDF 的内部电荷泵能自动调节不需要额外处理。另外PCB 布局对温度稳定性也有影响。SPI 走线太长、太细在温度变化时阻抗会变化导致信号反射。我一般把 MRAM 放在离 MCU 尽量近的位置走线长度控制在 5cm 以内SCK 和 MOSI 之间加地线隔离。如果实在放不下就在 SCK 线上串一个 22Ω 到 33Ω 的电阻抑制反射。6. 从原型到量产几个容易被忽视的工程细节6.1 上拉电阻与片选信号的默认状态MR25H40CDF 的 CS 引脚内部没有上拉电阻如果 MCU 复位期间 GPIO 处于高阻态CS 可能浮空导致芯片被意外选中。虽然 SPI 时钟没有输出时即使 CS 被拉低也不会有数据写入但浮空的 CS 会增加功耗还可能引入噪声。所以我在 CS 引脚上接一个 10kΩ 的上拉电阻到 VDD确保默认状态是未选中。同样SCK 和 MOSI 引脚也建议加上拉或下拉具体取决于你的 SPI 模式。模式 0 下SCK 空闲是低电平所以 SCK 可以加下拉MOSI 空闲状态无所谓但加上拉可以避免浮空。SDI 是 MRAM 的输出MCU 的输入不需要额外处理。6.2 电源去耦与写入电流需求MRAM 在写入瞬间的电流需求比读取时大。MR25H40CDF 的写入电流典型值是 15mA峰值可能到 25mA。如果电源去耦不充分写入时 VDD 会瞬间跌落可能导致写入失败或者芯片复位。我在 VDD 引脚旁边放一个 0.1μF 的陶瓷电容和一个 1μF 的钽电容两者并联陶瓷电容负责高频去耦钽电容负责储能。如果设备里有多颗 MRAM 或者其他大电流器件建议在电源入口再加一个 10μF 的电解电容。PCB 布局上去耦电容要尽量靠近 MRAM 的 VDD 和 GND 引脚走线要短而粗。我见过一个案例去耦电容放在板子另一头结果写入时 VDD 跌落到 2.5V 以下写入成功率只有 70%。把电容移到芯片旁边后问题立刻消失。6.3 批量生产时的测试与校准量产阶段每块板子都要测试 MRAM 的读写功能。我一般写一个简单的测试固件往 MRAM 的所有地址写入递增模式比如 0x00, 0x01, 0x02...然后读回比较。这个测试可以发现焊接不良、引脚短路、芯片损坏等问题。测试时间取决于 SPI 时钟和 MRAM 容量512KB 的数据在 16MHz SPI 下大约需要 0.5 秒写入0.5 秒读取总共 1 秒左右对产线节拍影响不大。如果产品支持现场固件升级还要测试 MRAM 在升级过程中的数据保持能力。我的做法是在升级前把关键参数备份到 MRAM 的保留区升级完成后从保留区恢复。这样即使升级失败参数也不会丢失。保留区的大小根据参数数量决定一般 4KB 到 8KB 就够了。还有一个细节MR25H40CDF 的批次之间可能存在微小的时序差异虽然都在数据手册规格内但在极端条件下可能表现不同。我在小批量试产时会抽几颗不同批次的芯片做高低温测试确认时序裕量足够。如果发现某个批次在低温下需要降低 SPI 时钟就在固件里加一个温度补偿逻辑根据板载温度传感器调整 SPI 分频系数。7. 实际项目中的性能实测与优化记录7.1 读写速度的实测数据我在一块 PIC18F86K22 加 MR25H40CDF 的测试板上做了完整的性能测试。MCU 系统时钟 64MHzSPI 时钟 16MHz测试内容是连续写入 64KB 数据然后读回校验。实测结果写入 64KB 耗时约 32ms平均写入速度 2MB/s读取 64KB 耗时约 32ms平均读取速度 2MB/s。这个速度受限于 SPI 时钟因为每个字节需要 8 个时钟周期16MHz 下理论极限是 2MB/s实测基本跑满。如果把 SPI 时钟降到 8MHz写入和读取时间都翻倍到 64ms速度 1MB/s。对于参数存储和日志记录来说1MB/s 已经绰绰有余。我算过一笔账一条日志 64 字节1MB/s 意味着每秒可以写 16000 条日志实际工业场景中每秒最多几十条所以性能完全不是瓶颈。7.2 功耗表现与低功耗模式MR25H40CDF 的读取电流典型值 5mA写入电流 15mA待机电流 10μA。对于电池供电的工业传感器待机功耗很关键。PIC18F86K22 有休眠模式休眠时电流可以降到微安级。如果 MRAM 不需要频繁访问可以在休眠前把 CS 拉高MRAM 会自动进入待机模式电流降到 10μA。我做过一个低功耗数据记录器的项目MCU 每 10 秒唤醒一次采集数据写入 MRAM然后继续休眠。实测平均电流 50μA用一节 2000mAh 的锂亚电池可以运行 4 年以上。这个项目里 MRAM 的快速写入特性帮了大忙MCU 唤醒后只需要 1ms 就能完成数据写入然后立刻回到休眠大大缩短了高功耗时间。7.3 长期运行的数据保持验证MRAM 的数据保持能力是 20 年但这是常温下的指标。高温会加速磁化衰减所以我在 85°C 环境下做了加速老化测试。方法是在 MRAM 里写入已知模式然后放在 85°C 温箱里保持 1000 小时取出后读回比较。1000 小时的高温老化相当于常温下数年的保持时间测试结果全部通过没有出现数据丢失或位翻转。这个测试让我对 MRAM 在工业环境下的可靠性有了信心。不过要注意数据保持测试要在断电状态下进行因为通电时芯片内部的刷新电路会维持数据。如果你要做类似的验证记得把设备完全断电后再放入温箱。8. 写在最后一些零散但实用的经验做嵌入式存储方案这些年我最大的体会是选型阶段多花一天时间研究数据手册调试阶段就能少熬三个通宵。MR25H40CDF 和 PIC18F86K22 这套组合硬件上简单直接软件上分层清晰工业现场跑个五到八年基本不用操心。但前提是你把时序配置对了、把片选管好了、把电源去耦做足了。如果你正在用 SPI Flash 的方案遇到擦写寿命不够、写入延迟太大、断电丢数据这些问题可以认真考虑换成 MRAM。迁移成本主要在驱动层应用层的数据结构基本不用动。我最近在做一个新项目把原来的 SPI Flash 换成 MR25H40CDF驱动代码改了两天测试跑了一周现在已经在小批量试产了。还有一点MRAM 的价格比 SPI Flash 贵不少所以选型时要算清楚账。如果你的设备只需要存一次配置参数一辈子写不了几次那 SPI Flash 完全够用。但如果你的设备需要频繁记录数据、要求断电不丢、工作环境恶劣那 MRAM 多出来的成本绝对值得。我一般用这个标准来判断如果存储器的擦写寿命除以预估的日均写入次数小于设备设计寿命那就该考虑 MRAM 了。
返回列表