Forum: Mikrocontroller und Digitale Elektronik ARM Programmierung: MMC oder SD ?


von Christian J. (elektroniker1968)


Lesenswert?

Hallo,

ich quäle mich derzeit dadurch für den LPC2368 mit integriertem 
Interface Code zu schreiben, ausnahmsweise mal selbst, damit ich auch 
verstehe was da abläuft. Als Grundlage dient sample Code von Keil, mci.c 
Der LPC bedient die Karte im Multimedia Mode, also nicht per SPI. Man 
füttert bestimmte Register mit Daten und den Rest macht die CPU, lenkt 
die Daten in einen Fifo oder per DMA, wobei ich DMA erstmal weglasse, 
das ist wieder eine andere Sache.

Jetzt habe ich mir die öffentliche SD Card Spec 2.0 von SAN Disk geholt 
und stelle fest, dass MMC und SD zwei Paar Schuhe sind, die Kommands 
sind völlig anders, die SD Card hat noch ACMD Kommandos, benutzt 
relative Adressen und man gewinnt den Eindruck, die haben einen 
kompletten Computer in diese Kärtchen gepackt, die Spec hat hunderte 
Seiten und da fehlen noch alle geheimen Strukturen, die nur an 
Mitglieder des Konsortiums gegeben werden.

Jetzzt übelege ich, MMC ist doch so langsam "out", ich habe noch zwei 
dieser Karten mit 64MB, alle andere sind SD mit den Rippen an den 
Kontakten.

Hat hier jemand schonmal für den LPC2368 Code geschrieben, der nur für 
SD Karten < 2GB läuft? Den Code von martin Thomas habe ich bereits 
gefunden, ist leider nicht sehr leserlich, da er komplett auf die Keil 
Routinen aufsetzt, um die Chan Fat Low Level Routinen abzubilden.

Hat da jemand Erfarung bzw ist diesen schweren Weg schonmal gegangen und 
hat vielleicht Code Schnipsel für mich?

Gruss,
Christian

von tuppes (Gast)


Lesenswert?

> ... um die Chan Fat Low Level Routinen abzubilden.

Du meinst mit Chan FAT das hier?

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

Bei den "Sample projects" ist ein vollständiges LPC2368-Beispiel, das 
habe ich just ans Rennen gekriegt, auf einem 2468. Ich würde das zur 
Nachahmung empfehlen.

von Christian J. (elektroniker1968)


Lesenswert?

Hallo,

ja, das habe ich auch, nur ist der Code eher "kryptisch", sehr stark auf 
das Keil Board zugeschnitten und baut ebenso auf Keil Routinen auf, die 
bei GNU nicht durchcompilieren, zB ist dort ein .s File mit Assembler, 
was Preprozessor Anweisungen enthält, die nur der Keil Compiler kennt. 
Keine Ahnung wie ich das in Gnu einbinden soll. Es liest den Fifo aus. 
Werde ich wohl in C umschreiben schreiben müssen. Ich habe ein Problem 
damit Code zu benutzen, den ich nicht ansatzweise durchschaue. Daher 
habe ich angefangen die Kernroutinen selbst zu schreiben, bzw. den Keil 
Code einzudeutschen, abzuspecken und lesbarer zu machen. Die Chat FAT 
selbst ist absolut unübersichtlich und man kann nur hoffen, dass da 
alles stimmt. 93kb Quelltext am Stück für die mit langen Dateinamen sind 
nicht jedermanns Sache.

Jedenfalls habe ich erstmal die Uart am Laufen, so dass ich mit hterm 
(sehr schönes Programm) sehenn kann was er von sich gibt.

von Tilo (Gast)


Lesenswert?

Ich konnte den Hardwarenahen Code problemlos auf einen ADUC (auch arm7) 
portieren. Als basis habe ich dafür die io-Funktion für einen AVR 
verwendet.

Mit DMA, IRQs etc. wird das ganze natürlich etwas komplizierter.

von Matthias N. (vbchaos)


Lesenswert?

Ich habe die Treiber für MMC/SD von Keil nach einigem Gebastel auch auf 
einem LPC 2378 zum Laufen bekommen. Ich hatte vorher keine Ahnung wie SD 
funktioniert, daher hab ich die Library zerhackstückt, bis sie lief. 
Gebe aber auch zu, dass jene wirklich mies programmiert und 
dokumentiert/kommentiert ist, aber sie funktioniert. Nachdem ich anhand 
des laufenden Codes die genaue funktionsweise der Kommandoablaeufe 
raushatte, habe ich die gesamte Library neu geschrieben, inklusive DMA. 
Jener hat mich am meisten genervt, weil man drauf achten muss, dass der 
zu kopierende Inhalt vorher im USB oder im ETHERNET RAM liegt, da der 
DMA nur darauf Zugriff hat.
Die Library unterstützt MMC sowie SD, wobei sich beide eindeutig anhand 
der Initialisierung unterscheiden lassen. Ich habe die Kommandos nicht 
mehr genau im Kopf, aber wenn ich mich recht erinnere, wird ein 
bestimmter Befehl gesendet um rauszufinden, obs MMC ist. Fällt die 
Antwort der Karte negativ aus, kann angenommen werden, dass MMC nicht 
vorliegt und die Initialisierung von SD kommt zum Zug. Auch hier der 
Ordnung halber auf korrekte Antwort abfragen. Die verschiedenen Modi 
(MMC ODER SD) werden erst danach betreten.
SD ist soweit ichs verstanden hab, nur eine Erweiterung der MMC karte 
und erlaubt z.B. einen erweiterten Befehlssatz, die MMC nicht kennt. 
Meine aber, dass schreib- und lesebefehle gleich sind.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Christian J. wrote:
> Hallo,
>
> ja, das habe ich auch, nur ist der Code eher "kryptisch", sehr stark auf
> das Keil Board zugeschnitten und baut ebenso auf Keil Routinen auf, die
> bei GNU nicht durchcompilieren, zB ist dort ein .s File mit Assembler,
> was Preprozessor Anweisungen enthält, die nur der Keil Compiler kennt.

Auf was bezieht sich das "ja". In dem von tuppes genannten Link findet 
man Beispiel von Chan für FAT inkl. Treiber LPC23xx/24xx MCI. Mein 
Gebastel (nicht efsl sondern LPC23xx MCI mit Chan-FAT) ist ein 
Kombination aus Chans FAT-Code und MCI Treiber-Code von NXP. Beides ist 
für Anwendung mit GNU-Tools gemacht.

> Keine Ahnung wie ich das in Gnu einbinden soll. Es liest den Fifo aus.

Eine Portierung des FIFO-Assembler-Codes aus dem NXP-Beispiel ist in 
meinem Gebastel enthalten. Chans Hilfsfunktionen in Assembler sind für 
schnelles kopieren von Blocks w.r.e von/zum USB-RAM ins "normale RAM" 
wegen der Seltsamheit dieser Controller, DMA nur in bestimmten 
Speicherbereichen zu bieten. Das kann man allerdings umgehen, indem man 
die Pufferspeicher der FFAT-structs (sector-buffer/dir-buffer) mittels 
section-attribut direkt im passendem RAM-Bereich ablegt. Wie auch immer, 
genanntes ist für GNU as, also nicht im Realview Assembler Syntax.

> Werde ich wohl in C umschreiben schreiben müssen. Ich habe ein Problem
> damit Code zu benutzen, den ich nicht ansatzweise durchschaue.

Es gibt noch eine Dokumentation von ARM für das LPC23xx/24xx MCI, PL190 
wenn richtig erinnert. Ist aber auch nicht wirklich informativ, sehr 
ähnlich dem LPC User-Manual. Mglw. informativ ist auch noch der Code aus 
dem Mass-Storage Beispiel aus der USB-Library von ST für STM32 mit 
SD-Card Host-Interface. Beim kurzen Überfliegen scheint es so, als sei 
die verwendete "Macrozelle" in den damit ausgestatteten STM32 ähnlich 
der in den LPC23xx/24xx.

> Daher habe ich angefangen die Kernroutinen selbst zu schreiben, bzw.
> den Keil Code einzudeutschen, abzuspecken und lesbarer zu machen.

Eindeutschen, nun denn, wer's braucht. Bei der Portierung von Code für 
RV oder IAR auf "vergessene" volatiles achten. Kommt ziemlich oft vor, 
mglw. erkenne diese Compiler irgendwie delay-loops und in ISRs 
mitgenutzte Variablen und optimieren das dann nicht "weg", anders kaum 
zu erklären, technisch falsch ist es dennoch.

> Die Chat FAT
> selbst ist absolut unübersichtlich und man kann nur hoffen, dass da
> alles stimmt. 93kb Quelltext am Stück für die mit langen Dateinamen sind
> nicht jedermanns Sache.

LFN in Chan's FAT - Danke für die Information, noch gar nicht gesehen.

Chans Code ist schon o.k. habe den inzwischen ein paarmal auf 
verschiedenen Plattformen erfolgreich eingesetzt, nicht nur für Gebastel 
sondern auch im Produktiveinsatz (allerdings nicht mit LPC23xx). Keine 
Probleme finden können, die auf den FAT-Code zurückzuführen waren.

libfat auf devkitpro mag dem Bedürfnis nach mehr Quellcodedateien näher 
kommen.

> Jedenfalls habe ich erstmal die Uart am Laufen, so dass ich mit hterm
> (sehr schönes Programm) sehenn kann was er von sich gibt.

von Christian J. (elektroniker1968)


Lesenswert?

Hallo,

danke für die ausführliche Antwort. Ich habe recht viel Erfahrung mit 
MMC Karten, zumindest habe ich die mit einem PIC ans Laufen bekommen 
aber ohne FAT sondern nur quasi 1000 Files mit fester Länge drüber 
gelegt, lassen sich auch vom PC nicht lesen. Der 2368 abstrahiert die 
Abstraktion der MMC nun wieder, was nicht ganz einfach zu verstehen ist, 
mit SPI war das einfacher. Die efsl habe ich auch ans Laufen gekriegt 
auf dem 2138. DMA und den Schnickschnack brauche ich nicht, ISRs nur wo 
nötig. Die Portierung des Fifo finde ich leider nicht, sorry Thomas aber 
durch Deinen Code blicke ich nicht durch. Ich programmiere zwar seit 20 
Jahren, auch sehr grosse Projekte aber die wachsen dann eben auf meinem 
Mist, Fremdcode ist immer ein Alptraum, wenn der nicht sauber 
strukturiert und kommentiert ist bzw zb ein Struktugramm Auskunft gibt, 
wie die Module zusammen arbeiten.

Werde mich mal morgen dran machen die Keil Funktionen auf der unteren 
Ebene einfach nur ans Laufen zu kriegen, Init, Sektor lesen, Sektor 
schreiben und freuen wenn wenigstens das schon mal funktioniert.

Gruss,
Christian

von Christian J. (elektroniker1968)


Lesenswert?

Und das hier liest bzw beschreibt wirklich nur den Hardware Fifo?
Kann man das stupide in ein .c File packen und dem GNU CC anbieten oder 
muss man dafür ein paar Verrenkungen machen?


Was ich bei Keil auch noch nicht verstehe ist, diese 4-Bit Sache. Meine 
SD karten haben alle nur einen Datenpin. Es gibt welche mit mehr Pins 
aber ich habe nur die mit 8 Pins. Wieso also 4 Bit Mode?

Zitat Keil Code.
ACMD6, SET_BUS_WIDTH, if it's SD card, we can
use the 4-bit bus instead of 1-bit.
1
    AREA MCIFIFO, CODE, READONLY
2
3
    EXPORT MCI_ReadFifo
4
    EXPORT MCI_WriteFifo
5
6
    ; int MCI_ReadFifo(unsigned int * dest);
7
    ; int MCI_WriteFifo(unsigned int * src);
8
src     RN 4
9
dst     RN 5
10
11
MCI_ReadFifo
12
    STMFD   sp!,{src,dst,r12,lr}
13
    LDR     src, mci_fifo
14
    MOV     dst, r0
15
    LDMIA   src, {r0-r3}
16
    STMIA   dst!, {r0-r3}
17
    LDMIA   src, {r0-r3}
18
    STMIA   dst!, {r0-r3}
19
    MOV     r0, dst
20
    LDMFD   sp!,{src,dst,r12,pc}
21
22
MCI_WriteFifo
23
    STMFD   sp!,{src,dst, r12,lr}
24
    LDR     dst, mci_fifo
25
    MOV     src, r0
26
    LDMIA   src!, {r0-r3}
27
    STMIA   dst, {r0-r3}
28
    LDMIA   src!, {r0-r3}
29
    STMIA   dst, {r0-r3}
30
    MOV     r0, src
31
    LDMFD   sp!,{src,dst,r12 ,pc}
32
33
mci_fifo
34
        DCD     0xE008C080
35
        END

von Matthias N. (vbchaos)


Lesenswert?

8 Pins? ich kenn SD mit 9 Pins, wobei 2 Pins direkt aneinander sind 
(Data0 und Data1), und MMC mit 7 Pins. SD mit 9 Pins haben 4 
Datenleitungen, die man dann nutzen kann.
Anschaulich hier:
http://elm-chan.org/docs/mmc/mmc_e.html

von Christian J. (elektroniker1968)


Lesenswert?

Hallo,

hast recht, benutzt habe ich immer nur einen beim PIC.
Immerhin kompiliert der Keil Code jetzt einwandfrei durch, wobei ich die 
Assemblerroutinen durch Leerroutinen ersetzt habe.

Ein paar dumme Fragen (aber ich bin halt Anfänger mit dem ARM7)

Ist das so richtig für den GNU? Eine beliebige Routine zur ISR 
deklarieren, damit er den richtigen Code dafür erzeugt? (abgeschrieben 
aus einem beispiel)

void _attribute_ ((interrupt("IRQ"))) MCI_IRQHandler (void)

Andere Frage, speziell an Martin: Was machen die Fifo Routinen oben 
genau, damit ich die in C schreiben kann?

Gruss,
Christian

von Schwab Daniel (Gast)


Lesenswert?

Hi

Hier noch ein anderer Code zu MMC und SD-Card. Unterstützt auch SDHC.
http://arm.hsz-t.ch

Gruss, Daniel

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.