Hallo,
ich versuche gerade Dateien von eine SD-Karte einzulesen. Allerdings
scheitere ich bereits am Anfang.
Ich habe eine Mega644 (mit 16MHz & Hardware SPI) und versuche über die
Routine von Ulrich Radig die SD-Karte einzulesen.
Nach dem Einschalten der Spannung erhalten ich auch diese Meldungen:
1
SystemReady!
2
Kartegefunden!!
Danach ist auch schon Schluss und der Code bleibt an der Stelle
1
while(mmc_read_byte()!=0xfe){};
stehen.
Ich kann leider nicht erkennen wo das Problem steckt. Kann mir jemand
auf die Sprünge helfen?
Vielen Dank!
mfg
pal
pal ... schrieb:> while(!(SPSR & (1<<SPIF))){};
Das ist die einzige Stelle in der ganzen Routine, wo was hängen bleiben
könnte. Und es bleibt nur unter genau einem Umstand dort hängen: wenn
das Hardware-SPI nicht korrekt initialisiert wurde.
Ich tippe darauf, daß du schlicht nicht die richtige Partdefinition
included hast. Beachte insbesondere: es gibt einen Mega644 und auch
einen Mega644_P_.
Und jetzt die Preisfrage: Nutzt Du Hardware SPI oder Software SPI?
Wenn Du Hardware SPI nutz, dann hängt er wohl dort:
while(!(SPSR & (1<<SPIF))){};
Oder anders gesagt: Die Karte antwortet nicht. Ist die
Spannungsversorgung der SD zuverlässig aud ausreichend belastbar
realisiert? Bedenke, dass manche Karten einige hundert mA brauchen!
@edit: c-hater hat vermutlich Recht. Ich hatte nicht bedacht, dass der
Empfang bei SPI Kommunikation vom AVR aus getaktet wird (ander als
UART).
@ Stefan Nie (stefanfrings_de)
>Wenn Du Hardware SPI nutz, dann hängt er wohl dort:>while(!(SPSR & (1<<SPIF))){};
Das Problem ist, dass die SPI einen kleinen Bug hat. Vor der ersten
Abfrage nach dem Programmstart und Initialisierung muss man ein
Dummybyte senden, damit SPIF auf HIGH geht. Nach dem Reset ist es
nämlich LOW :-(
Vielen Dank schon einmal für die Antworten!
Ich nutze den ATMEGA644 20PU und im AVRStudio include ich ebenfalls den
ATmega644 (siehe Bild).
Stimmt, die Spannungsversorgung könnte ich noch prüfen.
mfg
@ pal ... (pal)
>@Falk: Ich habe den Code jetzt wie folgt angepasst
Nicht sinnvoll. Das Bit kann man nur lesen, nicht schreiben.
Ausserdem war ich etwas auf dem Holzweg. Den Fehler entsteht nur, wenn
man ZUERST das Bit abfragt und dann das nächste Byte sendet. Das macht
man so bei geschwindigkeitsoptimierter SPI-Übertragung.
Was ist denn dein Ziel? Bissel mit dem Code rumspielen oder eine einfach
nutzbare SD-Kartenanbindung. Für letzteres kann ich wärmstens die Lib
von ELM Chan empfehlen, hab ich vor einigen Wochen gemacht, lief
problemlos von Anfang an.
http://elm-chan.org/fsw/ff/00index_e.html
Falk Brunner schrieb:> Was ist denn dein Ziel? Bissel mit dem Code rumspielen oder eine einfach> nutzbare SD-Kartenanbindung.
--> SD-Kartenanbindung!
Ok, dann werde ich diesen Code mal probieren.
Mein Problem ist nur, dass ich auf meine 644er auch nich andere Aufgaben
zu erledigen habe wie nur das bisschen SD-Karte lesen. Daher kam mir der
Code von Ulrich Radig sehr gelegen, da dieser wenig Speicher benötigt.
Vielen Dank für Eure Bemühungen!
Und auf eine Neues :-)
Falk Brunner schrieb:> Das Problem ist, dass die SPI einen kleinen Bug hat.
Das ist kein Bug, sondern korrektes Verhalten, exakt entsprechend der
Dokumentation.
Es ist halt nur anders, als vielleicht von den UARTs gewohnt. Davon wird
es aber noch lange nicht nicht zum Bug.
> Vor der ersten> Abfrage nach dem Programmstart und Initialisierung muss man ein> Dummybyte senden, damit SPIF auf HIGH geht.
Genau das macht der Code doch auch völlig korrekt direkt vor der
Warteschleife.
Wie schon gesagt: Die einzige Möglichkeit für den Hänger ist, daß das
Hardware-SPI nicht korrekt initialisiert wurde, ansonsten würde zwingend
nach acht SPI-Takten das Bit gesetzt sein. Jedenfalls, wenn der
entsprechende Interrupt nicht erlaubt ist, was aber ohne entsprechende
ISR zum Reset führen würde.
@pal ... (pal)
>Mein Problem ist nur, dass ich auf meine 644er auch nich andere Aufgaben>zu erledigen habe wie nur das bisschen SD-Karte lesen.
Dafür gibt es Einstellmöglichkeiten und wenn es SEHR klein sein
soll/muss das PetitFS.
http://elm-chan.org/fsw/ff/00index_p.html
Mit nahezu voller Konfiguration braucht FatFS ca. 20kB Flash und etwas
mehr als 1 kB RAM.
>Danach ist auch schon Schluss und der Code bleibt an der Stelle>>while (mmc_read_byte() != 0xfe){};
Na dann hast du ja hoffentlich nicht auch die Beschaltung
von ihm mit Spannungsteilern am SPI benutzt. Das taugt nichts.
c-hater schrieb:> Wie schon gesagt: Die einzige Möglichkeit für den Hänger ist, daß das> Hardware-SPI nicht korrekt initialisiert wurde, ansonsten würde zwingend> nach acht SPI-Takten das Bit gesetzt sein. Jedenfalls, wenn der> entsprechende Interrupt nicht erlaubt ist, was aber ohne entsprechende> ISR zum Reset führen würde.
Ok, aber wie kann ich das überprüfen?
> Na dann hast du ja hoffentlich nicht auch die Beschaltung> von ihm mit Spannungsteilern am SPI benutzt. Das taugt nichts.
Nein, den Spannungsteiler habe ich nicht verwendet.
Im Anhang ist zu sehen, wie der Mega644 an die SD-Karte angeschlossen
wurde.
pal ... schrieb:> Im Anhang ist zu sehen, wie der Mega644 an die SD-Karte angeschlossen> wurde.
Wenn der Mega644 mit 5 Volt betrieben wird - die 2 Dioden lassen das
vermuten - dann fehlen da Levelshifter auf den Datenleitungen. Auch an
den Datenleitungen darf nicht mehr als 3,6 Volt anliegen.
Außerdem fehlen Pullups an den Datenleitungen, eine SD Karte ist vor der
Initialisierung "open drain".
Der gepostete Code funktioniert übrigens nicht mit SDHC Karten > 2 GB.
@ Jim Meba (turboj)
>Außerdem fehlen Pullups an den Datenleitungen, eine SD Karte ist vor der>Initialisierung "open drain".
Hehe, das ist ein böser Fehler. 10K an MISO und es könnte laufen.
Jim Meba schrieb:> Der gepostete Code funktioniert übrigens nicht mit SDHC Karten > 2 GB.
Meine MicroSD hat nur 2 GB.
Den Rest werde ich einfach nochmal überprüfen.
> DO(SD-Karte) ist mit SS(Mega644) verbunden?
Ja, DO(SD-Karte) ist am Mega mit PB4 verbunden
pal ... schrieb:>> DO(SD-Karte) ist mit SS(Mega644) verbunden?> Ja, DO(SD-Karte) ist am Mega mit PB4 verbunden
Dann ist es auch kein Wunder, wenn die Software vergeblich versucht, von
der Karte ein 0xfe zu bekommen.
Oder etwas anders ausgedrückt: diese Verschaltung ist Unsinn.
Ich setzte jetzt mal einen 10k Widerstand von MISO nach 5V.
Aber was kann ich hier noch tun?
Jim Meba schrieb:> dann fehlen da Levelshifter auf den Datenleitungen. Auch an> den Datenleitungen darf nicht mehr als 3,6 Volt anliegen.>> Außerdem fehlen Pullups an den Datenleitungen, eine SD Karte ist vor der> Initialisierung "open drain".
Was sind Levelshifter? Auf der Seite von Radig ist da keine Rede von.
pal ... schrieb:> Was sind Levelshifter? Auf der Seite von Radig ist da keine Rede von.
Er wird den µC mit 3.3 V versorgen, dann kann darauf verzichtet werden.
Falk Brunner schrieb:> Uups, übersehen. Da sind zwei fette Verdrahtungsfehler drin.
Stimmt! Habe ich hier: http://spurtikus.de/basteln/avr_sd_mmc.html
auch festgestellt.
Ich fasse jetzt noch mal zusammen
1. MISO gehört an DO
2. SS gehört an \CS
3. 10k Widerstand von MISO nach 5V
Gehört auch ein PullUp an MOSI?
Sobald die Fehler behoben sind gehts weiter :-)
Super, vielen Dank für Eure Hilfe!!!
mfg
lese Deinen Link noch mal durch und versuche speziell dieses zu
verstehen:
"
Nach einem allgemein anerkannten Vorgehen wie beiUlrich Radig
beschrieben, kann die Vcc für die Karte aus 5V über den Spannungsabfall
an zwei Dioden (je 0,7V) gewonnen werden. Die Pins CS, DI und CLK müssen
über Spannungsteiler an den AVR angeschlossen werden, wenn dieser mit
Spannungen >3,6V betrieben wird. Für 5V werden üblicherweise 1,8K
Richtung AVR und 3,3K gegen Masse genommen. DO wird direkt auf den
AVR-Eingang gelegt.
"
und kaufe Dir 'ne neue Karte.
Gruß Holger
Holger Sch schrieb:> und kaufe Dir 'ne neue Karte.
Warum :-) Wenn ich die Karte in den PC schiebe kann ich sie noch
beschreiben. Denke nicht, dass ich sie zerschossen habe. :-)
> Die Pins CS, DI und CLK müssen über Spannungsteiler an den AVR angeschlossen
werden
Ok, aber man kann doch auch einen Pegelwandler nutzen? So wie ich es
verstanden habe ist dieser doch besser?
@ pal ... (pal)
>1. MISO gehört an DO>2. SS gehört an \CS>3. 10k Widerstand von MISO nach 5V
Ja.
>Gehört auch ein PullUp an MOSI?
Nein.
>> Die Pins CS, DI und CLK müssen über Spannungsteiler an den AVR >>angeschlossen
werden
Nur, wenn der AVR mit 5V läuft. Wenn er mit 3,3V läuft, braucht man die
nicht. Aber der 644er läuft bei 16 MHz nur bei 5V.
>Ok, aber man kann doch auch einen Pegelwandler nutzen? So wie ich es>verstanden habe ist dieser doch besser?
Ja,
ok pal,
dann hast Du Glück gehabt.
Klar kannst Du einen Pegelwandler in IC Ausführung verwenden, aber es
sollte für Hobby Anwendungen (und kurzen Leitungen) auch mit R's gehen
(bei U. Radig geht's ja auch).
Gruß Holger
>sollte für Hobby Anwendungen (und kurzen Leitungen) auch mit R's gehen
Es ist egal ob für Hobby oder nicht. Rs sind Mist.
Hier jammern doch ständig welche rum die es so versucht haben.
Erst mit schnellem Pegelwandler ging es dann immer.