如何保护 SD 卡免受意外电源故障的影响?

电器工程 力量 sd
2022-01-03 22:56:51

我正在开发使用 Microchip MDDFS 库将数据存储到 SD 卡的设备。记录器将以每分钟 1 个条目(56 字节)的最大速率记录数据。问题是设备可能随时断电,可能是在写入序列的中间。我想知道保护我的数据免受损坏的最佳方法是什么。我发现如果在断电时打开文件,则在上次关闭文件后写入文件的所有数据都会丢失。我不知道如果在写入序列的中间断电,是否也是如此。

由于写入过程不经常发生,我可以打开文件,写入数据,然后关闭文件,每次记录数据。这种方法会随着时间的推移损坏 SD 卡吗?

另一种方法可能是保持文件打开,但在每 10 或 50 次写入后,我可以关闭文件然后重新打开它。

我也可以在内存中缓冲数据,然后偶尔刷新数据,可能在一个 kbyte 左右之后。

我的最后一个想法是,在我的电路中,我可以添加一个大电容器,以便在断开电源后足够长的时间为我的 pic/sd 卡供电以快速关闭文件。这种方法的问题是关闭文件和/或保存数据所需的时间非常不一致。据我了解,这个时间可能非常取决于文件所在的闪存页面中的当前位置。

无论如何,你们有什么建议?

4个回答

将数据写入文件时可能会发生一些事情。我将描述为了数据安全而需要发生的顺序,不一定是库调用。

当您写入并添加到文件末尾时(正常写入模式),您将文件的最后一个块读入内存,用您的写入数据对其进行修改,然后将整个块写回 SD 卡. 如果块已满,则必须在文件分配表 (FAT) 中找到一个新块。找到新块后,必须更新 FAT,这是一个读-修改-写循环。如果我们完成了文件,那么我们需要更新根目录中的文件属性(例如文件长度),这会导致另一个读取-修改-写入循环。

减少你的写作时间

  • 确保在写入扇区时文件已经保存了您的数据。如果您从一个大文件开始并覆盖数据而不是附加数据,则只要 SD 卡扇区写入完成,数据就会安全。您可以通过这种方式消除一到两个读取-修改-写入周期。我的启动代码会以扇区增量将 0 写入文件,直到 SD 卡已满,然后倒回到文件的开头。

  • 调整数据条目的大小,使整数个条目适合一个扇区。我会将您的条目增加到 64 个字节。虽然这效率较低,但它会阻止您需要读取-修改-写入两个扇区。

  • 创建允许您写入整个扇区的 FSwrite 函数的变体。如果您将整个扇区保留在 SRAM 中,那么您的周期会从“读取-修改-写入”变为“修改-写入”

尽可能长时间保持 PIC 和 SD 电源开启

  • 大电容就好了。470uF 应该给你足够的能量来完成一个写周期。

  • 确保您的电源不会从备用电容器中吸取电力!如有必要,添加一个二极管。

知道你什么时候没电了

  • 一个大的电源上限会给你 10 毫秒或更多的时间来用 SD 卡包装东西,但不要按你的运气。使用微控制器上的引脚来查看您的电源是否仍然良好,如果您的电源已死,请不要开始写入。

SD 卡(或 MMC、CompactFlash 等)尚未提及的一个问题是,虽然 SD 卡在主机看来可能是 512 字节扇区的简单集合,可以以任意顺序读取和写入,但闪存设备通常将 528 字节的页面分组存储,每组 32KB,并且唯一支持的操作是写入其他空白页面,或擦除整个组。为了解决这个限制,SD 卡上的控制器将保留一个表,该表允许将任何逻辑扇区映射到任何物理页面。当请求写入一个扇区时,控制器会在芯片的某处找到一个空白页,并使用相关扇区的新地址更新映射。如果空白页变得稀缺,或者在其他不同的时间,

这样做的意义在于,写入特定逻辑扇区的行为可能需要对来自许多逻辑扇区的数据进行混洗。如果在该过程中出现问题,则可能导致任意扇区损坏,而不仅仅是要求卡写入的扇区。一个好的 SD 卡控制器应该被设计为执行数据洗牌操作,如果在数据洗牌过程中断电,它将能够确定哪些部分操作已经完成,哪些部分没有完成,并且因此能够正确完成操作。不幸的是,我不知道如何判断在折扣店购买的 5 美元 SD 卡在这方面是否有用。

可以肯定的是,即使从确保报告为已完成的每个写入操作实际上将在电源故障(即确保所有工作是否写入会导致已完成,已完成的足够多,以至于卡将在重新加电时完成操作)这并不意味着主机操作系统如果执行部分而不是全部的数据写入操作就不会出现问题。尽管如此,重要的是要记住,如果 SD 卡无法坚持其“讨价还价”,则主机端软件无法防止因断电而丢失数据。

我还建议在需要读取 SD 时使用某种校验和来验证 SD 上的数据是否正确。