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


von Nico (prinzenrolle)


Lesenswert?

Hallo,
ich möchte gerne Sektor x bis Sektor y auf einer SD karte löschen:
1
BYTE MDD_SDSPI_Sector_Erase(DWORD sect_start,DWORD sect_end)
2
{
3
  MMC_RESPONSE response;  
4
  
5
  response = SendMMCCmd(TAG_SECTOR_START,sect_start << 9);
6
  if(response.r1._byte != 0x00)
7
    return 0;
8
  response = SendMMCCmd(TAG_SECTOR_END,sect_end << 9);
9
  if(response.r1._byte != 0x00)
10
    return 0;
11
  response = SendMMCCmd(ERASE,0x00);
12
  if(response.r1._byte != 0x00)
13
    return 0;
14
15
  return 1;  
16
}

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.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

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

Sascha

von Nico (prinzenrolle)


Lesenswert?

Hallo,
ich  vermute nicht da:
1
    // see if we are going to get a response
2
    if(sdmmc_cmdtable[cmd].responsetype == R1 || sdmmc_cmdtable[cmd].responsetype == R1b)
3
    {
4
        do
5
        {
6
            response.r1._byte = MDD_SDSPI_ReadMedia();
7
            timeout--;
8
        }while(response.r1._byte == MMC_FLOATING_BUS && timeout != 0);
9
    }
10
    else if(sdmmc_cmdtable[cmd].responsetype == R2)
11
    {
12
        MDD_SDSPI_ReadMedia();
13
        
14
        response.r2._byte1 = MDD_SDSPI_ReadMedia();
15
        response.r2._byte0 = MDD_SDSPI_ReadMedia();
16
    }
17
18
    if(sdmmc_cmdtable[cmd].responsetype == R1b)
19
    {
20
        response.r1._byte = 0x00;
21
        
22
        for(index =0; index < 0xFF && response.r1._byte == 0x00; index++)
23
        {
24
            timeout = 0xFFFF;
25
            
26
            do
27
            {
28
                response.r1._byte = MDD_SDSPI_ReadMedia();
29
                timeout--;
30
            }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?

von Sascha W. (sascha-w)


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

von Nico B. (Gast)


Lesenswert?

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

von Nico (prinzenrolle)


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!

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.