Forum: Compiler & IDEs ATMEGA FAT 16 Problem


von Thomas (Gast)


Lesenswert?

Hallo

Ich habe folgendes Problem und zwar versuche ich schon seid tagen eine 
Kommunikation mit meiner 1GB-2GB SD-Karte über FAT zu bekommen.

Erstmal:
Verwendet ATMEGA32 bei 16MHz auf dem ATMEL Evaluations-Board Version 2.0 
(gab’s bei Pollin)
Sd-Karten:
1GB HAMA
2GB CnMemory

SD-Kartenslot ist ne Mischung aus Pegelanpassung mit Widerständen und 
für den Datenrückkanal Levelshifting über 2 Transistoren "C549B". 
(Mischung aus Herrn Radig´s Optimal und Minimal Schaltung.)

soviel zur Hardware.

So es geht soweit das ich mit Kommandos init usw. CSD CID bekomme aber 
sobald ich anfange mit FAT (Karte FAT16 Formatiert Standard, 16k für 
eine Zuordnungseinheit "anders will Windows nicht") bekomme ich nichts 
mehr, bzw. Programm sitzt in einer Schleife fest.

Habe die Programme von Herrn Radig und Herrn Klabunde probiert beides 
mit selben Ergebnis habe dann beim Herrn Klabundes Programm FATMulti41 
so gut wie alle Kommentare reingenommen und auch zusätzlich welche 
eingefügt und somit rausgefunden das das Programm bei
GETDriveInformation() beim Aufruf:
   by=ReadSector(0,dirbuf);
und dort bei: Siehe unten beim <--- in der while schleife hängt.

wenn ihr euch wundert welchen wert by annimmt, es ist 0 und 255 also 
0x00 und 0xFF.

Ich weiß echt nicht mehr weiter weil mir die Idee ausgeht.

Sachen wie LowLevel Format der SD-Karten und sowas hab ich alles schon 
probiert.

Danke schon mal an alle.

Mfg Thomas
1
   U8 MMCReadSector(U32 sector, U16 *buf)
2
//######################################################
3
{
4
 U16 i;
5
 U8 by;
6
 U8  tmpSPSR;
7
// U8  tmpSPCR;
8
9
#ifdef MMC_DEBUG_SECTORS
10
 printf("RS %lu 0x%08lX\n",sector,sector);
11
#endif
12
13
#ifdef CHECK_MAXSECTOR
14
 if(sector>=maxsect) return 1; //sectornumber too big
15
#endif
16
 printf("MMC_R_S_1\n");
17
 //tmpSPCR = SPI_CTRL_REGISTER;
18
 tmpSPSR = SPI_STATUS_REGISTER; //save old value
19
 printf("MMC_R_S_2\n");
20
 SPI_STATUS_REGISTER = (1<<SPI2X);    //give me double speed
21
22
// MMC_CS_OFF(); // moved to MMCCommand()
23
24
//calculate startadress of the sector
25
// startadr=sector;                // this is the blockadress for SDHC
26
27
// if(card_capacity==STANDARD_CAPACITY) sector *= BYTE_PER_SEC; // SD/MMC This will work only up to 4GB
28
 printf("MMC_R_S_3\n");
29
30
 if(card_capacity==STANDARD_CAPACITY) sector <<= 9; // SD/MMC This will work only up to 4GB
31
 printf("MMC_R_S_4\n");
32
 
33
 by=MMCCommand(MMC_READ_BLOCK,sector);
34
35
 while(by!=START_BLOCK_TOKEN)
36
  {
37
   SPI_WRITE(DUMMY_WRITE);
38
   SPI_WAIT();
39
   printf("MMC_R_S_4_1 - By = %d\n",by); <------ In dieser While Schleife
40
41
   by=SPI_DATA_REGISTER; // wait for card response
42
43
#ifdef MMC_DEBUG_COMMANDS
44
// no way to come out of this :( skip this sector !?
45
     if(by==0x01) // ERROR !
46
      {
47
       // One of my SD cards sends this error. My cardreader has also
48
       // problems to read (NOT write !) the card completely. Trash. 
49
       printf("\nRead error 0x01 at sector %lu !\n",sector);
50
51
       MMC_CS_ON();
52
53
// SPI_CTRL_REGISTER = tmpSPCR;    //restore old value
54
       SPI_STATUS_REGISTER = tmpSPSR;    //restore old value
55
56
       // data buffer is not valid at this point !
57
       return 1;
58
      }
59
#endif      
60
  }

von Thomas (Gast)


Lesenswert?

Ach ja:

Das kommt am PC per Terminal an:

Cmd 55: 0xFF 0x01
Send ACMD41
Cmd 41: 0xFF 0x00
ACMD41 retrys 1
Read CSD
Cmd 09: 0xFF 0x00
 0x00 0x2F 0x00 0x32 0x5F 0x59 0x83 0xB8 0x6D 0xB7 0xFF 0x9F 0x96 0x40 
0x00 0xE7

CSD done
CSD_STRUCT 0
SPEC_VERSION 0
SD card
c_size 3809 , c_size_mult 512
DriveSize 975360 kB , maxsect 1950720
mmc_init() ok
IDENTMEDIA = 0
dirbuf = 409
RS 0 0x00000000
MMC_R_S_1
MMC_R_S_2
MMC_R_S_3
MMC_R_S_4
Cmd 17: 0xFF 0x00

und dann eben die schleife mit 4_1

von holger (Gast)


Lesenswert?

Das hier ist dein Problem:

// Switch to high speed SPI
// SPR1=0; //SPI Clock = f/4 = 4MHz @16MHz Clock
// SPR0=0; //or f/2 if SPI2X = 1 in SPSR register
 SPI_CTRL_REGISTER = (1<<SPE) | (1<<MSTR);

// SPSR SPI Statusregister
// SPI2X=1; //Double speed for SPI = 8MHz @16MHz Clock
 SPI_STATUS_REGISTER = (1<<SPI2X);    //give me double speed

Am Ende von MMCIdentify() wird auf Vollgas umgeschaltet.
8MHz SPI Speed bei 16MHz Takt z.B. Durch die Init kommst
du nur weil die bei sehr langsamen Takt durchgeführt wird.

Für hohe Takte ist deine MMC/SD Anbindung mit Spannungsteiler
und Transistoren als Levelkonverter nicht geeignet.
Du könntest die beiden Zeilen mal auskommentieren, aber
dann wird das lesen und schreiben doch recht langsam sein.

von bastler (Gast)


Lesenswert?

...SD-Kartenslot ist ne Mischung aus Pegelanpassung mit Widerständen und
für den Datenrückkanal Levelshifting über 2 Transistoren "C549B"....



das ist die krankheit für dein fehlerrhaftes verhalten in der verbindung 
mit der karte.

von holger (Gast)


Lesenswert?

Kleiner Nachtrag:

FatMulti ist für ATMega32 auch nicht wirklich geeignet.
Da ist je nach Einstellung das RAM ganz schnell am Ende.
Für ATMega32 nimm lieber FATSingleOpt41.

von Thomas (Gast)


Lesenswert?

Hey Danke

Werd ich gleich mal Testen

MfG

Thomas

von Thomas (Gast)


Lesenswert?

Hallo nochmal

Ich hab wie beschrieben beide Zeilen auskommentiert und zur Sicherheit 
noch mal die Mhz auf 2 Mhz runtergeschraubt.



und läuft nun durch die tests, allerdings mit FAT unknown.

Liegt dies auch an der schlechten Anbindung? (hatte ich eh nicht vor das 
so zu  lassen)

ps. noch ne zwischenfrage.

Ich hab eigentlich vor die Anbindung über nen 74HCT125, 74LVX04 zu 
machen, bzw. nun die Frage ob ich Daten Hin- und Rückkanal über nur 
einen 74HCT125 machen kann, geht das ? Ich hab ne Realisierung gesehnen 
wo dies für eine RS232 Schnittstelle gemacht wurde, bin mir aber nicht 
sicher ob das dann auch für eine SD-Karten Anbindung klappt(also mit 
einem Chip) werde dementsprechent nicht aus den Datenblättern schlau.


Mfg
Thomas

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.