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.
>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?
>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?
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.
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?
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
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.
>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.
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.
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...
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...
#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
@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.
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.
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?
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