So nun nach anfänglichen Startproblemen in C komm ich einigermasen mit dem Syntax klar.
Jetzt habe ich eine kleine Testroutine gebaut die per obiger Lib aine Datei mit 10000 Datensätzen schreibt.
Jetzt das Problem.
Hier liegen 10 SD KArten rum.
Folgende Karten funtkionieren:
1 x 2 GB HAMA Secure Digital Card
3 x 1 GB CNMemory First Class
Folgende Karten funktionieren nicht:
1 x 2 Gb Verbatim
3 x 512 MB Sandisk
2 x 256 TakeMS
Laut Scope sieht man auch, dass das Signalverhalten komplett verschieden ist.
Letzten Endes sind alle Karten per Windows in FAT16 formatiert.
Hier die beiden Ausgaben der Debugfunktion der Lib.
Ich werde nochmal Testen, inwieweit versch. Partitionierungen und Formatierungen Einfluß auf die Lesbarkeit haben.Code:Send CMD58 0x80 0xFF 0x80 0x00 Read CSD 0x00 0x2F 0x00 0x32 0x5F 0x59 0x83 0xBD 0xED 0xB7 0xFF 0x9F 0x96 0x40 0x00 0xA9 CSD done CSD_STRUCT 0 SPEC_VERSION 0 SD card c_size 3831 , c_size_mult 512 DriveSize 980992 kB , maxsect 1961984 mmc_init() ok FAT16 bootSecOffset 255 Reserved Sectors 1 FAT Sectors 240 Num. of FAT's 2 secPerCluster 32 BytesPerCluster 16384 FATFirstSector 256 FirstRootSector 736 RootDirSectors 32 FirstDataSector 768 maxsect 1961984 FirstDirCluster 0 maxcluster 61290 Send CMD58 0x80 0xFF 0x80 0x00 Read CSD 0x00 0x2F 0x00 0x32 0x5F 0x5A 0x83 0xB7 0x6D 0xB7 0xFF 0xBF 0x96 0x80 0x00 0xE9 CSD done read_bl_len is 1024 ! CSD_STRUCT 0 SPEC_VERSION 0 SD card c_size 3805 , c_size_mult 512 DriveSize 1948672 kB , maxsect 3897344 mmc_init() ok FAT16 bootSecOffset 0 Reserved Sectors 4 FAT Sectors 238 Num. of FAT's 2 secPerCluster 64 BytesPerCluster 32768 FATFirstSector 4 FirstRootSector 480 RootDirSectors 32 FirstDataSector 512 maxsect 3897344 FirstDirCluster 0 maxcluster 60890
Ach ja, ich nutze die FATSingleopt.zip von Holgers Seite. Kleine Änderungen wie das Entfernen der SPI Register Definitionen (sind wohl schon in AVRGCC definiert) muß man noch machen.
Wenn es dann läuft, ist der Zugriff wirklich flott. Die 10 000 Recordsets werden so in ca. 18 Sekunden geschrieben.
Hat mal jemand einen Tipp wie ich evtl. alle Karten ans laufen bekomme.
Gruß,
Stephan
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
- Cmd 00: 0x1F
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:
Teständerung: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 )
Ich habe also per AND den rest "rausgefilter".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 )
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