Forum: Mikrocontroller und Digitale Elektronik Problem bei Initialisierung von Fat Fs nach Elm Chan/Frank Zhao mit ATMEGA 32


von michl (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen
wegen meiner Bachelorarbeit arbeite ich mich gerade zum ersten Mal in 
die Programmierung von Mikrokontrollern ein. Im Zuge dessen habe ich 
natürlich bei einfachen Sachen wie dem blinken von LEDs angefangen und 
auch schon einen LCD zum Laufen gebracht.
Jedoch muss ich als nächstes eine SD-Karte beschreiben und auslesen.
Dies soll durch Chans FAT FS (http://elm-chan.org/fsw/ff/00index_e.html) 
geschehen. Da ich als Basis einen ATMEGA 32 hernehme, habe ich versucht 
mich an das Tutorial von Frank Zhao 
zuhalten(http://www.frank-zhao.com/cache/fat_sd.php).
Jedoch habe ich das Problem, dass ich irgendwo einen Fehler gemacht 
haben muss, da ich die SD-Karte nicht initialisiert bekomme. Soweit ich 
den Code verstanden habe, liegt dies an der Zeile "  if (send_cmd(CMD0, 
0) == 1) ", bzw daran, dass ich dann nicht den if Befehl abarbeite 
sondern diesen überspringe da " send_cmd(CMD0, 0)" scheinbar nicht eins 
wird.  Auch meine ich, dass ich bei "xchg_spi" eine Endlosschleife habe.
Da ich noch sehr neu auf diesem Gebiet bin und nur Grundkenntnisse der 
C-Programmierung habe, fällt es mir schwer den  Fehler selber zu 
beheben. Deshalb würde ich mich über (ausführliche) Lösungsvorschläge 
sehr freuen.

In den Anhang lad ich Euch den von mir abgeänderten Code sowie 
Schaltplan und ein Photo des am Steckbrett aufgebauten Versuchs. Schon 
einmal vielen Dank im Voraus!
Michl

von Georg G. (df2au)


Lesenswert?

Ehe du weiter suchst: Investiere bitte in eine Handvoll 
Stützkondensatoren zwischen VCC und GND, jeweils direkt am IC und auch 
an der SD-Karte.

Wenn es dir dann noch gelingen sollte, den Schaltplan etwas 
übersichtlicher zu zeichnen, ist allen geholfen.

von Falk B. (falk)


Lesenswert?

http://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator

Ich hab vor einiger Zeit auch mit dem FATfs von ELM Chan gearbeitet, es 
lief auf Anhieb. Aber auch einer richtigen Platine, nicht so einem 
Drahtverhau.

von Olaf (Gast)


Lesenswert?

> wegen meiner Bachelorarbeit arbeite

Achte darauf niemals in die Hardwareentwicklung zu gehen.

> Photo des am Steckbrett aufgebauten Versuchs

Die Vorstellung eine SD-Karte ueber so einen wackeligen Drahtverhau 
anzusprechen ist geradezu absurd. Schau doch mal ins Datenblatt deiner 
SD-Karte mit welchem maximalen Bittakt die arbeiten kann und wie schnell 
dann wohl ihre Treiber/Reciever sind. Und dann ueberlegst du nochmal was 
du alles in Impulstechnik und Uebertragungstechnik gelernt hast.

Olaf

von michl (Gast)


Lesenswert?

Hallo zusammen,
vorab erst mal ein herzliches Dankeschön für die vielen Beiträge!
Ich hab jetzt, wie von Euch geraten, 100 nF Kerkos als 
Stützkondensatoren angebracht und den SD-Connector jetzt über Pinheader 
ans Steckbrett angeschlossen.
Jedoch kann ich die SD-Karte immer noch nicht initialisieren.
Deswegen wollt ich noch mal fragen, ob Euch was einfällt, das ich 
überprüfen kann?
Falls es was bringt, kann ich auch gerne noch mal ein aktuelles Photo 
vom Aufbau hoch laden.
Grüße Michl

von holger (Gast)


Lesenswert?

Mach mal einen Pullup 10k gegen 3V3 an Miso.

von michl (Gast)


Lesenswert?

Hallo zusammen,
mittlerweile läufts so weit, dass ich bis zum 
"send_smd(ACMD41,1UL<<30)"Teil des Codes komme. Dadurch sollte, soweit 
ich das verstanden habe, der Initialisierungsprozess der Karte gestartet 
werden. Ob die Initialisierung gelungen ist, sehe ich laut Elm Chan 
daran, dass die Antwort meiner Karte sich von  0x01 nach 0x00 ändert. 
Jedoch habe ich eine Änderung von 0x01 nach 0xFF.
Da Chan darauf hingewiesen hat, dass größere Karten länger brauchen, und 
ich eine Intenso 4 GB habe, verwende ich momentan als 
Initialisierungszeitrahmen 2000msec statt 1000msec.
Da der Code von Chan bei 0xFF abbricht, wollte ich fragen, ob die 
Antwort der Karte nach der Initialisierung (also 0x00 bzw. bei mir 0xFF) 
evtl. vom Hersteller abhängt, oder es was bringt, wenn ich den 
Initialisierungszeitrahmen nochmals vergrößere?
Grüße Michl

von Falk B. (falk)


Lesenswert?

@michl (Gast)

>daran, dass die Antwort meiner Karte sich von  0x01 nach 0x00 ändert.
>Jedoch habe ich eine Änderung von 0x01 nach 0xFF.
>Da Chan darauf hingewiesen hat, dass größere Karten länger brauchen, und
>ich eine Intenso 4 GB habe, verwende ich momentan als
>Initialisierungszeitrahmen 2000msec statt 1000msec.

Ich weiß gar nicht was du da auf Low Level Ebene rumbastelst. Wenn das 
alles gescheit verdrahtet ist, muss man sich damit keine Sekunde 
abplagen. Einfach die Funktion zur Initialisierung des Filesystems 
aufrufen und gut. Dann ach Datei öffnen und zugreifen. Fertig. Geht auch 
problemlos mit modernen Karten, hab ich vor wenigen Monaten mit 4 und 
8GM SDHC gemacht. Lief problemlos.

Ach ja, die 10K an MISO sind elementar wichtig! Hatte ich am Anfang auch 
vergessen!

von Georg G. (df2au)


Lesenswert?

Die 4GByte Karte wird eine High Density Karte sein. Elm-Chan war 
ursprünglich aber für Standard Karten gemacht.

von Falk B. (falk)


Lesenswert?

@ Georg G. (df2au)

>Die 4GByte Karte wird eine High Density Karte sein. Elm-Chan war
>ursprünglich aber für Standard Karten gemacht.

Die Zeit bleibt nicht stehen, SDHC Support ist dort schon viele Jahre 
drin.

von leluno (Gast)


Lesenswert?

Zumindest die neueren Atmegas funktionieren auch mit 3,3 Volt. Man kann 
sich damit die Pegelwandelung ersparen. Das erleichtert den Anschluss 
der sd-Karte ungemein.

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.