mikrocontroller.net

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


Autor: Karlos (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karlos (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Karlos (Gast)
Datum:

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

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

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

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karlos (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
47k Pullups an die Signalleitungen.

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

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

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, versuch mal diese defines:
#if defined (__AVR_ATmega16__)
  #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist 
  #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist
  #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk)
  #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist
  #define SPI_SS 4 //Nicht Benutz muss aber definiert werden
  #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

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
  #define MMC_Chip_Select 
  #define SPI_SS  
Beide Defines mit 4 bedlegen geht also nicht?

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK ich habe die CS-Leitung der Karte auf PB3 gelegt und die defines so 
angepasst:
  #define MMC_Chip_Select 3
  #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.

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Daniel

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.