mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD - Karte nicht erkannt


Autor: J. K. (rooot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich möchte mit der Libery von mikro-control 
http://www.mikro-control.de/Joomla/index.php?optio...

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:
#if defined (__AVR_ATmega16__)
  #define SPI_DI        6    //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist 
  #define SPI_DO        5    //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist
  #define SPI_Clock      7    //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk)
  #define MMC_Chip_Select    3    //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist
  #define SPI_SS        4    //Nicht Benutz muß aber definiert werden
#endif

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

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

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

mfg
J.K

Autor: Stephan Busker (Gast)
Datum:

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

Autor: J. K. (rooot)
Datum:

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

Autor: Taschenbuch (Gast)
Datum:

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

Autor: stephan busker (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

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.