SD-Karte Initialisierung PIC 18F452

OP #1237736
Hallo allerseits.

Habe von einem Vorgänger eine fertige Hardware zur Speicherung von Daten 
auf einer SD/MMC Karte übernommen. Leider tritt schon beim Initalisieren 
der Karte ein Problem auf. Als Antwort auf den Befehl "Go_IDLE_STATE" 
(CMD0) erhalte ich nicht das gewünschte '0b00000001" sondern beim ersten 
einlegen der Karte die Antwort '0b00111111' und bei jedem weiteren 
Versuch '0b10000000'. Vielleicht kann mir einer von euch weiterhelfen. 
Der Code sieht folgendermaßen aus:

PORTC = 0;
TRISC = 0b10010000;                  //CS-Pin = RC2
OpenSPI(SPI_FOSC_16,MODE_01,SMPMID); //Fosc = 4Mhz, CKP=0; CKE=1

SD_CS = 1;                           //Disable SD Card

for(i=0; i<0x0f;i++)                 //Sende min. 74 Clocks
         WriteSPI(0xFF);

SD_CS = 0;                           //Enable SD Card
WriteSPI(0x40);                      //CMD0, 1.Byte
WriteSPI(0x00);
WriteSPI(0x00);
WriteSPI(0x00);
WriteSPI(0x00);
WriteSPI(0x95);                      //6.Byte = CRC

do                                   //Warte auf gueltige Antwort
{
r = readSPI();
}
while(r==0xFF);

--> Jetzt hat r den Wert 0b00111111 bzw. beim nochmaligen Ausführen 
0b10000000.

Vielen Dank für eure Hilfe.

Philipp
Mal im Ernst, wer soll mit den Codeschnipselchen was anfangen können. 
ÜPoste deinen gesamten Code und am besten den Schaltplan dazu.

Wie schnell ist denn dein Takt bei der Initialisierung(sollte am besten 
so zwischen 400 und 128 kHz liegen).

Gruß
OP
Dachte der oben aufgeführte Code sei der relevante Teil. Dreht sich ja 
lediglich um die Initialisierung. Davor werden von mir nur ein paar 
Variablen deklariert und RC2 von PortC als SD_CS definiert. Habe 
allerdings gerade nochmals ein wenig rumgespielt und folgende 
Einstellung geändert:

OpenSPI(SPI_FOSC_16,MODE_00,SMPMID);

Daraufhin habe ich die korrekte Antwort (0b00000001) erhalten. Das 
gleiche gilt für die Einstellung:
OpenSPI(SPI_FOSC_16,MODE_11,SMPMID);

--> ebenfalls korrekte Antwort.

Allerdings habe ich aus der Literatur die Einstellungen CKE = 1 und CKP 
= 0 (wie in meinem ersten Beitrag). Woran kann das liegen? War es 
lediglich diese Einstellung an der ich gescheitert bin?
Gast
>War es lediglich diese Einstellung an der ich gescheitert bin?

Vermutlich. Ich betreibe meine Karten im Mode0.
Hat bis jetzt mit jeder Karte funktioniert.
OP
Habe jetzt wiederum leider festgestellt, dass diese Initialisierung nur 
auf einer 16MB SD Karte funktioniert. Auf einer microSD Karte + SD 
Kartenadapter funktioniert das ganze komischerweise nicht. Da bekomme 
ich wieder fehlerhafte Antworten.
OP
Hallo Holger,

ich habe in einer Beschreibung über die Pinbelegung an SD-Karten 
gelesen, dass der Pin HostToCard mit einem 1k PullUp beschaltet werden 
sollte. Meinst du denn denselben Pin oder den Pin CardToHost? Gibt es 
denn zwischen einer etwas älteren 16MB Karte und einer 1GB microSD-Karte 
(im SD-Kartenadapter) einen Unterschied?

Grüße
Gast
>dass der Pin HostToCard mit einem 1k PullUp beschaltet werden
>sollte.

Der nicht.

>oder den Pin CardToHost?

Genau den meine ich. Das hilft bei der Init ungemein.

>Gibt es denn zwischen einer etwas älteren 16MB Karte und einer 1GB >microSD-Karte 
(im SD-Kartenadapter) einen Unterschied?

Sie sind kleiner? SCNR

Ich meine schon gelesen zu haben das der SPI Modus
bei microSD Karten optional ist. Das heisst es könnte sein
das sie den nicht unterstützt. Aber probier es erstmal
mit dem Pullup. Ich hab auch schon häufig gesehen das
die freien Pins der Karte mit Pullups beschaltet werden.
War bei mir bei immerhin ca. 15 verschiedenen Karten
bisher aber nicht nötig.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.