Forum: Mikrocontroller und Digitale Elektronik SD Card SPI FAT32 ATA??


von Lars (Gast)


Lesenswert?

Hallo,

Irgendwie stehe ich auf dem Schlauch...
Ich möchte auf meiner SD Karte Daten ablegen, welche ich dann später am 
PC auslesen kann.

Bisher kann ich Daten auf die Karte schreiben und auslesen, allerdings 
nur über SPI.

Also brauch ich ja noch FAT32 um die Daten am PC sichtbar zu 
machen....aber alle Beispielcodes die ich finde sind mit ATA und nicht 
mit SPI.
Ich dachte ATA sei auch ein Übertragungsprotokoll wie SPI und nur für 
z.B. CF Karten, brauch ich das dann für meine SD Karte überhaupt????


Wär nett wenn ihr mir helfen könntet!!!

Grüße Lars

von Sven P. (Gast)


Lesenswert?

Ja und? FAT32 und ATA/SPI ham doch nix miteinander zu tun..? Mal davon 
ab, dass FAT32 für den hypothetischen AVR ziemlich ungeeignet ist. Das 
alte FAT ist schon kompliziert genug.
Und: Man kann auch Rohdaten ohne Dateisystem auf die Karte nageln und am 
PC auslesen, mit Linux geht das dann ohne Dateisystem sogar noch 
einfacher als mit.

von nixversteh (Gast)


Lesenswert?

FAT32 auf'm AVR? Gibt's zum Bleistiel hier: 
http://www.holger-klabunde.de/avr/avrboard.htm#FullFAT
Hat der gute sogar mal hier irgendwo veröffentlicht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

SD-Karten verwenden kein FAT32, das tun nur SDHC-Karten, weil sie größer 
sind als die mit FAT16 verwendbaren 2 GiB.

von Tilo (Gast)


Lesenswert?

Wer sagt das?
Man kann SD Karten mit FAT32 formatieren, wenn sie größer als 32MB sind. 
Welchen Sinn es macht ist ein anderes Thema. Es gibt auch 4GB Karten, 
die im SD Mode noch angesprochen werden können.

von Lars (Gast)


Lesenswert?

Ich habe schon fleißig gegoogelt, aber wirklich fündig bin ich nicht 
geworden.

Bin immernoch auf der Suche nach einem passenden Beispielcode.

fat.h und fat.c der Procyon-Seite verwendet ATA, ich brauch ja aber SPI

ulrich radigs Code unterstützt nur das Lesen, nicht aber das Schreiben.

Kennt ihr vielleicht noch eine Seite mit Beispielcode?

Wie gesagt ich suche FAT32 für SD-Karten mit SPI. Hauptsächlich die 
Screibfunktion...

Danke schon mal
Grüße

von Andreas W. (andreasw) Benutzerseite


Lesenswert?


von Ja mann (Gast)


Lesenswert?

>SD-Karten verwenden kein FAT32
Doch.

>fat.c der Procyon-Seite verwendet ATA,
>ulrich radigs Code unterstützt nur das Lesen
Warum führst du dann die beiden nicht einfach zusammen ?

von J. K. (rooot)


Lesenswert?

www.mikro-control.de

Fat16 lesen und schreiben

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Wer sagt das?

Die SD-Kartenspezifikation. Die legt auch das verwendete Dateisystem 
fest.

> Man kann SD Karten mit FAT32 formatieren, wenn sie größer als 32MB sind.

Ja, das kann man. Nur entsprechen sie dann nicht mehr der 
SD-Kartenspezifikation.

von Hans W. (hans_wurst)


Lesenswert?

> Die SD-Kartenspezifikation. Die legt auch das verwendete Dateisystem
> fest.

Was hat denn die Spec der SD-Karte mit dem Dateisystem zu tun? Ohne zu 
nah treten zu wollen, aber das sind zwei paar Schuhe und mir ist dort 
bisher noch nie etwas vom Dateisystem "über den Weg gelaufen".


Falls es dir eine Hilfe ist, im Beispilecod für Atmels 
UC3-Mikrocontrollers sind auch bereits fertige Codes für SD-Karte + 
FAT12/16/32 enthalten.

von Lars (Gast)


Lesenswert?

Ich hab mich jetzt dem Code von Holger Klbunde angenommen.
Nach 2 Stunden durchlesen geht mir langsam ein Licht auf, aber wirklich 
leicht find ich das nicht, beschäftige mich auch erst seit 1 Jahr mit 
Elektronik/µC/C
Naja, ich kämpf mich mal durch den Code...weil einfach implementieren 
will ich das auch nicht, ich muss schon wissen was da passiert :-)
Und alles was ich nicht brauch muss raus!

Ich habe eine 1GB und eine 256MB SD Karte zur verfügung.
Will ich die am PC formatieren gibt Windows mir die Wahlmöglichkeit 
zwischen FAT und FAT32. Also versuch ich mein Glück einfach mal mit 
FAT32.
Wenn ich das verstanden habe wird FAT12/16 auch nicht groß anders sein 
(hoffe ich).

Danke für eure Hilfe!!

Grüße Lars

von Hans W. (hans_wurst)


Lesenswert?

Leichter wirst du dich tun, wenn du mit FAT16 (was Windows nur als FAT 
bezeichnet) beginnst. FAT32 ist noch komplexer.

von Mike (Gast)


Lesenswert?

Hallo,

ich habe für ein ähnliches Projekt die EFSL (http://efsl.be/) verwendet. 
Klappte prima, getestet mit 32MB bis 4GB Karte und ich kann FAT16 und 
FAT32 lesen und schreiben. Einziger Nachteil: Die Schreibrate ist recht 
mies (< 200kB/s), da die Blöcke alle einzeln geschrieben werden, 
anstelle mehrere zu sammeln. Ist aber bei uC's meist wegen des 
begrenzten Speichers nicht besser zu machen.

Gruss
Mike

von Lars (Gast)


Lesenswert?

Ich nochmal...
Also die Grundlagen von FAT leuchten mir jetzt ein. Ich habe es auch 
geschafft Holger Klabunde's Code einzubinden und er funktioniert soweit.
Allerdings habe ich noch Verständnisprobleme mit dem fatbuf[] bzw der 
FWrite ´Funktion.

hier gibt es doch bestimmt jemanden, der diesen Code auch verwendet...

Hier ein ausschnitt aus meiner main.c
1
unsigned char buf[]="Lars Test";
2
unsigned char testbuf[6];
3
4
//get drive Info....
5
6
//schreiben auf SD Karte
7
testbuf[0]=0x20;
8
testbuf[1]=0x21;
9
testbuf[2]=0x22;
10
testbuf[3]=0x23;
11
testbuf[4]=0x24;
12
testbuf[5]=0x25;
13
14
result=Fopen("test.txt", F_WRITE);
15
if(result==F_OK)
16
{
17
  result=Fwrite(buf,8);
18
    if(result!=8){break;}
19
20
  result=Fwrite(testbuf,9);
21
    if(result!=9){break;}
22
}
23
Fclose;

Das funktioniert soweit auch.
Wiso kann ich aber z.B. nicht
1
 Fwrite(testbuf[1],1)
 schreiben lassen. mit der Zahl hinterm KOmma geb ich ja an wieviel 
Bytes geschrieben werden sollen.
Es wird auch ein Byte geschrieben, nur statt 0x21 bekomme ich 0xFF auf 
die SD Karte

Meine 2.Fage ist:
Wie verwende ich Fflush() bzw. den extern unsigned char fatbuf[];
Kann ich den beschreiben wie z.B. mein testbuf und dann wird er wenn ich 
fflush aufrufe geschrieben, oder darf ich den nicht "antasten"...
Dann versteh ich allerdings den Sinn nicht ganz, soll ja das System 
schneller machen und in der Funktionsbeschreibung steht:
ruft man auf, wenn der gesammelte Inhalt auf den CF(SDKarte) geschrieben 
werden soll, ohne die Datei zu schließen.
Hab natürlich schon damit rumgespielt und versucht z.B. fatbuf[1]=0x22; 
und dann Fwrite(fatbuf,1); aber das funktioniert nicht.

Wäre nett wenn ihr mir da helfen könntet.

Grüße

von holger (Gast)


Lesenswert?

Fwrite(testbuf[1],1) ist falsch weil ein Pointer auf einen Puffer
erwartet wird. Du übergibst aber ein Byte als Wert. Richtig ist:

Fwrite(&testbuf[1],1)

>Hab natürlich schon damit rumgespielt und versucht z.B. fatbuf[1]=0x22;
>und dann Fwrite(fatbuf,1); aber das funktioniert nicht.

Auweia. Flossen weg von fatbuf[]. Der gehört nicht zur Datei!
Da stehen Clusternummern drin. Wenn du da was einträgst kannst
du die Karte gleich wieder formatieren.

von Lars (Gast)


Lesenswert?

Also ich glaub ich verstehs jetzt...lesen bildet^^ und ein Oszi zu 
verwenden hilft auch^^
Der fatbuf wird in den Funktionen verwendet. Mit dem Aufruf von FWrite 
wird noch nicht auf die SD Karte geschrieben, erst mit dem Aufruf von 
fflush oder dann fclose.

Bei übertragen eines Bytes wie z.B. testbuf[3] hab ich das mit den 
Zeigern durcheinander gebracht.
Es muss folglich heißen:

Fwrite(&testbuf[3],1);

Dacht ich poste meine "Erkenntnis" fall jemand mal vor dem gleichen 
Problem steht...

Grüße

von Lars (Gast)


Lesenswert?

Danke Holger!

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.