Forum: Mikrocontroller und Digitale Elektronik SD FAT16 (keine Verbindung) Problem


von Dennis B. (Firma: Home) (deboman)


Angehängte Dateien:

Lesenswert?

Hallo,

ich brauche für mein Projekt eine Datenloggingfunktion. Diese wollte ich 
mit einer SD-Karte realisieren. Verschiedene Beiträge und Forenbeiträge 
habe ich durchstöbert und bin auf das Projekt GLogger gestoßen 
(http://www.mikrocontroller.net/articles/GPS_Logger). Messwerte 
aufnehmen auf der SD-Karte als z.B. txt speicher, fertig. Denkste...
Ich habe jeweils eine 16MB und 64MB SD-Karte zur Verfügung, die es 
damals bei den Digicams dabei gab. Beide habe ich mit Winxp auf FAT 
formatiert.

Ich habe den Quelltext des Projektes an mein Projekt angepasst.

Pinbelegung in der Datei mmc.h und die Aktivierung des CS im Quelltext, 
da dieser durch die Boardstruktur (Evaluation Board) auf PortG liegt 
(siehe Anhang der SD-Karten Adaptierung).
1
#define MMC_Write     PORTB 
2
#define MMC_WriteCS   PORTG //ChipSelectPin an PORTG (PG1)
3
#define MMC_Read      PINB
4
#define MMC_Direction_REG     DDRB
5
#define MMC_Direction_REGCS   DDRG
6
7
#define SPI_DI        3    
8
#define SPI_DO        2    
9
#define SPI_Clock      1    
10
#define MMC_Chip_Select      1    
11
#define SPI_SS        0

Ich habe den Quelltext mit dem JTAGGER und AvrStudio durchlaufen lassen.
Die if Abfrage löst immer aus und springt, dann auf while(1). Die 
Funktion mmc_init() gibt immer etwas ungleich 0 heraus. Ich weiß aber 
nicht woran es liegt.
Die Belegung der SD-Karte ist so angegeben wie der Schaltplan es vorgab.
1
int main(void)
2
{
3
  if ((mmc_init() != 0) || (InitFat16() != 0))
4
  {
5
  while(1);
6
  }
7
8
  File logFile;
9
  
10
  fopen_((unsigned char*)"log.txt",'a',&logFile);
11
  fputs_(&logFile,"***START***");
12
13
  while(1);
14
15
return (0);
16
}

Hat jemand vielleicht Anmerkungen bzw. kann mir einen kleinen Hint in 
die richtige Richtung geben?
Bin derzeit echt am Verzweifeln.

von Dennis B. (Firma: Home) (deboman)


Lesenswert?

Ich muss mich noch einmal zu Wort melden. Nachdem verschiedene Tests 
fehlgeschlagen sind, habe ich einen anderen Code implementiert 
(http://www.ulrichradig.de/home/index.php/avr/mmc-sd). Den Code von 
Ulrich Radig habe ich ebenfalls an meine Hardware angepasst. Mit der 
seriellen Verbindung und dem Terminal konnte ich die Ereignisse 
überwachen.
1
 
2
** Keine MMC/SD Karte gefunden!! **
3
** Keine MMC/SD Karte gefunden!! **
4
** Keine MMC/SD Karte gefunden!! **
5
** Keine MMC/SD Karte gefunden!! **
6
** Keine MMC/SD Karte gefunden!! **
7
** Keine MMC/SD Karte gefunden!! **
8
** Keine MMC/SD Karte gefunden!! **
Also konnte ich kein positive Fazit ziehen. Da habe ich mein Handy 
gesehen. Ich habe die MMC Karte aus meinem Nokia genommen ausprobiert. 
Und was passiert...es funktioniert. Aber wieso? SD und MMC Karten 
müssten doch kompatibel sein oder sehe ich das falsch?
Meine 16MB und 64MB Karte konnte an meinem CardReader einlesen und in 
Windows auch FAT formatieren. Liegt es vielleicht an der 
Windowsformatierung? Also das FAT != FAT16 ist?
Finde keine andere Formatiermöglichkeit. Partitionmagic erkennt keine SD 
Karten.

Jetzt stehe ich so ein bisschen auf dem Schlauch. Wer kann helfen? :)


Gruß Dennis

von holger (Gast)


Lesenswert?

>Liegt es vielleicht an der
>Windowsformatierung? Also das FAT != FAT16 ist?

Ja, das könnte gut sein. Deine 16MB Karte könnte auf
FAT12 formatiert worden sein. Dann haben einige FAT
Routinen Probleme damit wenn Sektor 0 eine Partitionstabelle
enthält (warum eigentlich?). Es wird also eine bestimmte
Formatierung der Karte erwartet. In der Regel FAT16 (FAT12 lohnt
ja auch kaum noch) und keine Partitionstabelle. Sektor 0 muss
also ein Bootsektor sein.

von Dennis B. (Firma: Home) (deboman)


Lesenswert?

@Holger
Danke für die schnelle Antwort. Jedoch ist die Formatierung "noch" nicht 
das Problem. Ich habe wieder etwas geschrieben ohne vorher nachzudenken.
1
//Initialisierung der MMC/SD-Karte
2
  usart_write("System Ready!\r\n");  
3
  while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten
4
    {
5
    usart_write("** Keine MMC/SD Karte gefunden!! **\n");  
6
    }
7
  usart_write("Karte gefunden!!\n");
8
  
9
  fat_init();//laden Cluster OFFSET und Size
10
  //Initialisierung der MMC/SD-Karte ENDE!

In dem Quelltext von Ulrich Radig wird zuerst die Karte initialisiert 
und danach wird die fat_init() aufgerufen. Meine 16er und 64er SD Karten 
springen schon nach der mmc_init() aus der Reihe und erreichen gar nicht 
die fat_init() Initialisierung. Nur meine 32MB MMC funktionert. Hmm

von Dennis B. (Firma: Home) (deboman)


Lesenswert?

EDIT:
So die SD-Karten funktioniere. Es lag lediglich an einer Jumperstellung 
auf dem EvaluationBoard. Anscheinend muss ich den PORTB auf Pullup und 
nicht auf den Pulldown Widerstand stehen haben. Nur wieso funktioniert 
die MMC mit dem Pulldownwiderstand und die SD-Karten nicht? Oo komisch

von Chris M. (Gast)


Lesenswert?

Hast Du mal die Spannungen hinter den Spannungsteilern gemessen?
Kommen da 3,3 Volt raus?

von Dennis B. (Firma: Home) (deboman)


Lesenswert?

Chris M. schrieb:
> Hast Du mal die Spannungen hinter den Spannungsteilern gemessen?
> Kommen da 3,3 Volt raus?

Ja die kommen raus. Klappt ja jetzt mit der Initialisierung. Nur wieso 
klappt es bei der MMC mit Pulldown R und bei den SD nicht. Und beide 
lassen sich mit ohne Pulldown R ansprechen. Hmm

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.