Ich kann keine SD-Karten über SPI auslesen. Bei meinen MMC-Karten geht aber alles einwandfrei. Als Controller mehme ich den PIC18F6680 Versorgungsspannung 5V. Für die 3,3V der Karte habe ich sowohl Spannungsteiler mit Widerständen als auch Treiber schon erfolgreich getestet (mit MMC). Auch etwas längere Kabel von der SD zum PIC machen mir keine Probleme. Meine Taktfrequenz ist mittlerweile sehr klein, diese habe ich von zunächst 400kHz auf etwa 6 KHz langsamer gemacht. Auch der ACMD41-Befehl wird anstandslos akzeptiert. Danach sende ich optional CMD1. Ich sende alles 100-mal oder mehr, bis zum timeout. Wenn dann Fehler, nochmal von vorne. Alles OK. Auch bei einem timeout von 65000 bekomme ich am Ende nur falsche Werte. Mehrmals-Initialisierungen oder mehr als 80 clocks im disable-mode: alles umsonst. Die SD habe ich genauso angeschlossen wie die MMC, denn die 2 zusätzlichen Anschlüsse brauche ich nicht, obwohl ich schon mit pull-ups und pull-downs experimentiert habe. Allerdings sieht die Pegelfolge vollkommen anders aus als bei einer MMC die funktioniert. Vielleicht kann aber hier jemand etwas mit anfangen: ich lese zunächst nur die 512 Bytes des Bootsektors und erhalte immer: 43 52 30 30 30 30 30 31 54 58 usw. Richtig wäre aber: EB 3C 90 4D 53 44 4F 53 35 2E usw. Mit einer (einzigen) SanDisk funktioniert das sogar richtig, allerdings kann ich diese nicht beschreiben, macht nur Fehler ! Zum Lesen im PC benutze ich WinHex, mit dem ich die Karte im Cardreader auslese. Einen logischen Zusammenhang kann ich hier oben nicht feststellen. Es werden weder Bits verschluckt noch vertauscht. Bei einer anderen SD kann ich immer nur 00 00 00 00 usw. auslesen, warum? Kommt das hier jemandem bekannt vor oder hat jemand eine Idee, warum die MMC-Karten über SPI gehen, die SD-Karten aber alle nicht?
Wenn Du von der Karte etwas liest, welchen Pegel hast Du dann am MOSI-Pin anliegen? Der muß nämlich immer 1 sein! Sonst funktioniert bei manchen Karten alles wunderbar und bei anderen läuft garnichts... Ohne Quelltext zu sehen kann man Dir hier wohl kaum weiterhelfen. Da Du scheinbar ein systematisches Fehlersymptom hast, wird es wohl ein Problem in der Software sein.
Also den Unterschied zwischen MMC und SD kann ich mir nicht erklären, allerdings scheinen einige Hexeditoren unter Windows (laut http://www.pjrc.com/tech/8051/ide/fat32.html auch Winhex) nicht mit dem Bootsektor der Karte, sondern mit dem Header der ersten Partition zu beginnen, hatte mich bei meinen ersten Gehversuchen auch verwirrt. Wenn allerdings mit der MMC Karte alles passt, kann's das eigentlich nicht sein, tut mir leid.
Zunächst mal danke für die prompten Antworten. @ Bartholomäus Habe ich auch schon gedacht aber nicht weiter verfolgt. Ich meinte den Sektor Stelle 00, der auch in WinHex als Bootsektor benannt wird. @ günny Was meinst du mit MOSI-Pin? Falls chip-select der SD-Karte: 5V vom PIC. falls SD-out von der SD: 3,3V direkt am PIC-Eingang, bei der Schaltung mit Treiber sind es dann 5V. Die mmc_init() hänge ich mal an. Geschrieben in C mit Compiler von Reichmann.
Ups, der Anhang hat wohl nicht geklappt. Hier nochmal
Probier mal folgende SPI Einstellungen: SSPSTAT=0b01000000; //Sample at middle of output,output at rising sck edge SSPCON1=0b00100010; //SPI Enable, FOSC/64,Master Mode,Clock Idle level = 0 Das hier solltest du bei SD Cards besser vor jedem Kommando machen mmc_disable; //extra clock to allow mmc to finish SPI(0xFF); mmc_enable;
@ holger Vielen Dank. Leider hat das aber nichts gebracht, denn der Controller macht jetzt nur noch Reset. Meines Erachtens muß die Karte ständig enabled bleiben. Ein Versuch war es aber wert. Also: auf anderem Wege weiterversuchen.
Nächster Versuch. Vielleicht hat hier jemand eine Antwort drauf: Ich habe gerade bemerkt, daß mein response auch dann positiv beantwortet wird, wenn ich gar keine Karte im Slot habe. D.h. ich erhalte eine gültige Antwort via SDI, obwohl der Controller der SD-Karte nichts senden kann, weil er ja gar nicht vorhanden ist. Natürlich habe ich schon mit pull-up und auch pull-down rumgespielt. Auch mit dem Richtungsregister und den Eingang vorher auf high oder low ziehen. Wie gesagt: bei MMC klappts, da steigt er beim timeout aus (ohne ACMD41 natürlich, dieser Befehl darf bei MMCs nicht verwendet werden!) ...
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.