PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega644 & Fat von Holger Klabunde



stekohl
11.11.2008, 16:55
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.



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


Ich werde nochmal Testen, inwieweit versch. Partitionierungen und Formatierungen Einfluß auf die Lesbarkeit haben.

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

stekohl
13.11.2008, 00:03
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:

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:

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