Programmierung / MMC64 antwortet nicht

Es gibt 8 Antworten in diesem Thema, welches 2.814 mal aufgerufen wurde. Der letzte Beitrag (5. Februar 2007 um 19:39) ist von DrCreep.

  • Hi! Ich habe mal anhand der auf Bitte melde dich an, um diesen Link zu sehen. veröffentlichten Programmier-Dokumentation versucht, ein paar Daten von meiner SD-Karte auszulesen. Im Prinzip habe ich erstmal nichts anderes gemacht, als die in der Anleitung beschriebenen Routinen zum Initialsieren und anschließenden Auslesen der Karte zu einem lauffähigen Programm zusammengefügt und mittels ACME kompiliert.
    Leider hängt sich das Programm bei mir in einer Endlosschleife auf, und zwar in der Subroutine "waitformmcdata". Hier sollte mir der SPI nach einem übermittelten Blocklesekommando ("CMD17") eigentlich mit $FE antworten. Diese Antwort bleibt aber leider aus; ich bekomme nur $FF. Als Indikator für diese Endlosschleife habe ich mal die Rahmenfarbe rotieren lassen.

    Habe ich etwa noch was übersehen? Oder liegt es vielleicht an meiner SD-Karte? ?(

    Ich hänge mal den Sourcecode und das ausführbare Programm an. Wenn alles klappt, sollten 512 Bytes von der Karte direkt sichtbar in den Bildschirmspeicher ab $0400 geschrieben werden. Wenn der Rahmen nicht mehr aufhört zu flackern, wartet das Programm noch auf das OK-Signal von der Karte (so wie bei mir :rolleyes: ).

    CU
    Kratznagel

  • Ich hatte genau das selbe Problem. Jetzt mach ich es etwas anders: Übermittlung der MMC-Befehle im 250 KHz modus mit $DF12 Abfrage. Genau weiss ich es nocht nicht, aber das Umschalten von Write Trigger auf Read Trigger scheint Problematisch zu sein. Man sollte es nur machen, wenn man sicher ist, daß gerade nichts übertragen wird. Also schön brav $DF12 vorher abfragen.

  • Hi,

    ich muss in den nächsten Tagen die Programmierdokus updaten, da einige MMC Karten sich unterschiedlich im Bezug auf das Senden von Kommandos verhalten. Beachte folgendes:

    1. Deselektiere die Karte beim ersten Sync Byte
    2. wenn das Kommando gesendet wurde, sende anstatt 2 Syncytes am Ende nur eines. Dann sende in einer Schleife weitere $FF Syncbytes, bis die Antwort ungleich $FF ist. Ich poste nachher mal Sources dazu.

    Folgende Sachen NICHT machen, solange das SPI busy ist:

    1. Zwischen Read- und Write Trigger hin und herschalten.
    2. Zwischen 250khz und 8Mhz hin und herschalten.
    3. Das SPI mit einen neuen Wert füttern.

    Gruß

    Oliver

  • O.K, werde ich mal austesten! Hmm, sollte ich SPI-Buisy vielleicht auch im 8MHz-Modus abfragen? ?(

    @Fröhn: Deine Methode habe ich mittlerweile auch angewendet, klappt auch grundsätzlich, nur schlägt immer noch jeder fünfte bis zehnte Leseversuch fehl.

    CU
    Kratznagel

  • Hi,

    Zitat

    Original von Kratznagel
    O.K, werde ich mal austesten! Hmm, sollte ich SPI-Buisy vielleicht auch im 8MHz-Modus abfragen? ?(
    l

    Nein, im 8Mhz Mode kannst Du nach Herzenslust die Hardware bangen.

    Anbei meine cmdsend Routine. Sie klappt sowohl bei 250khz als auch bei 8Mhz. in cmd1 steht das 6 Byte Kommando in Umgekehrter Reihenfolge wie in den PRogrammierdokus:

    Der code ist noch nicht 100% optimiert, da alles noch im Entwicklungsstadium ist.

    Gruß

    Oliver

  • Ich habe es gestern abend noch erfolgreich ausprobieren können. 8) Das Deselektieren der Karte beim ersten Sync Byte ermöglicht mir das Arbeiten im 8MHz-Modus. Wenn ich allerdings nach einem übermitelten Blocklesekommando das SPI nur auf ungleich $FF abfrage, bekomme ich danach beim eigentlichen Datenzugriff als erstes immer ein paar schrottige Bytes (eine Sequenz aus 5 bis 10 mal $FF, manchmal noch gefolgt von einem $FE. Erst danach bekomme ich echte Daten. Ein erneutes Blocklesekommando schlägt dann nach 512 Lesezugriffen natürlich fehl, da die letzten Bytes des vorherigen Blockes noch nicht ausgelesen wurden.
    Ich habe mir erstmal damit beholfen, wieder explizit auf $FE abzufragen, bevor ich den Datentransfer starte. so kriege ich auch grundsätzlich immer alle Daten eines Blockes mit 512 Lesezugriffen. Aber das klappt wiederum auch nicht bei jedem Block, da die Antwort des SPI offensichtlich nicht immer $FE ist.

    //edit: Kann es vielleicht auch sein, dass ich nur Adressbereiche von der Karte auslesen kann, deren Startadresse teilbar durch die voreingestellte Blocklänge ist? ;)

    CU
    Kratznagel

  • Hi Kratznagel,

    Zitat


    //edit: Kann es vielleicht auch sein, dass ich nur Adressbereiche von der Karte auslesen kann, deren Startadresse teilbar durch die voreingestellte Blocklänge ist? ;)

    Yep, genau so ist es! 8) Hätte ich vielleicht vorher noch dazu schreiben sollen... Ich poste hier mal den Link zur SD-Card Doku von Sandisk, die sehr ausführlich ist.

    Bitte melde dich an, um diesen Link zu sehen.

    Aber Vorsicht: NICHT die Kommandos benutzen, die nur SD-Karten können, da sonst Inkompatibilitäten zu MMC Karten entstehen können.

    Liebe Grüße

    Oliver

  • Zitat

    Original von Oliver_A
    Hi Kratznagel,


    Yep, genau so ist es! 8) Hätte ich vielleicht vorher noch dazu schreiben sollen... Ich poste hier mal den Link zur SD-Card Doku von Sandisk, die sehr ausführlich ist.


    Hehe ! Hätte ich DAS mal früher gesehen.

    Hatte die gleichen Probleme wie oben beschrieben, allerdings ist es mir doch durch wildes rumprobieren tatsächlich gelungen, von selbst drauf zu kommen :freude

    Hätte mir aber viel Zeit erspart, wenn ich doch bloß mal diesen Beitrag gelesen hätte :wand.

    Naja, wurscht - hauptsache es geht jetzt.