Forum: Mikrocontroller und Digitale Elektronik SD - Karte nicht erkannt


von J. K. (rooot)


Lesenswert?

Hi,

ich möchte mit der Libery von mikro-control 
http://www.mikro-control.de/Joomla/index.php?option=com_weblinks&catid=20&Itemid=29

einen Datenlogger bauen.

Zuvor hatte ich die Ulrich - Radig Libery verwendet. das funtionierte 
auch ganz gut. Mein Problem ist, dass diese halt nur lesen unterstützt.
Karte wurde erkannt und funktionierte.

Jetzt möchte ich die oben erwähnte verwenden. Das in der Doku steht 
beschreiben, dass der low-level- Treiber angepasst werden muss. Die 
Libery verwendet Hadware SPI. (ich verwende einen AtMega16 bzw. 32)

Die Anpassung funktioniert eingentlich auch schon über 
Präprozessoranweisungen:
1
#if defined (__AVR_ATmega16__)
2
  #define SPI_DI        6    //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist 
3
  #define SPI_DO        5    //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist
4
  #define SPI_Clock      7    //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk)
5
  #define MMC_Chip_Select    3    //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist
6
  #define SPI_SS        4    //Nicht Benutz muß aber definiert werden
7
#endif

das hab ich nachkontrolliert und passt soweit (stimmt auch mit ulrich 
radig libery zusammen)

Das Programm hängt am ersten Kartenzugriff:
1
for (b=0;b<0x0f;b++)                       // sending 74Clocks brings the sdcard into spimode.
2
  {
3
    _delay_us(1);                        // wait at least 1us between the characters.
4
    SSC_PutChar(0xff);
5
  }
6
  
7
  
8
  while(SDC_PutCommand (CMD) !=1)                // Sending CMD0 (Reset) to the sdcard.
9
  {
10
    if (Timeout++ > 200)
11
    {      
12
      return(1);                     
13
    }
14
  }

An was könnte das liegen?
Hat jemand schon mal diese Libery verwendet?

mfg
J.K

von Stephan Busker (Gast)


Lesenswert?

Hallo.

Ich habe festgestellt, dass es bei einigen neueren SD-Karten Probleme 
bei der Initialisierung gibt.
Beim Senden von CMD0 wartet die SD-Routine auf die Antwort 0x01 von der 
Karte.
Diese Antwort scheint hier nicht zu kommen.

Kannst du bitte in Erfahrung bringen, womit die Karte genau antwortet?

mfg.
Stephan

von J. K. (rooot)


Lesenswert?

Ich glaub Karte hat gar nichts geantwortet, da etwas mit den SPI 
Einstellungen nicht gepasst hat.

Hab den Fehler nicht gefunden aber behoben ;-)

Die Low-Level Treiber verwende ich jetzt von der Ulrich Radig Libery und 
die Fat Funktionen von mikro-control.de

Die Karte ist auch nicht mehr die jüngste. 128MB von LEXAR


mfg
J.K

von Taschenbuch (Gast)


Lesenswert?

for (b=0;b<0x0f;b++)
  {
  _delay_us(1);
   SSC_PutChar(0xff);
  }

rooot,

Erstmal sind das 120 Clocks und nicht 74.
Allerdings soll das nicht so kritisch sein, wenngleich ich persönlich 
eher exakt nach den Spezifikationen arbeiten würde. Ich glaube die sagt 
mindestens 74 Clocks.

Die o.g. Routine erzeugt aber auch unregelmäßige Clocks, weil der Delay 
nur alle 8 Clocks zuschlägt. Mir ist zumindest EINE SD-Karte bekoannt, 
bei der das Probleme gibt, weil die nämlich (als eine Art Versicherung) 
neu startet, wenn die Clocks zu unregelmäßig kommen.

Zudem solle BESONDERS IM INIT die Clocks DEUTLICH LANGSAMER kommen, die 
in o.g. Code kommen aber mit der normalen Datenrate für Datenverkehr.

Jochen Müller

von stephan busker (Gast)


Lesenswert?

Hallo,

Es stimmt, dass die Taktrate zur SD-Karte während der Initialisierung 
auf 400khz begrenzt ist. Es soll erst nach der Initialisierung in den 
Highspeed- modus gewechselt werden.

Bei der MikroControl SDC- Routine kannst du ausser dem verwendeten 
Controller noch per #DEFINE festlegen, ob der levelshifter zwischen dem 
Controller und der Karte invertierend ist.

#define  __MMC_INTERFACE_INVERTED

Vielleicht ist das ja auch das Problem.
Die Treiber von Ulrich gehen aber natürlich sowieso.

Gruss,
Stephan

von holger (Gast)


Lesenswert?

@stephan

  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<CPOL);           // Enable SSC 
in mastermode, invert clockpolarity (idle high)

Du setzt CPOL auf 1. Lass es doch mal auf 0!

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.