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

时间:2015-06-10 07:45:10

标签: c embedded avr

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

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

我知道Flash是如何工作的,它需要立刻覆盖整个扇区,但我想知道是否有一些特殊的命令可以使卡本身处理它?<​​/ p>

关键是,atmega只有2k RAM,而且只为读取 - 修改 - 写入SD卡缓冲区分配512是非常不利的。没有别的办法吗?

(PS.AFAIK atmega本身可以使用外部ram)

2 个答案:

答案 0 :(得分:1)

ELM Petit FAT File System Module声称:

  

即使RAM大小小于扇区大小,它也可以集成到内存有限的微控制器中。

事实上:

  
      
  • RAM消耗非常小(44字节工作区+特定堆栈)。
  •   

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

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

full featured version of ELM FatFS,但需要significantly more code and RAM space。 该页面还包含指向FAT32规范的链接,以及有关SD卡如何工作的一些技术说明。

修改

实际上这并没有特别的帮助。 Petit FAT的声明仅涉及文件系统层本身,它不包含任何特定于硬件的设备驱动程序,而对于SD / MMC而言,它不会脱离512字节的读 - 修改 - 写周期。

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

答案 1 :(得分:1)

如果没有读/写整个512字节,你就不能在扇区中改变几个字节。所以你实际上确实需要缓冲区的RAM。

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

正如你所说的那些便宜的ArduinoNano(克隆 - 据称),你可以使用其中两个与UART / SPI / i2C互连 - 无论什么可用,甚至8位bit-bang都可以。

一个人非常愿意,另一个只是SD卡/ FAT处理。

让我想起了Comodore 64和它的软盘驱动器1541,它还包括一个小型CPU(井#34; MCU&#34;但不是单芯片)。