Hallo,
ich habe hier ein Problem mit dem SD-Karten Befehl CMD38.
Ich schreibe "roh" auf die SD-Karte.
Lesen und schreiben funktioniert soweit.
Ich nutze zum Schreiben auf die Karte die Funktionen der MDDLibrary
BYTE MDD_SDSPI_SectorRead(DWORD sector_addr, BYTE* buffer);
BYTE MDD_SDSPI_SectorWrite(DWORD sector_addr, BYTE* buffer, BYTE allowWriteToZero);
Jetzt würde ich gerne bestimmte Sektoren löschen, dies ist der befehl cmd38.
vorher muss cmd32 und cmd33 mit Start- und End -Adresse gesendet werden.
leider bekomme ich als Antwort immer eine ungleich 0 zurück.
der Antworttyp ist r1b.
hat jemand schon mal so etwas gemacht oder weiß
was ich falsch mache?
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;
}
MMC_RESPONSE SendMMCCmd(BYTE cmd, DWORD address)
{
WORD timeout = 0x8;
BYTE index;
MMC_RESPONSE response;
CMD_PACKET CmdPacket;
SD_CS = 0; //Card Select
// Copy over data
CmdPacket.cmd = sdmmc_cmdtable[cmd].CmdCode;
CmdPacket.address = address;
CmdPacket.crc = sdmmc_cmdtable[cmd].CRC; // Calc CRC here
CmdPacket.TRANSMIT_BIT = 1; //Set Tranmission bit
WriteSPIM(CmdPacket.cmd); //Send Command
WriteSPIM(CmdPacket.addr3); //Most Significant Byte
WriteSPIM(CmdPacket.addr2);
WriteSPIM(CmdPacket.addr1);
WriteSPIM(CmdPacket.addr0); //Least Significant Byte
WriteSPIM(CmdPacket.crc); //Send CRC
// 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);
}
}
mSend8ClkCycles(); //Required clocking (see spec)
// see if we are expecting data or not
if(!(sdmmc_cmdtable[cmd].moredataexpected))
SD_CS = 1;
return(response);
}