Forum: Mikrocontroller und Digitale Elektronik Problem mit SD-Karte


von Rene M. (gozu)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche jetzt schon seit ein paar Stunden die Kommunikation mit 
einer mikro-SD-Karte zu schaffen, allerdings ergebnislos! Ich habe schon 
ziemlich viele Bibliotheken probiert, aber anscheinend bin ich zu blöd 
dazu. Ich habe jetzt mein Programm mit einer Bibliothek (die anscheinend 
einfachste, funktioniert aber trotzdem nicht) angehängt, bitte helft 
mir!

Nur nochmal kurz als Verständnisfrage:
MOSI = Master Output / Slave Input gehört an DI = Data Input
und
MISO = Master Input / Slave Output gehört an DO = Data Output
????

bedeutet DI = Data Input = Data input in die SD Karte oder Data input in 
den SPI Bus??? Ich kann da leider auch nicht im Datenblatt nachsehen, 
weil die mein Kollege hat und ich keine Ahnung hab, wo ich das finde 
würde?

und gehört CS mit SS verbunden? Das eine ist ja Chip Select und das 
andere Slave Select, aber bei ein paar Bibliotheken ist gestanden dass 
ich CS auf irgend einen nicht verwendeten Pin legen soll???

Bitte helft mir, es ist wirklich dringen, ich muss die Verbindung noch 
diese Woche fertig bekommen. Danke schonmal.

ps: Ich hätte es fast vergessen. In Main.c gibt es eine codezeile: temp 
= mmc_init();
Anscheinend bleibt er ab hier in einer Endlosschleife!

von Karlheinz (Gast)


Lesenswert?

Unterstützt deine SD-Card den SPI-Mode (ist bei den "micro" Typen 
optional)?

von Rene M. (gozu)


Lesenswert?

puh das ist eine ganz ganz gute Frage! Weil mein Kollege eigentlich für 
Hardware zuständig ist und das Datenblatt hat, aber da er mir eine 
Schaltung dafür aufgebaut hat, gehe ich doch schon mal stark davon 
aus....

Mein Problem ist halt, er hat mir genau die Schaltung hingestellt und 
gesagt Pin1 ist VCC, Pin2 DO usw. aber ich habe nicht wirklich so die 
Ahnung was DO überhaupt ist...

Und er ist jetzt für 3 Wochen in Indien und ich muss das diese Woche 
fertig bekommen.

von Rene M. (gozu)


Lesenswert?

Hier, diese SD Karte habe ich:

http://www.kingston.com/deroot/flash/sd_micro.asp?id=2

Kann mir wirklich niemand helfen?? Wäre wirklich toll...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rene Mayer wrote:
> Hier, diese SD Karte habe ich:
>
> http://www.kingston.com/deroot/flash/sd_micro.asp?id=2

»in Kombination mit dem Adapter ist die Verwendung als Standard-SD Karte 
möglich.«

Das würde implizieren, dass SPI implementiert ist (falls es nicht
gerade im Adapter gemacht wird ;-).

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

@Rene Mayer:
Hier ist alles zur SD/MMC-Ansteuerung beschrieben:
http://elm-chan.org/docs/mmc/mmc_e.html

AVR  -> Karte
MOSI -> DI
MISO -> DO
SCK  -> CLK
SS   -> CS

> ps: Ich hätte es fast vergessen. In Main.c gibt es eine codezeile: temp
> = mmc_init();
> Anscheinend bleibt er ab hier in einer Endlosschleife!

Woher weißt du, dass die Karte nicht funktioniert? Ich sehe in deinem 
Programm nur einmal mmc_init() und weiter nichts...
Die Funktion mmc_init() hat auch einen Timeout, daher kann er dort 
eigentlich nicht hängen bleiben.

PS: Noch eine Übersicht zum Thema SD/MMC-Speicherkarte: 
MMC- und SD-Karten

von Rene M. (gozu)


Lesenswert?

wenn ich nach dem mmc_init() eine while(1) schleife setzte und in der 
schleife über USART daten sende, kommen diese nie an => Ich komme nie in 
die schleife => es muss eine endlosschleife in mmc_init() geben.... z.b. 
bei einem aufruf von dem byte send....Danke schonmal..

von Martin (Gast)


Lesenswert?

1. Mit Oszi Leitungen nachmessen, Signale überprüfen.
2. Mit Debugger das Programm prüfen, wo es hängen bleibt.

von holger (Gast)


Lesenswert?

>es muss eine endlosschleife in mmc_init() geben.... z.b.
>bei einem aufruf von dem byte send

Ja, da könnte es hängen bleiben wenn das SPI Modul
nicht richtig initialisiert wurde.



>MMC_DDR |= 1<<SPI_CLK | 1<<SPI_MOSI | 1<<MMC_CS;

Ist nur ne Vermutung, nachgedacht habe ich darüber nicht :(
Mach dir mal Gedanken darüber welcher Operator zuerst ausgeführt
wird. Das '|' oder das '<<'? Wenn man Klammern setzt ist es
eindeutig.

MMC_DDR |= (1<<SPI_CLK) | (1<<SPI_MOSI) | (1<<MMC_CS);

von holger (Gast)


Lesenswert?

>Ist nur ne Vermutung, nachgedacht habe ich darüber nicht :(
>Mach dir mal Gedanken darüber

Brauchst du nicht mehr zu machen ;)
Beim Bootloader von ? Seegel wurde es auch so gemacht.
Hat bei mir funktioniert. Daran liegt es nicht!

von Rene M. (gozu)


Lesenswert?

öhm das ist eine fertig lib, die sollte eigentlich doch hoffentlich 
keine Fehler enthalten. Ich glaube es hat wirklich irgendetwas mit der 
falschen init von spi zu tun...

von holger (Gast)


Lesenswert?

>öhm das ist eine fertig lib, die sollte eigentlich doch hoffentlich
>keine Fehler enthalten.

Och, das weiss man nie ;)

>Ich glaube es hat wirklich irgendetwas mit der
>falschen init von spi zu tun...

Kannst du ganz leicht testen:

inline static void spi_send_byte(unsigned char data)
{
  SPDR=data;
  loop_until_bit_is_set(SPSR, SPIF); // wait for byte transmitted...
 MeinUartSend(Irgendwas);
}


Kommt nix über den Uart dann klemmt es dort.
Dazu braucht man keinen Debugger.
Dann schiebst du einfach mal SPCR und SPSR
als Hexwert über den Uart raus bevor du spi_send_byte()
aufrufst und kannst nachsehen ob da was nicht stimmt.

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

...vielleicht liegt es ja auch an den vielen Warnings, die der Compiler 
ausspuckt wenn man das Projekt erstellt.
z.B fehlt der include für mmc_lib.h in der main.c

von Rene M. (gozu)


Lesenswert?

Hm ok ich habe den Fehler jetzt eingegrenzt. Die Funktion mmc_init() 
liefert mir den code mmc_init zurück, was bedeutet, ein error in der 
Initialisierung.

Der Fehler ist bei send_cmd(), dort bekomme ich nämlich als Rückgabewert 
0xff, die sollten aber denke ich anders sein???

Jemand eine Idee, warum ich 0xFF zurückbekomme???????

von Matthias L. (matze88)


Lesenswert?

Wir haben noch garkeine Schaltung von dir gesehen, sind die Pegelwandler 
"richtig" aufgebaut oder nur 2 Widerstände? Oder arbeitet dein ganzer µC 
mit 3,3 V? Schaltplan anhängen! Wäre sehr gut.

0xFF zurückbekommen von nem SPI Read bedeutet, dass der die ganze Zeit 
high ist der Pin, also die SD Karte ihn nicht low zieht...

von Peter B. (-peter-) Benutzerseite


Lesenswert?

SD-Karten sind bzgl der Spannungsversorgung recht anspruchsvoll. 
Zumindest ist das auch meine Erfahrung. Wenn die Versorgungsspannung an 
der Karte nicht sauber und stabil genug ansteht, kommt man da auf keinen 
grünen Zweig.

von Rene M. (gozu)


Lesenswert?

Hmmm Schaltplan kann ich euch nur den hier anbieten:

http://elm-chan.org/docs/mmc/contact.jpeg
http://www.ulrichradig.de/site/atmel/avr_mmcsd/gfx/MMCSDSCH.JPG

Genau so habe ich es verbunden (beim kontrollieren habe ich auch einen 
Fehler entdeckt, der 1,8 k Widerstand der zu DI gehen sollte, hing nicht 
auf DI sondern parallel zum anderne 1,8k bei CLK....) Ich habe es jetzt 
zwar ausgebessert, aber der Fehler ist trotzdem noch da!

Passt die Spannungsversorgung so? VCC greife ich vom STK500 ab, von den 
VCC von PORTB! Das sollte docjh die richtige Spannungsversorgung sein 
oder?

von Peter B. (-peter-) Benutzerseite


Lesenswert?

> Passt die Spannungsversorgung so? VCC greife ich vom STK500 ab, von den
> VCC von PORTB! Das sollte docjh die richtige Spannungsversorgung sein
> oder?
Versichere Dich am besten, ob die Spannung, die an der Karte ankommt, 
auch passt.
Meine Karte hat mit der Minimalbeschaltung von Ulrich Radig (die 2 
Dioden) nicht funktioniert. Die Spannung war zu hoch. Erst nachdem ich 
einen 3,3V Spannungsregler eingesetzt habe, hat das funktioniert
Zusätzlich habe ich noch einen 100nF-Kondensator an der 
Versorgungsspannung der Karte, möglichst nahe an der Karte.

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.