mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD-Karte Erase Sector CMD38


Autor: Nico B. (prinzenrolle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte gerne Sektor x bis Sektor y auf einer SD karte löschen:



BYTE MDD_SDSPI_Sector_Erase(DWORD sect_start,DWORD sect_end)
{
  MMC_RESPONSE response;  
  
  response = SendMMCCmd(TAG_SECTOR_START,sect_start << 9);
  if(response.r1._byte != 0x00)
    return 0;
  response = SendMMCCmd(TAG_SECTOR_END,sect_end << 9);
  if(response.r1._byte != 0x00)
    return 0;
  response = SendMMCCmd(ERASE,0x00);
  if(response.r1._byte != 0x00)
    return 0;

  return 1;  
}


ERASE ist CMD38 und die Antwort ist R1b. Leider ist die Antwort R1B 
immer ungleich null, was auf einen Fehler schließt, aber die Sektoren 
sind auf der Karte gelöscht.
Hat jemand auf einer SD-Karte Sektoren gelöscht, wenn ja wie?
Was mache ich falsch?

Die Funktion SendMMCCmd ist aus der Microchip library.

Vielen dank für die Hilfe.

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann's vielleicht sein das die Karte dafür etwas mehr Zeit braucht, und 
du das Ergebnis zu früh liest?

Sascha

Autor: Nico B. (prinzenrolle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich  vermute nicht da:
    // see if we are going to get a response
    if(sdmmc_cmdtable[cmd].responsetype == R1 || sdmmc_cmdtable[cmd].responsetype == R1b)
    {
        do
        {
            response.r1._byte = MDD_SDSPI_ReadMedia();
            timeout--;
        }while(response.r1._byte == MMC_FLOATING_BUS && timeout != 0);
    }
    else if(sdmmc_cmdtable[cmd].responsetype == R2)
    {
        MDD_SDSPI_ReadMedia();
        
        response.r2._byte1 = MDD_SDSPI_ReadMedia();
        response.r2._byte0 = MDD_SDSPI_ReadMedia();
    }

    if(sdmmc_cmdtable[cmd].responsetype == R1b)
    {
        response.r1._byte = 0x00;
        
        for(index =0; index < 0xFF && response.r1._byte == 0x00; index++)
        {
            timeout = 0xFFFF;
            
            do
            {
                response.r1._byte = MDD_SDSPI_ReadMedia();
                timeout--;
            }while(response.r1._byte == 0x00 && timeout != 0);

so wie ich das verstehe wartet der uc wenn es r1b ist so lange bis die 
antwort ungleich 0 ist oder?

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> so wie ich das verstehe wartet der uc wenn es r1b ist so lange bis die
> antwort ungleich 0 ist oder?
oder bis der Timeout abgelaufen ist, da keine def. Zeitfunktion 
verwendet wird müsste man mal schauen wie lang das dauert, und wie lange 
die Karte sich für ein Page-Erase Zeit lassen kann.

Sascha

Autor: Nico B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe mir die variable timeout angeschaut (ic-debugger)
hatte den wert 0xFFFE soweit ich mich erinner also auf jedenfall > 0

Autor: Nico B. (prinzenrolle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hat sonst noch jemand eine idee?
ein code schnipsel würde es auch tun.
ich sehe das doch richtig das die antwort auf cmd38 0 ist.
habe in der sandisk spec mal nachgeschaut.
gruß und danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.