Forum: Mikrocontroller und Digitale Elektronik Mal wieder: SD-Karte lässt sich nicht initialisieren.


von Karlos (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich verwende für die SD-Karte den Sourcecode von hier: 
http://www.mikrocontroller.net/articles/AVR_FAT32

Allerdings habe ich das Problem, dass die Karte bei der Initialisierung 
nicht antwortet. :-(

Das Programm läuft auf einem ATmega16L @ 8MHz externen Quarz (Fuses sind 
entsprechend gesetzt). Die Spannungsversorgung beträgt für µC und Karte 
3,3V (LM317). Den Code habe ich nur leicht abgeändert, d.h. in der 
"mmc.h" die Angaben zum SPI hinzugefügt und in der main.c die 
UART-Kommunikation auskommentiert.

Die Karte habe ich direkt mit dem SPI verbunden. Zusätzlich habe ich an 
Vcc von Karte und µC Abblockkondensatoren angebracht. Den DO der Karte 
mit 10k gegen Vcc gelegt. Als Kartenslot verwende ich einen Socket vom 
Floppylaufwerk. Kontakt zur Karte ist gegeben.

Der CLK beträgt laut Oszi 62,5kHz, dürfte also keine Probleme in der 
Hinsicht geben.

Achso, ich habe zwei Karten getestet: 1GB HAMA, 512MB Kingston.

Der CMD0 wird schön gesendet, nur erhalte ich keine Antwort. ???

Ich hoffe ihr könnt mir helfen. Danke schön.

von holger (Gast)


Lesenswert?

>Der CMD0 wird schön gesendet, nur erhalte ich keine Antwort. ???

Das glaube ich nicht. Irgendeine Antwort bekommst du schon.
Es sei denn das SPI Modul hat sich aufgehängt.

Also: Wie lautet die Antwort? Oder hängt das SPI Modul?

von Karlos (Gast)


Lesenswert?

OK, hast recht es kommt natürlich was raus: 0xFF
Aber es müsste ja eine 0x01 empfangen werden.

von holger (Gast)


Lesenswert?

>OK, hast recht es kommt natürlich was raus: 0xFF

Geht also doch;)

>Aber es müsste ja eine 0x01 empfangen werden.

Könnte an deinem Wurstaufbau liegen.
Hat die Karte wirklich Kontakt?
MISO MOSI vertauscht?

von Karlos (Gast)


Lesenswert?

Was heißt Wurstaufbau? OK, die SChaltung ist auf Lochraster aufgebaut, 
aber das passt schon.

Die Karte hat kontakt, ich habe extra direkt an den Pads der Karte 
gemessen. MOSI und MISO habe ich auch zig-mal überprüft.

von Karlos (Gast)


Lesenswert?

Hm, ich habe es jetzt auch mal mit abgeklemmten USBprog, der ja auch an 
den SPI Leitungen hängt, probiert. Aber es brachte auch nicht den 
gewünschten Erfolg. :-(

Woran kann's nur liegen? Liegt's am Sourcecode?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Du mußt die Karte länger clocken. Manche Karten brauchen bis zu 96 
Clocks, bis sie auf CMD-0 antworten.

von Karlos (Gast)


Lesenswert?

Meinst du diesen Teil im sourcecode (mmc.c)?
1
//Initialisiere MMC/SD-Karte in den SPI-Mode
2
for (a = 0;a<0x0f;a++){ //Sendet min 74+ Clocks an die MMC/SD-Karte
3
   mmc_write_byte(0xff);
4
}

Das müssten doch 14(=0x0e)*8 = 112 "Clocks" sein.

Habe auch schon höhere Werte ohne Erfolg eingesetzt. :-(

von Daniel R. (zerrome)


Lesenswert?

Hallo,
ich vermute "#define MAX_SPEED FALSE" hast du auch schon probiert?

edit:

Mach doch mal ein Foto von der Schaltung und/oder nen Schaltplan. Weil 
das doch arg nach Hardware Fehler klingt...

Grüße Daniel

von Karlos (Gast)


Angehängte Dateien:

Lesenswert?

Ja, MAX_SPEED habe ich schon auf 0 gesetzt gehabt. Aber so wie ich das 
aus dem Code lese, wird die Geschwindigkeit erst bei CMD16 entsprechend 
hochgestzt. Soweit kommt es ja bei mir erst gar nicht.

Im Ahnhang ist eine Zeichnung wie ich die Karte verdrahtet habe. Ich 
hoffe es ist für euch lesbar.

von Gast (Gast)


Lesenswert?

47k Pullups an die Signalleitungen.

von Karlos (Gast)


Lesenswert?

47k an DI, DO und CLK der SD Karte? Oder nur DO? Ich habe nämlich nur 
was von DO mit Pullup gelsen. -> 
http://www.mikrocontroller.net/articles/MMC-_und_SD-Karten

Wieso reichen die internen Pullups eigentlich nicht?

von Gast (Gast)


Lesenswert?

DO reicht in der Regel. Wenn Du's richtig machen willst, dann an Pins:
1, 2, 7, 8, 9.

von holger (Gast)


Lesenswert?

>DO reicht in der Regel. Wenn Du's richtig machen willst, dann an Pins:
>1, 2, 7, 8, 9.

Alle Pins mit Pullup ist wohl etwas übertrieben.
Ein Pullup an CS der Karte macht aber Sinn wenn
dein Prommer mit an SPI hängt. CS floatet sonst
und nimmt dir evtl. ein paar ISP Befehle
vom Prommer krumm.

von Gast (Gast)


Lesenswert?

Die Pins sind aus der Sandisk Spec. Ob man alle genannten Signale mit 
Pullups bestückt, bleibt einem selbst überlassen. Ich habe schon SDs mit 
nur einem Pullup an DO problemlos laufen gehabt.

von Karlos (Gast)


Lesenswert?

Es hat einmal funktioniert!

Ich habe am DO den Pullup gegen 47k ausgetauscht und danach hat er die 
Datei TEST.TXT angelegt! Es scheint zwar noch einen Fehler gegeben zu 
haben, denn die Datei war laut Windows fehlerhaft und auch "leer".

Als ich dann aber die Datei gelöscht und wieder an den µC gesteckt habe, 
wars auch schon vorbei. Die Karte wird nicht mehr initialisiert.
Auch ein Pullup an CS hat nichts gebracht. :-(

So in Mist, hat doch fast geklappt...

von Rudi (Gast)


Lesenswert?

8&9 unbedingt PullUps hin. Bei den anderen könntest du ja auch die 
internen PullUps des AVR zuschalten, falls das möglich ist (kenn deinen 
Typ nicht). Vor allem bei CS, wenn noch weitere Sachen am SPI hängen. 
Machen andere SDs/MMCs dieselben Probleme? Schick außerdem mal ein Bild 
von deinem Aufbau evtl erkennt man ja darauf wo das Problem liegt...

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Überleg dir mal was passiert, wenn du am Schleifer deines Potis drehst 
und der dabei mal abhebt.

von Daniel R. (zerrome)


Lesenswert?

Ok, versuch mal diese defines:
1
#if defined (__AVR_ATmega16__)
2
  #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist 
3
  #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist
4
  #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk)
5
  #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist
6
  #define SPI_SS 4 //Nicht Benutz muss aber definiert werden
7
  #endif

Der richtige Slave Select (SS) des SPI Interfaces wird nicht benutzt, 
den willst du aber benutzen. Bei obigen defines, musst du den CS der 
Karte jetzt mit PB3 verbinden...So sollte das funktionieren



Grüße Daniel

von Karlos (Gast)


Lesenswert?

@Rudi

Ich werde die Pins 8 & 9 auch mit einem Pullups versehen sobald ich 
Daniels Einwand getestet habe.

@Abdul

Was hat das mit meinem Problem zu tun? Es handelt sich bei der Platine 
um einen Versuchsaufbau und kein Endgültiges Layout. Die Spannung habe 
ich zu Anfang (ohne µC und SD-Karte) auf 3,3V eingestellt und den 
Trimmer seitdem nicht mehr angerührt.

@Daniel

Auf dem Oszi sehe ich aber wie die SS leitung runter auf Low gezogen 
wird.

kannst du mir nochmal erklären was die genaue Bedeutung oder besser 
gesagt, was der Unterschied zwischen diesen beiden Defines ist.
1
  #define MMC_Chip_Select 
2
  #define SPI_SS
Beide Defines mit 4 bedlegen geht also nicht?

von Karlos (Gast)


Lesenswert?

OK ich habe die CS-Leitung der Karte auf PB3 gelegt und die defines so 
angepasst:
1
  #define MMC_Chip_Select 3
2
  #define SPI_SS          4

Hat sich aber leider nichts geändert. Karte antwortet immer noch nicht.
:-(
Ich bin auch alles Verbindungen nochmal durchgegangen und habe die 
Leitungen zur Karte durchgeklingelt. Soweit müsstte alles OK sein.

von Karlos (Gast)


Lesenswert?

Verzeiht mir die ganzen Doppelposts. Aber ich habe den Fehler gefunden!

Es lag an dem Floppysockel der als Slot für die Karte dient. Wenn die 
Karte zu weit drin steckt, schieben sich die Kontakte auf das Platik und 
haben dann keinen kontakt mehr zu den Pads der Karte! X-(
Das erklärt auch warum ich beim durchklingeln den Fehler nicht gefunden 
habe. Denn dazu habe ich die Karte ein stück rausgezogen, um mit der 
Messspitze an die Pads zu kommen.

Ich werde mir mal einen richtigen Kartenslot zulegen.

Also vielen Dank nochmal an alle, für eure Hilfe! :-)

Eine Frage hätte ich noch: Wieviele Leerzeichen müssen zwischen dem 
Dateinamen und der Endung der Funktion übergeben werden? Wieso sind das 
so viele?

von Daniel R. (zerrome)


Lesenswert?

Hm, dann bin ich auch relativ ratlos. Das einzige was mir da jetzt so 
noch einfällt, wäre das ich gerne mal ein Foto sehen würde....
Das es da nämlich einmal bei dir geklappt hat und danach nicht mehr 
deutet schon auf die Verdrahtung hin. Hatte ich auch schon mehrmals, zu 
luftig verdrahtet und dann gehts und mal nicht...

Wie programmierst du den Controller eigentlich? Auch über SPI?
Wenn ja, der Programmer hängt doch während du was mit der Karte machst 
nicht noch dran?!?

Am PC geht die Karte auf jeden Fall?

Hast du die Möglichkeit andere Karten zu testen?

Sind vielleicht die SPI Pins am Controller kaputt? Durch einen 
Kurzschluss oder dergleichen  beim testen?

Hm, sehe grade es hat geklappt :) na ja ich lass das hier oben mal als 
Ergänzung stehen ;)

Es muss bei einem Datei Namen immer 8 Zeichen Name und 3 Zeichen Endung 
geschrieben werden. Fehlende Zeichen sind durch Leerzeichen zu ersetzen. 
Is der FAT Standart...


Grüße Daniel

von Karlos (Gast)


Lesenswert?

@Daniel

OK, die Leerzeichen füllen die Fehlenden auf alles klar. Danke für deine 
Hilfe. :-)

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.