Forum: Mikrocontroller und Digitale Elektronik MMC Karten Unterschiede?


von Christian Julius (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich widme mich mal wieder meinem Minirechner und versuche eine gescheite 
MMC Kartenverwaltung aufzubauen, ohne gleich ein FAT System aufsetzen zu 
müssen, was ich für PIC sowieso nicht auftreiben kann.

Als Test habe ich Routinen geschrieben, die nach einem Zufallsprinzip 
Blocks beschreiben, lesen und vergleichen, so schnell wie möglich aber 
mit 250 khz Busrate wegen der Widerstandsteiler vor der Karte. Bei 
höehren Taktungen häufen sich leider die Fehler. Ich fange jeden 
Fehlercode ab, der von der Karte erzeugt werden kann.

Dabei fiel mir auf, dass das Programm was bei der einen Karte 
funktioniert bei einer anderen nur Fehler produzierte. Nach vielen 
Experimenten zeigte sich, dass ich vor JEDEM OpenSingleBlockForWrite 
eine Init Sequenz laufen lassen muss und vor jedem Lesen ebenfalls. Es 
scheint so als würden manche Karten nach Zugriffen einfach auf Idle Mode 
gehen. Leider verliere ich dadurch Zeit beim Zugriff aber die Fehlerrate 
ist 0, jetzt bei allen Karten.

Weiterhin fiel mir auf, dass manche Karten nach Kaltstart des Rechners 
sofort einen erfolgreichen Init duechliefen, bei andere musste ich erst 
mal die Spannungsversorgung programmgesteuert (3.3V Regler mit 
Power-Down-Mode) abschalten, alle Busleitungen low legen und 300ms 
warten und dann nochmal zuschalten, bis sie endlich reagierten. Nervig 
aber leider ist es so.

Kann das jemand so bestätigen?

von Olaf (Gast)


Lesenswert?

> ohne gleich ein FAT System aufsetzen zu
> müssen, was ich für PIC sowieso nicht auftreiben kann.

Wieso auftreiben? Selbst ist der Mann. :-P

> Bei höehren Taktungen häufen sich leider die Fehler.

Mit anderen Worten du weisst bereits das deine Hardware Murks ist, 
ignorierst das aber tapfer?
Das Problem wenn man seinen Hintern so nah am Feuer haengt, ist das auch
nicht jede Karte zu 100% gleich am Bus sein muss. Aber das merkst du
ja gerade.

> Ich fange jeden
> Fehlercode ab, der von der Karte erzeugt werden kann.

Du hast also auch CRC eingeschaltet?

> Kann das jemand so bestätigen?

Ich kann dir bestaetigen das sich laengst nicht alle Karten immer gleich
verhalten. Sowohl elektrisch, wie auch was ihre Statemachine angeht.
Du musst das ganze flexibel programieren. Ein Beispiel dafuer sind z.B
die Wartezeiten wo eine Karte 0xff schickt bis sie bereit ist. Einige
Karten schicken sofort ein R1 Token weil sie fertig sind, andere lassen 
sich da durchaus mal ein paar Bytes zeit.
Und wenn da was schief geht ohne das du es merkst, dann haengt bei 
deinem naechsten Befehl vielleicht noch ein halber Datenblock im Puffer 
der Karte.

Olaf

von Christian Julius (Gast)


Lesenswert?

Hallo Olaf,

in einem hast Du recht: Sobal die 74LV08 Treiber da sind werden die 
eingebaut, diese Mukrserei mit den Widerständen ist Kappes. Aber mann 
wollte ja schnelle Ergebnisse haben. An dem Code finde ich nichts mehr, 
kenne die Spec langsam in und auswendig.

von holger (Gast)


Lesenswert?

> müssen, was ich für PIC sowieso nicht auftreiben kann.

Welchen PIC benutzt du denn ?

von Olaf (Gast)


Lesenswert?

> An dem Code finde ich nichts mehr,
> kenne die Spec langsam in und auswendig.

Das habe ich auch mal gedacht. Die Erleuchtungen kommen einem erst wenn
man einen ganzen Berg verschiedener Karten zum ausprobieren und 
idealerweise einen Logicanalyzer hat.

Vielleicht noch ein Tip. Wenn es problematisch wird dann bau ich mir 
immer
eine Funktion mit einem FIFO. Dort wird jedes Byte reingeschickt was von 
der Karte kommt.
Sobald das Programm dann steht breche ich es im Debugger ab und schau
mir an was als letztes so ruebergekommen ist. Da kommt dann meisst die 
Erleuchtung.

Ausserdem schau mal auf die Seite von Elm-chan. Der erklaert da irgendwo 
das die Karten im SPI-Mode nicht immer zu 100% mit einem der vier 
moeglichen SPI-Modes kompatibel sind. Das ist Prozessorabhaengig und
haengt sehr vom Timing ab.

Olaf

von holger (Gast)


Lesenswert?

>// Sendet CMD1 wiederkehrend an die Karte
>if(++i >= 50)
>{
>  f_mmc_Error = TRUE;
>  mmc_ErrorCode = MMC_ERR_INIT1;

Kleiner Tip: Einige meiner Karten brauchen mehr als
50 Versuche für CMD1. Highscore ist 230 !

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.