Problem mit SD-Karte

OP #1136557
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!
Angehängte Dateien:
OP #1136592
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.
Persönliche Seite #1136787
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
OP #1136796
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..
Gast #1136913
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);
Gast #1136927
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!
Gast #1137008
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.
OP #1137183
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???????
#1137323
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...
OP #1137759
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?
Persönliche Seite #1139923
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren