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?
> 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
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.
> 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
>// 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.