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
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.
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.
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
>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 ?
> 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.
> 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.
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
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
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
unsignedcharbuf[]="Lars Test";
2
unsignedchartestbuf[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
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.
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
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.