www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit SD-Karte


Autor: Rene Mayer (gozu)
Datum:
Angehängte Dateien:

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

Autor: Karlheinz (Gast)
Datum:

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

Autor: Rene Mayer (gozu)
Datum:

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

Autor: Rene Mayer (gozu)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

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

Autor: Rene Mayer (gozu)
Datum:

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

Autor: Martin (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Rene Mayer (gozu)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

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

Autor: Rene Mayer (gozu)
Datum:

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

Autor: Matthias Larisch (matze88)
Datum:

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

Autor: Peter B. (-peter-) Benutzerseite
Datum:

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

Autor: Rene Mayer (gozu)
Datum:

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

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?

Autor: Peter B. (-peter-) Benutzerseite
Datum:

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

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.