Hallo, ich arbeite nun schon einige Zeit an einer Bibliothek für SD-Karten... Dabei Funktionierte meine Initialisierung nicht so wieso Sie sollte, was aber nicht weiter schlimm war, da ich Single Blocks lesen und schreiben konnte. Jetzt will ich aber die multiple lese und Schreibzugriffe einbinden, was aber noch nicht so richtig will. Erstmal die Hardware: Entwickelt wird auf einem MyEthernet v2.03, welches mit einem ATMega644P bestückt ist. Als Speicherkarten kommen eine AData 256mb microSD Karte und eine Kingston 4GB MicroSDHC Karte Class 4. Den Quelltext für SD, UART und SPI hänge ich mal an. Die Methode zur Initialisierung ist sd_init(); Etwas genauer zu meinem Problem: Bei der Initialisierung gehe ich wie folgt vor: step 1: Set SPI Clock <400 step 2: Initialize Hardware step 3: CMD0 to reach IDLE mode step 4: CMD8 to check voltage range and get card version step 5: ACMD41 to initialize Card (again and again) step 6: If Step 5 not work try CMD1 (for MMCs) anschließend SPI CLock wieder hoch Schritte 1-3 funktionieren recht gut. cmd0: (nachfolgend meine Ausgabe über UART ... ich hoffe ist verständlich) Sending CMD: 0, ARGS: 0x0, 0x0, 0x0, 0x0, CRC: 0x95, recv.: 0x1. Auch wenn ich häufig erst ein 0x65 (parameter, address und illegal command error + idle state flag) auf mein erstes CMD0 zurück bekommen, nach ein paar versuchen mit cmd0 klappts dann. Schritt4: Als CMD8 schicke ich Sending CMD: 8, ARGS: 0x0, 0x0, 0x1, 0xaa, CRC: 0x87, recv.: 0x1 Also als Parameter 1 für 2,7-3,6V und aa als check pattern, da dies auf Seite 51 der Spezifikation als recommended steht. Das ganze natürlich noch mit passender CRC. Und wie man sieht kommt ja auch kein Fehler zurück. Anschließend lese ich die nächsten vier Byte, welche mir ja meine Parameter vom Command also 0x1AA zurück geben sollten bekommen tute ich aber nur ocr: 0x0 0x0 0x0 0x0. Demnach wird meine Voltage range nicht unterstützt... und das checkpattern stimmt nicht. Hat einer eine Ahnung warum dies so ist? Oder weiss was ich falsch mache? Ich hoffe soltle sich jemand meinen Quelltext anschaun, dass dieser nachvollziehbar ist. Habe viele Defines .. aber hab mir Mühe gegeben das zu kommentieren. Die Debug ausgaben sind teilweise etwas nervig ^^. Schritt 5: funktioniert auch wenn Schritt 4 gefailed hat. Sending CMD: 55, ARGS: 0x40, 0x0, 0x0, 0x0, CRC: 0xff, recv.: 0x1. Sending CMD: 41, ARGS: 0x40, 0x0, 0x0, 0x0, CRC: 0xff, recv.: 0x1. Sending CMD: 55, ARGS: 0x40, 0x0, 0x0, 0x0, CRC: 0xff, recv.: 0x1. Sending CMD: 41, ARGS: 0x40, 0x0, 0x0, 0x0, CRC: 0xff, recv.: 0x0. mit 0 bin ich ja dann initialisiert. Soviel zur Initialisierung ... Nun lesen und schreiben von single Blöcken funktioniert. Nun habe ich halt versucht da noch den Multiple support einzubringen. ich versuche erst mal nur sektor 0 auszulesen Sending CMD: 18, ARGS: 0x0, 0x0, 0x0, 0x0, CRC: 0xff, recv.: 0x0. ich weiss hier nicht, ob die karte eine 0 oder irgendwas anderes zurück geben sollte. Naja eigentlich ist eien 0 ja logisch da ich nicht im IDLE modus bin ... also das IDLE Flag auch nicht gesetzt ist. Eines noch zum Quelltext ich teste Hauptsächlich mit der 256mb karte ... weshalb ich ersma festcoded die übergebene sector nummer *512 rechne. ICh hoffe hier findet sich wer, der mit helfen kann. Sollten noch fragen bestehen um mir zu Helfen ... schießt los :P mfG Flo
keiner eine idee? Oder is die bescheibung zu lang? ich dachte mir wenn ich das mal ordentlich erkläre hilft das bei dder Lösung
>keiner eine idee? Oder is die bescheibung zu lang?
Schau in eine der gängigen LIBs für SD Karten?
Da werden alle deine Fragen beantwortet.
Multiblock ist bei 4kB RAM dann doch oversized und
gegenüber Singleblock auch nicht so viel schneller.
Ich hab schon reingeschaut und mach eigentlich auch nicht viel anders, naja viel falsch zu verstehen am Protokoll der Spezifikation ist ja nicht. Und ich hab eigentlich nur so 1kb bis 1,5kb zur Verfügung ^^. WAs das ganze noch mehr ausbremst :P. Naja muss ich halt nochn bissle weiter schaun.
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.