Forum: Mikrocontroller und Digitale Elektronik SD-Karten Probleme (mal wieder)


von Flo W. (Firma: privat) (florian1x)


Angehängte Dateien:

Lesenswert?

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

von Flo W. (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von Flo W. (Firma: privat) (florian1x)


Lesenswert?

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
Noch kein Account? Hier anmelden.