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 Aber es müsste ja eine 0x01 empfangen werden.
>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?
Du mußt die Karte länger clocken. Manche Karten brauchen bis zu 96 Clocks, bis sie auf CMD-0 antworten.
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. :-(
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.
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?
DO reicht in der Regel. Wenn Du's richtig machen willst, dann an Pins: 1, 2, 7, 8, 9.
>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...
Überleg dir mal was passiert, wenn du am Schleifer deines Potis drehst und der dabei mal abhebt.
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
@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?
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.