Forum: Mikrocontroller und Digitale Elektronik Erase Kommando MMC Karte


von Wolfgang Hoch (Gast)


Lesenswert?

Hallo,

ich wollte Fragen ob sich schon jemand mit dem Erase Kommando der MMC
Karte im SPI Modus beschäftigt hat und mir Infos über die Funktion
geben kann.

Ich habe Probleme bei der Definition, welchen Speicherbereich ich
löschen möchte.

Erase Groups usw.....

Danke

Wolfgang

von Max (Gast)


Lesenswert?

Hallo Wolfgang!

Ich habe mich mal mit dem Löschbefehl beschäftigt.
Es ist aber schon wieder lange her. Aber ich habe damals
eine Funktion programmiert, die es erlaubt, bestimmte
Speicherbereichte, die man angibt, löscht.
Man gibt hier die Start und Endadresse, des zu löschenden Bereichs an.
Hier der Code:


void sd_ende (void)
{
 sd_card_cs=1;
 spi(0xff);
}

//Sendet ein Commando an die MMC/SD-Karte
char sd_write_command (char *CMD)
{
        unsigned int a;
  char tmp = 0xff;
  unsigned int Timeout = 0;
  //sendet 8 Clock Impulse
  //sd_ende();
        //delay_ms(1);
  //sendet 6 Byte Commando
  sd_card_cs=0;

  for (a = 0;a<0x06;a++) //sendet 6 Byte Commando zur MMC/SD-Karte
    {
    spi(*CMD++);
    }

  while (tmp == 0xff)  //Wartet auf ein gültige Antwort von der
MMC/SD-Karte
    {
    tmp = spi(0xFF);
    Timeout++;
    if (Timeout > 10)
      {
      #ifdef sd_debug
      printf ("Keine Antwort nach dem Senden eines Kommandos\r\n");
      #endif
      break; //Abbruch da die MMC/SD-Karte nicht Antwortet
      }
    }
  return(tmp);
}

//Routine zum Löschen der SD-Karte(SPI-MODE)
char sd_loeschen (unsigned long addrs,unsigned long addrz)
{
  char tmp;
  unsigned int a;

  char CMD32[] = {0x60,0x00,0x00,0x00,0x00,0xFF};
  char CMD33[] = {0x61,0x00,0x00,0x00,0x00,0xFF};
  char CMD38[] = {0x66,0x00,0x00,0x00,0x00,0xFF};

  /*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
    addr wird von Blocks auf Bytes umgerechnet danach werden
    diese in das Commando eingefügt*/

       addrs = addrs << 9; //addr = addr * 512
       addrz = addrz << 9; //addr = addr * 512


  CMD32[1] = ((addrs & 0xFF000000) >>24 );
  CMD32[2] = ((addrs & 0x00FF0000) >>16 );
  CMD32[3] = ((addrs & 0x0000FF00) >>8 );
  CMD33[1] = ((addrz & 0xFF000000) >>24 );
  CMD33[2] = ((addrz & 0x00FF0000) >>16 );
  CMD33[3] = ((addrz & 0x0000FF00) >>8 );

  //Sendet Commando an MMC/SD-Karte
         if ((tmp=sd_write_command (CMD32)) != 0)
       {
         sd_ende();
          //printf("cmd32: %d\r\n",tmp);
      return(tmp);
        }
        sd_ende();
  if ((tmp=sd_write_command (CMD33)) != 0)
        {
          sd_ende();
            //printf("cmd33: %d\r\n",tmp);
      return(tmp);
            }
        sd_ende();
         if ((tmp=sd_write_command (CMD38)) != 0)
         {
      sd_ende();
        //printf("cmd38: %d\r\n",tmp);
      return(tmp);
          }

  while(spi(0xff)==0);
  sd_ende();
  return(0);
}

Tschüss

Max

von Wolfgang Hoch (Gast)


Lesenswert?

Hallo Max,

danke für Deine Antwort. Leider hilft sie mir nicht weiter. Du
verwendest in Deinen Sourcen die Kommandos CMD32 und CMD33. Diese
scheinen aber von den MMC Karten nicht bzw. nicht mehr unterstützt zu
werden.

Bei CMD32 zum Beispiel antwortet die Karte mit R1 = 0x04, Illegal
Command.

Die einzigen Kommandos die akzeptiert werden sind CMD35, CMD36 und
CMD38. Allerdings kann ich als Adressen in den Kommandos angeben was
ich will, es wird immer derselbe Bereich gelöscht, bzw. nicht
gelöscht.

Mittlerweile habe ich auch schon Karten unterschiedlichster Hersteller
versucht.... Überall dasselbe Ergebnis.

Gruß

Wolfgang

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.