只更改 SD 卡扇区中的一个字节

Changing just one byte in SD card sector

我正在使用 Atmega328 在 SD 卡上实现 FAT16。

我经常需要更改扇区(512B 区域)中的一两个字节。

我知道 Flash 是如何工作的,它需要一次覆盖整个扇区,但我想知道是否有一些特殊的命令可以让卡本身处理它?

关键是,atmega只有2k内存,分配512只做一个读-改-写SD卡缓冲区是很不利的。没有别的办法吗?

(PS。据我所知,atmega 本身不能有外部 ram)

ELM Petit FAT File System Module 声明:

It can be incorporated into the tiny microcontrollers with limited memory even if the RAM size is less than sector size.

事实上:

  • Very small RAM consumption (44 bytes work area + certain stack).

它是开源的;所以你可以看看它是如何做到的(或者只是按原样使用它)。

写函数确实有一些重要的限制,例如虽然它可以修改文件,但不能创建文件或更改文件的大小 - 这可能是避免扇区缓冲区所必需的妥协。

有一个full featured version of ELM FatFS, but that requires significantly more code and RAM space。 该页面还有指向 FAT32 规范的链接,以及一些关于 SD 卡工作原理的技术说明,这些说明可能会有用。

编辑:

事实上这并不是特别有用。 Petit FAT 的声明仅指文件系统层本身,它不包括任何硬件特定的设备驱动程序,并且对于 SD/MMC 无法摆脱 512 字节的读取-修改-写入周期。

虽然 AVR 可能不支持内存映射外部存储器,但可以使用外部串行存储设备,例如 Cypress FRAM or nvSRAM 来存储扇区数据;尽管是非易失性的,但除非特别需要大型可移动媒体,否则它可能会完全消除对 SD 的需求。

如果没有 reading/writing 整个 512 字节,您不能只更改一个扇区中的几个字节。所以你实际上确实需要 RAM 来缓冲。

但是,有一些方法可以预先分配文件空间或仅在每次写入时更新 FAT。这甚至可以节省写入周期,但如果在更新 FAT 之前断电,可能会导致数据丢失(但是,如果实施得当,它可能不会损坏文件系统)。

当你说这些是便宜的 ArduinoNano(克隆 - 据说)时,你可以只使用它们中的两个与 UART/SPI/i2C 互连 - 无论可用的是什么,即使是 8 位位爆炸也可以。

一个随心所欲,另一个只是为了SD-card/FAT处理。

让我想起了 Comodore 64 及其软盘驱动器 1541,其中还包括一个小 CPU(好吧 "MCU",但不是单芯片)。