Mal wieder: SD-Karte lässt sich nicht initialisieren.

Gast #1429002
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.
Angehängte Dateien:
Gast #1429023
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?
Gast #1429038
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?
Gast #1429048
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.
Gast #1429686
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?
Gast #1430222
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. :-(
Gast #1430276
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.
Angehängte Dateien:
Gast #1430344
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.
Gast #1430409
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...
Gast #1430544
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...
#1430929
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
Gast #1431028
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?
Gast #1431118
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.
Gast #1431150
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?
#1431161
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren