Forum: Mikrocontroller und Digitale Elektronik Schreiben auf SD ohne FAT


von Oz z. (ozzy)


Lesenswert?

Moin,

für ein Uni-Projekt müssen wir Daten von Sensoren sammeln, und diese 
längerfristig speichern. Dafür wollten wir eine SD-Karte nehmen.
Nun war meine Idee, das ganze nicht großartig über FAT etc. zu machen, 
sondern die Daten einfach so (wie sie kommen) auf die Karte zu 
schreiben. Es sind alles 8-Bit-Werte, die in einer genauen Reihenfolge 
hintereinander kommen.
Aber hat jemand von Euch Ahnung, wie das geht? Oder wie das Timing 
aussehen muss? Oder vielelicht sogar etwas Code dafür???

MfG, und vielen Dank schon einmal, Ozzy

von Obelix (Gast)


Lesenswert?

Die Suche ist dein Freund. Es sollte genug Infos dazu im Netz und hier 
im Forum dazu geben. Schau dir auch mal die Datenblätter zu deiner 
SD-Karte an.

von Jack B. (jackbraun)


Lesenswert?


von Oz z. (ozzy)


Lesenswert?

Hi,

durch die Suche habe ich jetzt schon etwas Assembler-Code gefunden (vom 
Midi-Recorder), und bei Ulrich Radig habe ich auch ein Datenblatt für 
eine SD-Karte gefunden (meine stammt aus einem Navi, da steht kein 
Firmenname drauf). Aber ich weiß eben nicht genau, wie das mit dem 
Timing geht, außer, dass man am Anfang wohl 74 Takte warten muss...

Hat vielleicht jemand noch mehr Informationen?

MfG, Ozzy

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Mehr Infos als die von Ulrich Radig und die dazu gehörigen Datenblätter 
wirst Du für Dein Vorhaben eigentlich nicht brauchen.

von Philipp B. (philipp_burch)


Lesenswert?

Bei Ulrich Radig gibt's ein Datenblatt (Ist glaub' von Hitachi), welches 
die Ansteuerung im SPI-Modus recht gut aufzeigt. Ist zwar für 
MMC-Karten, das spielt aber keine Rolle. Falls du aber was Fertiges 
nehmen willst, solltest du dich mal bei elm-chan umsehn: 
http://elm-chan.org/docs/mmc/mmc_e.html
Da gibt's auch schon fertigen Code für eine FAT-Implementierung 
(Hardwareunabhängig) mit den Zugriffsfunktionen für ein paar 
verschiedene Controller. Darunter auch für AVR und AFAIK ARM.

Willst du die Daten ohne Dateisystem schreiben solltest du einfach 
beachten, dass nur in Blöcken von 512 Bytes geschrieben werden kann. 
Entweder musst du also sehr viel Speicher einfach verschwenden oder aber 
einen Controller mit genügend RAM (min. 600 Bytes, also eigentlich 1kB) 
verwenden.

von Laurentius (Gast)


Lesenswert?

Hallo
Deine Idee ist gut Christoph.

Nur eine Frage: Wie willst du die Daten am PC auslesen?

Gruss Laurentius

von Hannes L. (hannes)


Lesenswert?

Laurentius wrote:
> Hallo
> Deine Idee ist gut Christoph.
>
> Nur eine Frage: Wie willst du die Daten am PC auslesen?

Na über den Mikrocontroller und die serielle Schnittselle (zur Not auch 
über USB-SER-Wandler). Denn der Mikrocontroller weiß schließlich, wo er 
hingeschrieben hat. Solange die Speicherkarte keine fehlerhaften 
Sektoren hat ist das kein Problem.

>
> Gruss Laurentius

...

von Laurentius (Gast)


Lesenswert?

Erscheint mir erstmal komplizierter als direkt Dateien auf die Karte zu 
schreiben. Aber ich lasse mich gerne eines Besseren belehren.

Gruss Laurentius

von Uhu U. (uhu)


Lesenswert?

Du kannst die Karte FAT-formatieren und eine Datei drauf schreiben, die 
die Karte vollständig belegt. Dann ist einigermaßen garantiert, daß die 
Cluster in logischer Adressfolge physikalisch auf der Karte stehen.

Dein µC schreibt dann direkt in den Datenbereich.

Hinterher liest Du die Datei ganz normal am PC ein. Du mußt Dich dann 
nur noch darum kümmern, daß ein logischer EOF-Marker geschrieben wird, 
oder daß Du es sonst wie erkennen kannst, denn für den PC ist die Datei 
so groß, wie sie ursprünglich angelegt wurde.

von Christoph Osterloh (Gast)


Lesenswert?

Hi,

gibt es denn eine einfache Methode, in eine Datei zu schreiben? Der Code 
sollte wirklich klein und schnell sein. Im Zweifellsfall mache ich die 
Datei genauso groß wie die Karte... Mal sehen, womit er den Rest der 
Datei auffüllt...

MfG, und vielen Dank schon einmal für Eure Hilfe, Ozzy

von Bastler (Gast)


Lesenswert?

Da gerade über SD-Karten diskutiert wird, möchte ich gleich eine Frage 
stellen.

Bei den Beispielen werden immer nur maximal 128MB große Karten 
verwendet.

Leider werden die Karten dieser Größe immer seltener.
Können auch Karten mit 1 bzw. 2GB verwendet werden?
Oder gibt es da Probleme mit dem Adressbereich bzw. andere 
Kompatibilitätsprobleme?

mfg Bastler

von Uhu U. (uhu)


Lesenswert?

@ Christoph:

Du kannst die Holzhammermethode verwenden, wenn Du so vorgehst, wie ich 
oben beschrieben habe:

Sieh Dir mit einem Diskdump-Programm die Karte nach der Formatierung und 
der Anlage der leeren Datei an und suche den Sektor, ab dem der 
Datenbereich beginnt. (Sieh Dir die FAT-Specs an, dort ist beschrieben, 
wie die Verwaltungsstrukturen aussehen - das ist alles ziemlich 
simpel..)

Dann verdrahtest Du einfach die Adresse des ersten Datensektors fest in 
Deinem µC-Programm und schreibst ab dort einfach hart auf die Karte. 
Dazu brauchst Du keine FAT-Routinen - quick and dirty...

von Christoph Osterloh (Gast)


Lesenswert?

Hi,

hab jetzt was bei Mr. Midi gefunden. Da steht:

[...]Beliebige MMC/SD-Karten verwendbar, allerdings muss sie mit Windows 
formatiert werden und dann muss ein leeres File mit etwa der Kapazität 
der Karte (unter Eigenschaften im Windows-Explorer wird der freie 
Speicher in Bytes angegeben) drauf kopiert werden. (Das kann irgendeine 
Datei sein, die halt gerade noch draufpasst.) Erst dann sollte man sie 
in Mr.MIDI stecken :-) Sollte die Karte größer als 16 MB sein, kann man 
die Dateigröße so berechnen: 512  256  Anzahl "Files", dann allerdings 
nicht in Mr.MIDI zu große Filenummern verwenden! Sonst geht es auf der 
Karte so durcheinander, dass Windows sie neu formatieren muss...[...]

@ Uhu Uhuhu: Ist das das, was Du meintest?

Wie erstellt man denn eine Datei, die so groß ist, wie die Karte? Wie 
kann man denn die Größe der Datei verändern???

MfG, Ozzy

von Uhu U. (uhu)


Lesenswert?

Ja, das meinte ich.

Das Schreiben der Datei: Sieh Dir unter Windows an, wieviel Platz auf 
der Karte frei ist. (Nimm eine Methode, die das aufs Byte genau tut!)

Dann schreibst Du Dir ein kleines Programm, das auf der Karte eine Datei 
anlegt und einfach so viele Daten darauf schreibt, wie Windows vorher 
angezeigt hat.

Noch einfacher: Du schreibst einfach Datenblocks, die so lang sind, wie 
ein Cluster. Das machst Du so lange, bis Du einen Schreibfehler 
bekommst.

Anschließend die Datei mit close() ordentlich zu machen!

von JojoS (Gast)


Lesenswert?

man kann die SD Karte auch unter Windows Sektorweise auslesen, z.B. mit 
dskprobe.exe aus Windows NT-Reskit oder mit eigenem Code wie hier 
beschrieben:
http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5765/
Aber mit richtigen Dateien sieht es doch etwas eleganter aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.