Laut SD Card Beschreibung gibt die SD Karte nach einem CMD0 Befehl ein 0x01 zurück.
Also wie schon beschrieben, ein Großteil meiner SD Karten machen das auch. Der Rest gibt sowas zurück:
- Cmd 00: 0x9F
Cmd 00: 0xFF 0x05
oder sowas
oder das noch
- Cmd 00: 0xBF
Cmd 00: 0xFF 0xC1
Nun dachte ich mir, mmh, es ist immer das erste Bit gesetzt. Ignorieren wir mal den Rest und sehen was passiert.
Die mmc_spi.c wie folgt geändert.
Originalversion:
Code:
for(i=0; i<CMD0_RETRYS; i++)
{
//send CMD0 for RESET
by=MMCCommand(MMC_CMD0,0);
if(by == IN_IDLE_STATE) break;
}
#ifdef MMC_DEBUG_CMD0_TIMEOUT
printf("CMD0 retrys %u\n", (U16)i);
#endif
if(by == IN_IDLE_STATE )
Teständerung:
Code:
for(i=0; i<CMD0_RETRYS; i++)
{
//send CMD0 for RESET
by=MMCCommand(MMC_CMD0,0);
if(by && IN_IDLE_STATE == IN_IDLE_STATE) break;
}
#ifdef MMC_DEBUG_CMD0_TIMEOUT
printf("CMD0 retrys %u\n", (U16)i);
#endif
if(by && IN_IDLE_STATE == IN_IDLE_STATE )
Ich habe also per AND den rest "rausgefilter".
Siehe da, ich bekomme per Debugmeldung die kompletten SD Kartendaten.
->
- CSD done
CSD_STRUCT 0
SPEC_VERSION 0
SD card
c_size 3919 , c_size_mult 128
DriveSize 250880 kB , maxsect 501760
mmc_init() ok
RS 0 0x00000000
Cmd 17: 0xFF 0x00
FAT32
bootSecOffset 0
Reserved Sectors 38
FAT Sectors 977
Num. of FAT's 2
secPerCluster 4
BytesPerCluster 2048
FATFirstSector 38
FirstRootSector 1992
RootDirSectors 0
FirstDataSector 1992
maxsect 501760
FirstDirCluster 2
maxcluster 124944
RS 38 0x00000026
Cmd 17: 0xFF 0x00
Sieht ja erstmal gut aus. Allerdings haut er dann beim Beschreiben der Karte div. Fehler mit rein.
Ist natürlich die Strafe für das ignorieren der anderen Rückgabeflags.
Ich bekomme zwar die Kartendaten raus, bei einer 256MB Karte kann ich auch dann Daten schreiben. Die anderen bleiben jedoch "Schreibresistent".Kann mir mal jemand einen Tipp geben wo mein Denkfehler liegt.
Und eine Sache verstehe ich erst recht nicht, warum arbeitet Bascom mit allen Karten ohne Probleme?
Gruß,
Stephan
Lesezeichen