mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD-Karte initialisieren


Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Zu allererst: Ich habe mich hier im Forum belesen und auch anderweitige 
Beispiele durchforstet, komme aber trotzdem nicht zu Rande.

Ich möchte die Karte mittels Software-SPI betreiben.
Beispiele für die Startinitialisierung mit 74 Takten gibt es hier ja zu 
Hauf.
Wenn man dieses Beispiel nimmt:
void SD_INIT (void){

  for (int b = 0;b<0x0f;b++) //Sendet min 74+ Clocks an die MMC/SD-Karte
  {
     mmc_write_byte(0xff);
  } 
}

, was steckt denn eigentlich alles in dieser Funktion mmc_write_byte 
drin?
Die konnt ich nirgends finden.

Werden da bloß einfach 8 Bit in einer For-Schleife auf den Data-Out-Pin 
des Software SPI gegeben? Oder wie kann ich mir das vorstellen?

Es war ja auch oft zu lesen, dass die Initialisierung mit 100kHz 
erfolgen soll. Heißt das nun, dass ich einfach Delays in die 
SPI-Sende-Funktion einbaue um so den Takt runterzusetzen?

Ich hoffe, die Frage ist nicht allzu lästig.
Dank Euch.

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde keine Definition der Funktion mmc_write_byte.

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber der Inhalt dieser Funktion.
Entspricht der in etwa dem, was ich schrieb?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber der Inhalt dieser Funktion.
>Entspricht der in etwa dem, was ich schrieb?

Was soll die denn sonst noch machen?
Kaffee kochen?

>, was steckt denn eigentlich alles in dieser Funktion mmc_write_byte
>drin?
>Die konnt ich nirgends finden.

Die wird mit Sicherheit irgendwo im Quellcode mit
drin sein. Sonst könnte man das ganze ja nicht compilieren.

Autor: Elektron (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch nach was im Quellcode steht. Ich geh allerdings davon aus das 
des nur SPI ist.

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber dieses Codeschnipsel hab ich hier aus nem Thread gezogen, deswegen 
frag ich ja.

Kann ich das mit den Delays so machen, oder gibt es noch ne elegantere 
Version?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber dieses Codeschnipsel hab ich hier aus nem Thread gezogen, deswegen
>frag ich ja.

Aus welchem? Eine SD Init sieht viel komplizierter aus.

>Kann ich das mit den Delays so machen,

Ja, allerdings solltest du dir dann zwei mmc_write_byte()
schreiben. Eine schnelle und eine langsame.

>oder gibt es noch ne elegantere Version?

Das Hardware SPI Modul benutzen.

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider war da nur dieses Codeschnipsel.

Der Hardware-SPI kommt dann in der Rev. 1.1
Aber schon mal vorausblickend, mit welchen Befehlen kann ich denn den 
Hardware-SPI ansteuern? Gibt's da ne extra Headerdatei?
Kennst du nen guten Link, der mir da weiterhelfen kann?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Seite kenn ich doch schon, da stolpert man bei dem Thema 
zwangsläufig drüber.
Aber ich such mehr eine kleine Übersicht über die SPI-Befehle(Aufruf, 
Initialisierung) für den AVR, wenn es sowas überhaupgt gibt.

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Kennt denn keiner eine Übersicht über alle SPI-relevanten C-Befehle?

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kennt denn keiner eine Übersicht über alle SPI-relevanten C-Befehle?

Die SPI des AVR wird über einige SFR-Register initialisiert und auch 
verwendet. Wenn man nun nach "winavr spi" googlet ist gleich der erste 
Treffer das hier:

http://winavr.scienceprog.com/avr-gcc-tutorial/ser...

In der Codesammlung hier gibt es auch reichlich Beispielcode.

Um das Datenblatt zu deinem AVR wirst du aber kaum herum kommen.

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine saubere Init sieht so aus, mit ca 100khz SPI Clock, keine Abstände 
zwischen den SPI Befehlen, die Karte hat eine festverdrahtete 
Statemachine, keinen Prozessor. Ich kann Dir allerdings auch sagen,dass 
99% der Karten mit Full Speed einwandfrei aufstarten werden. Manche 
schlafen allerdings sofort wieder ein und müssen aufgeweckt werden, 
andere bleiben an und ziehen 20ma bis man sie schlafen legt.
/ *********************************************************************************
// Initialisieren der MMC Karte nach Power On
// Rückgabe: 1 = ok, 0 = Fehler
// *********************************************************************************

byte mmc_init()
{
  byte i;

    mmc_InitSPI(SPI_SPEED);
    ChipSelect(devSD,0);    // MMC Karte ausschalten

  for(i=0;i<100;i++)           // initialise the MMC card into SPI mode by sending clks on
     SPIMMC(0xFF);

  ChipSelect(devSD,1);    // MMC ein

  // Sende CMD0 an die Karte
  restart_wdt();
  i=0;

  do {
    SPIMMC(0xFF);
    SPIMMC(0x40);           // Sende Reset command
    SPIMMC(0x00);
    SPIMMC(0x00);
    SPIMMC(0x00);
    SPIMMC(0x00);
    SPIMMC(0x95);  
    if(++i >= 50)
    {
      f_mmc_Error   = TRUE;
      mmc_ErrorCode = MMC_ERR_INIT;
      ChipSelect(devSD,0);
            return (0);              // Timeout, Fehler!
          }  
  } while(!mmc_response(0x01));

  SPIMMC(0xFF);
  SPIMMC(0xFF);
  SPIMMC(0xFF);
  
  // Sendet CMD1 wiederkehrend an die Karte
  i = 0;
  restart_wdt();
  do  {
    SPIMMC(0xFF);
        SPIMMC(0x41);            // sende mmc Kommando um Idle Mode zu beenden
        SPIMMC(0x00);            // Alle Parameter sind 0x00
        SPIMMC(0x00);
        SPIMMC(0x00);
        SPIMMC(0x00);
        SPIMMC(0xFF);            // Checksumme ist immer 0xff
    if(++i >= 50)
    {
      f_mmc_Error = TRUE;
      mmc_ErrorCode = MMC_ERR_INIT1;
         return (0);              // Timeout, Fehler!
       }
  } while(!mmc_response(0));

  ChipSelect(devSD,0);
  f_mmc_Error = FALSE;
  mmc_ErrorCode = NO_ERROR;

  mmc_reset();

  return (1);
}

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.