Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit PIC24 (mit oder ohne FS)


von Max H. (hartl192)


Lesenswert?

Ich würde gerne eine SD-Karte mit meinem PIC24F16KA102 ansprechen. 
Vorerst will ich nur *.txt Files von der Karte lesen.
Von Microchip gibt es dazu die MLA/FILEIO [1]. Ich habe mit die AN1045 
von Microchip angesehen und bind damit nicht sehr gut zurechtgekommen. 
Wie ich die einzelnen Funktionen, wie FSfread,.. anwende habe ich 
verstanden. Ich verstehe aber nicht, wie ich alles Einstellen muss, 
damit ich die Funktionen verwenden kann. Weiß jemand wo ich eine Seite 
finde, auf der gut beschreiben ist, wie ich die MDD Lib konfiguriere?

Vielen Dank und Grüße

[1] http://www.microchip.com/pagehandler/en-us/devtools/mla/

P.S. Ich verwende MPLAB IDE mit dem XC16 Compiler.

von Somebody123 (Gast)


Lesenswert?

Hallo,

vermutlich ist dein PIC zu klein (das Demoprojekt braucht 47% Flash wenn 
man es compiliert, bei einem 128k-PIC).

Zum Portieren:
Ich würde mir das vorgefertigtes Projekt für das Teil mal in MPLAB 
öffnen und mir das dort abschauen. Das für dich relevante ist das 
Demonstration2.c.

Da muss man sich leider durchbeißen und das zumindest so ungefähr 
verstehen. Am besten kopiert man sich das Projekt und kürzt das erst 
einmal auf einen PIC zusammen. (diese ganzen #ifdefs)

Die HardwareProfile.h musst du sicher anpassen.

Danach die main() in Demonstration2.c anschauen, was dort gemacht wird. 
Da wirst du zumindest die SPI-Init anpassen müssen.


Was vielleicht eine Alternative ist:

http://elm-chan.org/fsw/ff/00index_e.html

Da gibt es ein komplett fertiges Projekt für einen PIC24. Es gibt eine 
abgespeckte Variante mit weniger Speicherverbrauch.

von Max H. (hartl192)


Lesenswert?

Ich habe das mit dem Filesystem (FS) vorerst aufgegeben und entschieden 
mein Glück ohne FS zu versuchen... Ich habe dazu ein Dokument gefunden: 
http://www.uni-koblenz.de/~physik/informatik/ECC/sd.pdf
Es hat viele meiner Fragen beantwortet, aber leider noch eine 
aufgeworfen:
Bei der Init (S. 14):
> Beispiel-Initialisierung mit ACMD41:
> Send: 0x77 0x00 0x00 0x00 0x00 0x01 (CMD55, das "Prefix" fur ein ACMD)
> Recv: 0x01 (R1-Antwort mit dem "In Idle State"-Bit gesetzt.)
Hab ich das richtig verstanden, dass ich erst die 6 Byte senden muss und 
dann ein 0xFF um die Antwort zu lesen?

Beim Lesen von Daten (S. 15):
Beispiel:
> Send: 0x51 0x00 0x00 0x08 0x00 0x01 (CMD17, Lese Block ab Byte 2048)
> Recv: 0x00 (R1-Antwort: Alles OK)
> Recv: 0xfe 0x4e 0x65 0x72 0x64 0x21 ..... 0xa7 0x22
Muss ich hier dann nach dem Befehl (6 Bytes) 0xFF senden um die R1 
Antwort zu erhalten und dann so lange 0xFF bis ich den Data Token 0xFE 
erhalte  und dann noch 512+2 (Daten + CRC) mal bis ich alle Daten habe.


Vielen Dank im Voraus :-)

von Max H. (hartl192)


Lesenswert?

Hat jemand eine Ahnung von der Ansteuerung ohne FS?

von holger (Gast)


Lesenswert?

>Hat jemand eine Ahnung von der Ansteuerung ohne FS?

Ja.

von Max H. (hartl192)


Lesenswert?

holger schrieb:
> Hat jemand eine Ahnung von der Ansteuerung ohne FS?
>
> Ja.
Da du anscheinend mit absoluter Sicherheit sagen kannst, dass jemand 
Ahnung von der Ansteuerung ohne FS hat gehe ich davon aus, dass es auf 
dich zutrifft. Würdest du oder jemand  anderes der sich damit auskennt 
bitte meine Frage beantworten?
Danke

von Falk B. (falk)


Lesenswert?

@ Max H. (hartl192)

>Ich habe das mit dem Filesystem (FS) vorerst aufgegeben und entschieden
>mein Glück ohne FS zu versuchen... Ich habe dazu ein Dokument gefunden:

Keine weise Entscheidung.

Das FATfs von ELM Chan läuft super, kann ich wärmsten empfehlen.

http://elm-chan.org/fsw/ff/00index_e.html

von Max H. (hartl192)


Lesenswert?

Das Problem dabei ist nur, dass mein PIC zu wenig ROM und RAM hat. 
Mittlerweile habe ich entschlossen, dass ich keine Fertige Lib verenden 
will, sondern erst verstehen will wie man ohne FS schreibt und liest. 
Wenn ich irgendwann mit FS arbeiten will, werde ich auf die Lib von ELM 
Chan oder das FILEIO von Microchip zurückkommen.

von Falk B. (falk)


Lesenswert?

@ Max H. (hartl192)

>Das Problem dabei ist nur, dass mein PIC zu wenig ROM und RAM hat.

ROM sowieso nicht, eher Flash ;-)
Wieviel hat er denn? Mal die Seite gelesen?

http://elm-chan.org/fsw/ff/00index_p.html

>Mittlerweile habe ich entschlossen, dass ich keine Fertige Lib verenden
>will, sondern erst verstehen will wie man ohne FS schreibt und liest.

Ob das soo sinnvoll ist? Schließlich ist der Inhalt deines Projektes 
NICHT einen SD-Kartenzugiff neu zu machen sondern was anderes. Der 
SD-Zugiff ist nur Mittel zum Zweck.

>>Wenn ich irgendwann mit FS arbeiten will, werde ich auf die Lib von ELM
>Chan oder das FILEIO von Microchip zurückkommen.

Damit hebelst du das Konzept einer derartigen Bibliothek zu 100% aus. 
Glückwunsch!
Denn der Sinn liegt ja gerade da drin, dass man sich NICHT um die 
internen Details kümmern muss, sondern recht einfach un komfortabel die 
Sache nutzen kann.
Du musst schließlich auch kein Auto bauen, um es zu fahren!
Wenn man immer und überall JEDES Detail verstehen will, kommt man nicht 
vorwärts.

von MCUA (Gast)


Lesenswert?

>Du musst schließlich auch kein Auto bauen, um es zu fahren!
Er muss aber auch kein LKW besitzen, nur um Auto zu fahren.

von Max H. (hartl192)


Lesenswert?

Falk Brunner schrieb:
> ROM sowieso nicht, eher Flash ;-)
> Wieviel hat er denn?
16kB (5632 Instructions)
> Mal die Seite gelesen?
> http://elm-chan.org/fsw/ff/00index_p.html
Diese nicht, ich habe aber gesehen, dass das Demoprojekt für PIC241 ca. 
16200 Byte brauch.

> Ob das soo sinnvoll ist? Schließlich ist der Inhalt deines Projektes
> NICHT einen SD-Kartenzugiff neu zu machen sondern was anderes. Der
> SD-Zugiff ist nur Mittel zum Zweck.
Ich plane eigentlich kein Projekt, ich will nur ein bisschen mit der 
SD-Karte spielen um mich hochzuskillen (skill: engl. Fähigkeit).

> Damit hebelst du das Konzept einer derartigen Bibliothek zu 100% aus.
> Glückwunsch!
> Denn der Sinn liegt ja gerade da drin, dass man sich NICHT um die
> internen Details kümmern muss, sondern recht einfach un komfortabel die
> Sache nutzen kann.
> Du musst schließlich auch kein Auto bauen, um es zu fahren!
> Wenn man immer und überall JEDES Detail verstehen will, kommt man nicht
> vorwärts.
Wenn man das Auto verstehen will, hilft es einem nicht viel damit ein 
paar Runden zu drehen.

Wieso nimmt jemand einen µC um eine LED blinken zu lassen, das geht ja 
viel einfacher mit 4 Widerständen, 2 Kondensatoren und zwei 
Transistoren?

von Falk B. (falk)


Lesenswert?

@Max H. (hartl192)


>Ich plane eigentlich kein Projekt, ich will nur ein bisschen mit der
>SD-Karte spielen um mich hochzuskillen (skill: engl. Fähigkeit).

Aua! Früher hies das lernen, weiterbilden, experimentieren. Heute ist es 
Assi-Denglisch! WÜRG
Na dann mal viel FUN beim hochskillen.

von Max H. (hartl192)


Lesenswert?

Wenn mir jemand meine Frage von oben* beantworten würde könnte ich auch 
mit dem verbessern meiner Fähigkeiten anfangen...

*Beitrag "Re: SD-Karte mit PIC24"

Falk Brunner schrieb:
> Früher hies das lernen,[...]
Ich bin noch nicht so lange dabei, aber war es früher üblich Fragen zu 
beantworten und nicht einfach zu einem Fertigen, nicht gefragten, Code 
zu verweisen, weil man keine Ahnung hat?

von Swissbit Support (Gast)


Lesenswert?

Hallo Max,

ich habe leider Deinen Post erst jetzt gesehen. Prinzipiell bist Du aus 
meiner Sicht nicht weit daneben.

Nach dem Absetzen eines Kommandos kann es einige Zeit gehen bis die 
Response und danach die Daten von der Karte kommen. Die Karte braucht ja 
intern auch eine Zeit um das Kommando zu verarbeiten respektive danach 
die Daten aus dem Flash rauszulesen und in den Datenbuffer zu laden.

Das 0xFF muss allerdings nicht der Host "senden", sondern die 
Datenleitung der Karte bleibt oben und der Host samplet in dieser Zeit 
den High-Pegel der SOMI/DO Leitung ein, bis er eine Response der Karte 
bekommt.

Die Karte darf zwischen 1 bis max. 8 Units von 8 Clock-Zyklen "busy" 
sein bevor die Response auf das CMD kommt. Das heisst, du wirst zwischen 
1 bis 8 Mal "0xFF" einsamplen müssen bevor die Response oder das 
Start-Token für die Daten kommt.

Je nach Karte dauert diese Zeit NCR (Command Response) wie gesagt 
zwischen 1*8 Clock Zyklen und 8*8 Clock Zyklen lang.

Nach der Response muss bei einem Lesebefehl wie z.B. CMD 17 ebenfalls so 
lange gewartet werden (NAC).

Eine Ausnahme gibt es hier beim Lesen des CID oder des CSD Registers, 
hier
kann die Karte zwischen NULL und 8 solcher Clock-Zyklen brauchen (NCX), 
es ist also nicht zwingend so, dass an dieser Stelle 0xFF eingesamplet 
werden, evtl. kommt die Response direkt.

Max H. schrieb:
> Ich habe das mit dem Filesystem (FS) vorerst aufgegeben und entschieden
> mein Glück ohne FS zu versuchen... Ich habe dazu ein Dokument gefunden:
> http://www.uni-koblenz.de/~physik/informatik/ECC/sd.pdf
> Es hat viele meiner Fragen beantwortet, aber leider noch eine
> aufgeworfen:
> Bei der Init (S. 14):
>> Beispiel-Initialisierung mit ACMD41:
>> Send: 0x77 0x00 0x00 0x00 0x00 0x01 (CMD55, das "Prefix" fur ein ACMD)
>> Recv: 0x01 (R1-Antwort mit dem "In Idle State"-Bit gesetzt.)
> Hab ich das richtig verstanden, dass ich erst die 6 Byte senden muss und
> dann ein 0xFF um die Antwort zu lesen?
>
> Beim Lesen von Daten (S. 15):
> Beispiel:
>> Send: 0x51 0x00 0x00 0x08 0x00 0x01 (CMD17, Lese Block ab Byte 2048)
>> Recv: 0x00 (R1-Antwort: Alles OK)
>> Recv: 0xfe 0x4e 0x65 0x72 0x64 0x21 ..... 0xa7 0x22
> Muss ich hier dann nach dem Befehl (6 Bytes) 0xFF senden um die R1
> Antwort zu erhalten und dann so lange 0xFF bis ich den Data Token 0xFE
> erhalte  und dann noch 512+2 (Daten + CRC) mal bis ich alle Daten habe.

von Max H. (hartl192)


Lesenswert?

Danke für deine Antwort, ich habe es aber mittlerweile geschafft die 
SD-Karte zu Initialisieren und zu lesen.

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.