Forum: Mikrocontroller und Digitale Elektronik ATMega8 + SD-Karte


von Helge O. (_elko_)


Angehängte Dateien:

Lesenswert?

Hi,

ich möchte eine SD-Karte mit einem ATMEGA8A in Betrieb nehmen. 
www.ulrichradig.de gab hierzu die Anregung. Das Ganze funktioniert 
aktuell jedoch nicht und daher hoffe ich auf kompetente Hilfe hier aus 
dem Forum.

## Konfiguration ##
Ich verwende einen ATMEGA8A µC der auf 4 MHz läuft. Die Betriebsspannung 
liegt bei 3,3 V, damit ich keinen Pegelwandler benötige. Im Anhang 
befindet sich ein Ausschnitt aus meinem Schaltplan, wie er auch auf der 
Platune umgesetzt wurde.

Wie im Schaltplan ebenfalls zu erkennen ist, habe ich den SD-Kartenleser 
nicht an das SPI gehängt. Ich möchte gern ein Software-SPI realisieren. 
Die Frage "warum?" kann ich nur damit beantworten, dass ich der 
Übersichtlichkeithalber alles was ich mit dem µC ansteuer gern 
Portseitig getrennt haben möchte. (Ich weiß, dass ich auch einen BUS mit 
CS aufbauen könnte.)

Es wurden 4 verschiedene SD-Karten ketestet: 8 GB Sandisk, 2 GB HAMA, 1 
GB Verbatim, 256 MB NoName.

Softwareseitig möchte ich die Bibliothek von Ulrich Radig verwenden und 
habe diese auf meine µC-Ports angepasst.

## Problem ##
Die Problembeschreibung kann recht kurz erfolgen: Es funktioniert nicht! 
Ich hole mir den ERRORCODE, den die mmc_init() zurückgibt ab und gebe 
diesen auf einer 7-Segment Anzeige aus: Fehlercode "1". Wenn ich die 
Bibliothek richtig verstehe, dann schlägt also schon die erste 
Initialisierung fehl.

## Fehlersuche ##
Leider habe ich nicht "allzumodernes" Equipment zur Verfügung. Ein HAMEG 
20 MHz Oszilloskop und ein Multimeter müsen es tun.

Ich habe mir mit dem Oszi die Di(CMD), Do, CLK sowie den CS angeschaut. 
Beim CS findet definitiv ein Pegelwechsel statt, die Karte wird also 
ausgewählt.
Ein Clock liegt ebenfalls an der Karte, das kann man mit dem Oszilloskop 
einigermaßen gut erkennen. Zumindestens sind Taktflanken erkennbar - 
zwar nicht übermäßig periodische Flanken, aber sie sind da.
Auf der DI(CMD)-Leitung passiert ebenfalls allerhand!
Auf der DO-Leitung der Karte passiert auch kurz etwas. Allerdings lässt 
sich mit dem HAMEG nur schlecht erkennen, ob die Leitung tatsächlich 
komplett auf 0V heruntergezogen wird. Es sind aber einige Taktflanken zu 
erkennen.

Okay ich weiß, dass es bereits allerhand zu diesem Thema hier im Forum 
gibt. Ja, ich habe die Suchfunktion benutzt. Hierbei bin ich unter 
anderem darauf gestoßen, dass manche SD-Karten eine niedrigere 
Initialisierungsfrequenz fahren (400 kHz ?)
Ein Heruntertakten des µC's brachte keinen Erfolg.

Ich bin mir absolut unsicher, ob das Problem Hard- oder Softwareseitig 
zu suchen ist. Daher wäre ich froh, wenn ich ein paar gute Tipps 
bekommen könnte.

Vielen Dank und Viele Grüße
Elko

von Matthias H. (hallamen)


Lesenswert?

Hallo!

Ich hatte mit diesem Code auch meine Probleme. Probier mal diesen hier 
(sd_raw.*), der hat bei mir funktioniert:
http://www.roland-riegel.de/sd-reader/

Darin werden SDHC-Karten anders behandelt, vielleicht liegt es daran.

Viel Glück! :)

von Falk B. (falk)


Lesenswert?

@ H. O. (elko)

>Ich verwende einen ATMEGA8A µC der auf 4 MHz läuft. Die Betriebsspannung
>liegt bei 3,3 V, damit ich keinen Pegelwandler benötige. Im Anhang
>befindet sich ein Ausschnitt aus meinem Schaltplan, wie er auch auf der
>Platune umgesetzt wurde.

Es fehlt ein Pull-Up von ca 2-4K an MISO!

>Wie im Schaltplan ebenfalls zu erkennen ist, habe ich den SD-Kartenleser
>nicht an das SPI gehängt. Ich möchte gern ein Software-SPI realisieren.

Warum? Ist SPI in Hardware zu schnell? Zu einfach?

>Softwareseitig möchte ich die Bibliothek von Ulrich Radig verwenden und
>habe diese auf meine µC-Ports angepasst.

Ich hab vor einigen Monaten die von ELM Chan benutzt, die lief auf 
Anhieb!

>Bibliothek richtig verstehe, dann schlägt also schon die erste
>Initialisierung fehl.

Weil der Pull-Up fehlt! Der Datenausgang der SD-Karte ist vor der 
Initialisierung ein Open Drain!

von Helge O. (_elko_)


Lesenswert?

Hi,
Vielen Dank schon einmal für die Antworten.

Falk Brunner schrieb:
> Weil der Pull-Up fehlt! Der Datenausgang der SD-Karte ist vor der
> Initialisierung ein Open Drain!

Ich habe bereits versucht den internen Pull-UP zu verwenden. Keinen 
erfolg damit gehabt. Extern hatte ich 5.6k dran, das hat ebenfalls 
nichts verändert. Vielleicht war ich noch ein wenig zu Hochohmig (glaube 
ich zwar aktuell nicht aber es ist immerhin einen Versuch wert.

Matthias H. schrieb:
> Ich hatte mit diesem Code auch meine Probleme. Probier mal diesen hier
> (sd_raw.*), der hat bei mir funktioniert:
> http://www.roland-riegel.de/sd-reader/

Die Bibliothek habe ich mir auch schon angeschaut. Wenn ich das richtig 
gesehen habe, dann unterstützt die aber nur Hardware-SPI? Oder habe ich 
das falsch gesehen?

Falk Brunner schrieb:
> Warum? Ist SPI in Hardware zu schnell? Zu einfach?

Bei beiden Aussagen stimme ich dir zu. In erster Linie waren Ports übrig 
die ich gern Opfern wollte und ich habe nichts anderes Sinnvolles 
gefunden, was ich da hätte dran klemmen können.

Ich werde mal versuchen mit dem PullUP etwas niederohmiger zu werden und 
ein paar andere Bibliotheken zu nutzen. Drei der vier Karten waren SDHC, 
vielleicht bringt da die Bibliothek von Roland Riegel etwas.

von Falk B. (falk)


Lesenswert?

@ H. O. (elko)

>> Weil der Pull-Up fehlt! Der Datenausgang der SD-Karte ist vor der
>> Initialisierung ein Open Drain!

>Ich habe bereits versucht den internen Pull-UP zu verwenden.

Zu hochohmig.

>erfolg damit gehabt. Extern hatte ich 5.6k dran, das hat ebenfalls
>nichts verändert.

5k6 sollte reichen, viel mehr sollte es aber nicht sein.

>Bei beiden Aussagen stimme ich dir zu. In erster Linie waren Ports übrig
>die ich gern Opfern wollte und ich habe nichts anderes Sinnvolles
>gefunden, was ich da hätte dran klemmen können.

Dann lass die Pins Pins sein.

von dummy (Gast)


Lesenswert?

AVCC
is the supply voltage pin for the A/D Converter, Port C (3..0),
and ADC (7..6). It should be externally connected to VCC
, even if the ADC is not used.

von Matthias H. (hallamen)


Lesenswert?

H. O. schrieb:
>> Ich hatte mit diesem Code auch meine Probleme. Probier mal diesen hier
>> (sd_raw.*), der hat bei mir funktioniert:
>> http://www.roland-riegel.de/sd-reader/
>
> Die Bibliothek habe ich mir auch schon angeschaut. Wenn ich das richtig
> gesehen habe, dann unterstützt die aber nur Hardware-SPI? Oder habe ich
> das falsch gesehen?

Ja, das stimmt. Um dies zu ändern, braucht man jedoch nur 2 Funktionen 
umschreiben:
1
void sd_raw_send_byte(uint8_t b)
2
uint8_t sd_raw_rec_byte()

Dafür kann man den Code aus deiner mmc.c Datei verwenden.

von Helge O. (_elko_)


Lesenswert?

Okay jetzt läuft es auch mit der Bibliothek von Ulrich Radig.

Ich habe 4.7k PullUP an den DO der SD-Karte gehängt. Das allein brachte 
allerdings keine Änderung. Danach habe ich AVCC mit VCC verbunden. Ich 
hätte es nicht gedacht, aber die Karte funktionierte danach.

Vielen Dank für die Hilfe.

von Thomas P. (topla)


Lesenswert?

H. O. schrieb:
> Danach habe ich AVCC mit VCC verbunden. Ich
> hätte es nicht gedacht, aber die Karte funktionierte danach.

Aus dem ATMega8.pdf:
AVCC is the supply voltage pin for the A/D Converter, Port C (3..0), and 
ADC (7..6). It should be externally connected to VCC, even if the ADC is 
not used.

Thomas

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.