Ich mache ein Projekt auf PIC , das eine große Menge an Speicher zum Speichern von Daten benötigt. Ich möchte eine SD-Karte als Speicherelement verwenden. Ich möchte kein Dateisystem.
Ich habe die Schnittstelle von SD-Karten mit Mikrocontrollern gegoogelt. Ich habe festgestellt, dass alle eine Art Dateisystem verwenden. Ist es möglich, eine SD-Karte ohne Dateisystem wie ein serielles EEPROM anzuschließen ?
Sie haben nicht erwähnt, welchen PIC Sie verwenden, aber vorausgesetzt, es ist einer der kleineren wie der PIC16, dann wäre es mit seinem begrenzten RAM (99% der PIC16s haben nicht mehr als 1 KB RAM) unmöglich, auch nur einen zu implementieren FAT16-Dateisystem, da mehrere 512-Byte-Puffer benötigt werden. (Microchip hat eine nützliche Bibliothek, um ein FAT16/FAT32-Dateisystem zu implementieren, aber sie gilt nur für PIC18, PIC24, dsPIC33 und PIC32.)
Sie haben erwähnt, dass Sie aufgrund des begrenzten RAM nur ein Byte auf einmal schreiben oder lesen möchten. Obwohl, wie andere gesagt haben, eine SD-Karte normalerweise in 512-Byte-Blöcke aufgeteilt ist, müssen Sie nicht alle Bytes verwenden. Im schlimmsten Fall könnten Sie nur ein Byte pro Block speichern und die anderen 511 verschwenden. Das erscheint absurd, aber aufgrund der enormen Größe der heute verfügbaren SD-Karten würde es tatsächlich funktionieren. Wenn Sie eine 8-GB-Karte haben, bedeutet dies, dass 16 MB Blöcke vorhanden sind, was bedeutet, dass Sie auf diese Weise 16 MB Daten speichern können.
Es wird jedoch sehr langsam sein , etwa 10 ms oder mehr pro Block von 512 Bytes, da Sie einen Befehl zum Löschen jedes Blocks erteilen müssen, bevor er geschrieben wird. (In dem unwahrscheinlichen Fall, dass Sie, wie oben erwähnt, nur ein Byte pro Block gespeichert haben, bedeutet dies, dass es 10 ms dauern würde, dieses eine Byte zu schreiben.)
Sie haben die Datenmenge, die in einem Ihrer Protokolleinträge enthalten ist, nicht erwähnt, aber es wäre viel besser, wenn Sie einen Eintrag (z. B. 25 Bytes oder was auch immer) puffern und in einen Block schreiben könnten. So wird jeder Block zu einem Protokolleintrag. Da die Zeit zum Schreiben der Bytes wiederum von der Zeit dominiert wird, die zum Löschen des Blocks benötigt wird, ist das Schreiben eines Eintragsprotokolleintrags so schnell wie das Schreiben eines einzelnen Bytes.
Da Sie dies im Wesentlichen als erweiterten Speicher verwenden, müssen Sie die Karte nicht entfernen und in einem PC lesen (was die Verwendung einer speziellen Software zum Ausgeben der Rohblöcke erfordern würde). Da Sie die Leseblockroutine sowieso bereits in Ihrem Code haben und vorausgesetzt, Sie haben einen UART, würde ich stattdessen die Protokolldaten seriell auf einen PC ausgeben; Sie könnten eine FTDI-UART-zu-USB-Brücke verwenden und die Daten würden auf Ihrem PC als COM-Port angezeigt.
Ja, jedeswriteBlock
Dateisystem ruft Funktionen auf niedrigerer Ebene auf, die etwa wie und benannt werden könnten readBlock
, die Sie direkt aufrufen würden. Da Sie einen Mikrocontroller verwenden, wird Ihnen die Schnittstelle zur Karte im SPI-Modus am besten gefallen, was für Protokollierungsanwendungen vollkommen in Ordnung ist - nicht so sehr für schnellere Anwendungen wie Videoaufzeichnung.
Ihre Blockgröße beträgt in der Regel 512 Byte, das ist also der minimale Datenblock, den Sie auf einmal schreiben/lesen. Single-Byte-Transaktionen werden nicht unterstützt (es gibt keinen Befehl, den Sie senden können, um so etwas zu bewirken).
Allerdings sollten Sie sich überlegen, wie Sie die Daten von der Karte bekommen, da es kein Dateisystem gibt. Das bedeutet, dass es keine Dateien gibt, die Sie einfach per Drag-and-Drop auf Ihren Desktop ziehen können, wenn Sie es an Ihren Computer anschließen (wenn Sie die Daten so abrufen), auf dem ein Mainstream-Betriebssystem ausgeführt wird. Sie müssen eine spezielle Anwendung schreiben, die auf die Rohdaten der SD-Karte zugreift.
Aus diesem einfachen Grund würde ich vorschlagen, ein Dateisystem wie FAT32 zu verwenden, das in Protokollierungsanwendungen sehr verbreitet ist, und Sie finden mehrere gebrauchsfertige Bibliotheken im Internet.
Ich habe gerade die Spezifikation der physischen Schicht der SD-Karte gelesen und mit dem Lesen und Schreiben von Blöcken mit AVR experimentiert. Ich finde die vorherigen Antworten entmutigend, also werde ich meine eigenen Ansichten darlegen
(1) Es kann einfacher sein, Blöcke für Protokollierungsanwendungen zu lesen/schreiben, die nur Daten anhängen. Natürlich gibt es viele FAT-Bibliotheken im Netz, aber es erfordert nur Mühe, eine FAT-Bibliothek zu verdrahten. (zumindest wenn du verstehen willst was du tust). Zum Anhängen von Protokollen müssen Sie nur die letzte Blocknummer verfolgen.
(2) Die Blockschreibvorgänge sind nicht langsamer als FatFS-Schreibvorgänge. Jede FatFS-Bibliothek würde schließlich dieselben Befehle verwenden. Erstellen Sie einen unsigned char[512]-Puffer und schreiben Sie ihn in einen Block.
(3) Mit 4-GB-Karten haben Sie ca. 7 * 10 ^ 6 Blöcke und das sollte Ihnen 81 Tage Protokollierung mit jeder zweiten Protokollierung ohne Pufferung geben. Die Zahl sollte sich mit Pufferung verbessern.
PeterJ
Linu Das
Benutzer36129
PeterJ
Superkatze
Benutzer36129
Superkatze
Superkatze
Benutzer36129
Superkatze