www.mikrocontroller.net

Forum: Compiler & IDEs ATMEGA FAT 16 Problem


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
   U8 MMCReadSector(U32 sector, U16 *buf)
//######################################################
{
 U16 i;
 U8 by;
 U8  tmpSPSR;
// U8  tmpSPCR;

#ifdef MMC_DEBUG_SECTORS
 printf("RS %lu 0x%08lX\n",sector,sector);
#endif

#ifdef CHECK_MAXSECTOR
 if(sector>=maxsect) return 1; //sectornumber too big
#endif
 printf("MMC_R_S_1\n");
 //tmpSPCR = SPI_CTRL_REGISTER;
 tmpSPSR = SPI_STATUS_REGISTER; //save old value
 printf("MMC_R_S_2\n");
 SPI_STATUS_REGISTER = (1<<SPI2X);    //give me double speed

// MMC_CS_OFF(); // moved to MMCCommand()

//calculate startadress of the sector
// startadr=sector;                // this is the blockadress for SDHC

// if(card_capacity==STANDARD_CAPACITY) sector *= BYTE_PER_SEC; // SD/MMC This will work only up to 4GB
 printf("MMC_R_S_3\n");

 if(card_capacity==STANDARD_CAPACITY) sector <<= 9; // SD/MMC This will work only up to 4GB
 printf("MMC_R_S_4\n");
 
 by=MMCCommand(MMC_READ_BLOCK,sector);

 while(by!=START_BLOCK_TOKEN)
  {
   SPI_WRITE(DUMMY_WRITE);
   SPI_WAIT();
   printf("MMC_R_S_4_1 - By = %d\n",by); <------ In dieser While Schleife

   by=SPI_DATA_REGISTER; // wait for card response

#ifdef MMC_DEBUG_COMMANDS
// no way to come out of this :( skip this sector !?
     if(by==0x01) // ERROR !
      {
       // One of my SD cards sends this error. My cardreader has also
       // problems to read (NOT write !) the card completely. Trash. 
       printf("\nRead error 0x01 at sector %lu !\n",sector);

       MMC_CS_ON();

// SPI_CTRL_REGISTER = tmpSPCR;    //restore old value
       SPI_STATUS_REGISTER = tmpSPSR;    //restore old value

       // data buffer is not valid at this point !
       return 1;
      }
#endif      
  } 


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Danke

Werd ich gleich mal Testen

MfG

Thomas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.