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!
Unterstützt deine SD-Card den SPI-Mode (ist bei den "micro" Typen optional)?
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.
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...
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 ;-).
@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
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..
1. Mit Oszi Leitungen nachmessen, Signale überprüfen. 2. Mit Debugger das Programm prüfen, wo es hängen bleibt.
>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);
>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!
ö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...
>ö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.
...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
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???????
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...
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.
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?
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.