Hallo
ich versuche erfolglos eine SDcard an einem ATmega8 zu betreiben. Egal
was ich treibe, bei CMD0 (GO_IDLE_STATE) erhalte ich immer R1=0x03, also
"erase reset". Die Bits habe ich mittlerweile alle gezählt, und ja, er
sendet korrekt (hex) 40,00,00,00,00,95 und empfängt immer eine 03.
HW ist ein ATmega8 mit 7.3728 MHz, ein MAX232 zu debuggen hängt auch
dran. Ich habe die 3.3V Umsetzung mit Widerständen, Dioden und einem
Pegelwandler versucht, macht keinen Unterschied. Die 3.3V mache ich
inzwischen mit einem LT1086-3.3, hat aber mit 2-3 Dioden auch nicht
anders funktioniert. Die Schaltung ist auf dem Steckbrett, aber die
Leitungen sind kurz und ich habe alles mit dem Oszi kontrolliert.
Ich habe es zunächst mit eigenem Code versucht, aktuell mit dem Code von
Roland Riegel (den von U.Radig hab ich auch schon durch). Ich habe die
74 Taktzyklen schon verlängert und verkürzt, Wartezeiten eingebaut von
10 mikrosec bis 10 millisec, die SD-Karten (32 MB und 512 MB) antworten
immer brav mit "error reset".
Im Forum und über Google gab es einige Artikel, die auf ein Problem mit
unsauberen CS-Pegel hindeuten - habe div. Treiber und Transistoren
getestet, keine Änderung. Mit dem Oszi gemessen, sind alle Pegel ok (ca
3.0V)
Ich habe schon die SD-Datenblätter von Hitachi und Sandisk durchgesehen,
und auch keinen Hinweis entdeckt.
Der SPI-Clock, mit Oszi kontrolliert, läuft auf 57600 Hz - gibt es eine
zu langsame Frequenz für die SD-Karten ? (davon abgesehen, mit anderer
Frequenz gab es auch immer denselben Status)
Ich verwende einen AVRISP mkII, aber egal ob der mit dran hängt oder
nicht, die SD sendet denselben Status.
Könnte es sein, dass meine Karten sich im "inactive state, ina" befinden
? Da kommt man nur per Hard-reset raus, aber es gibt offenbar kein
Status-Bit um den 'ina' erkennen zu können.
Hate vielleicht jemand mal was ähnliches erlebt, oder sind bisher alle
SD-Karten problemlos angelaufen ?
Die Karten sind ok und funktionieren am PC und in der DigiCam ohne
Probleme.
Es gibt wohl einige Karten, die nicht am SPI funktionieren, obwohl sie
das laut Standard müssten. Hast du mal andere Karten getestet? Ich habe
auch mal gelesen, dass die Initialisierung der Karte mit sehr niedriger
Taktfrequenz erfolgen muss und erst danach eine hohe Geschwindigkeit
verwendet werden darf. Ich kann mich aber nicht mehr genau daran
erinnern, wie langsam es sein muss.
Grüße,
Peter
>Es gibt wohl einige Karten, die nicht am SPI funktionieren, obwohl sie>das laut Standard müssten.
Das stimmt nicht. Alle SD und MMC-Karten sind SPI-tauglich, wenn man
sie richtig initialisiert.
>Ich habe>auch mal gelesen, dass die Initialisierung der Karte mit sehr niedriger>Taktfrequenz erfolgen muss und erst danach eine hohe Geschwindigkeit>verwendet werden darf.
Korrekt, vor abgeschlossener Init kleiner gleich 400kHz Clock, danach
bei MMC bis 20Mhz, bei SD bis 25Mhz.
@travelrec
> ...wenn man sie richtig initialisiert...
gut, also: der Code (genau wie der von Roland Riegel, und das passt
meiner Meinung nach zu den Dokus von Hitachi und Sandisk), taktet erst
mal ein paar Zyklen FF auf die Leitung, dann zieht er den ChipSelect
nach LOW, dann wieder >74 Takte damit die Karte auch sicher bereit wird,
und dann als erstes ein CMD0, darauf sollte die Karte mit einem R1=0x01
antworten - stimmt doch, oder ?
Hallo Fabian
> poste mal Code und Schaltplan
kann ich gerne machen, welche der beschriebenen 30 Varianten soll ich
nehmen - Spass beiseite, ich werde mal einer Variante raussuchen..
ok, anbei ist der prinzipielle Schaltplan.
- den Pullup hatte ich getestet, das machte keinen Unterschied
- ich habe eine 32 MB, 512 MB, 1 GB und 4 GB SDcard getestet
- mein CLK läuft mit 57600 Hz
schon mal Danke fürs Helfen..
Hi,
wie lang ist die Leitung zur SD Karte, weil mit Spannungsteiler aus
Widerständen, sollte die Leitung nicht allzu lang sein.
Am LT1086 fehlen 10µF vor und hinter dem Regler.
100nF möglichst nahe an der SD-Karte zwischen VCC und GNd kann auch nit
Schaden (muss nit aber Versuch macht Klug).
Gruß
@Fabian: die Leitungen sind ca. 12 cm lang
Ich lege mal einen Signalverlauf mit dem Oszi bei (Clock hat, wie
gesagt, 57600 Hz). Vielleicht kann mir da jemand was erklären: beim
Lesen der R1 werden 16 Clockpulse ausgegeben - zum einen hätte ich nur 8
Clock erwartet, aber die Karte antwortet auch auf erst auf die zweiten 8
Bit.
Ich verwende den aktuellen Code von Roland Riegel, etwa so
Matthias D. wrote:
>die Leitungen sind ca. 12 cm lang
OK.
> Ich lege mal einen Signalverlauf mit dem Oszi bei (Clock hat, wie> gesagt, 57600 Hz). Vielleicht kann mir da jemand was erklären: beim> Lesen der R1 werden 16 Clockpulse ausgegeben - zum einen hätte ich nur 8> Clock erwartet, aber die Karte antwortet auch auf erst auf die zweiten 8> Bit.
Das ist normal, die Karte brauch nen bissi. Deswegen wird im Code 0xFF
solange rausgeschoben, bis im SPDR Register nit mehr 0xFF ausgelesen
wird.
> Ich verwende den aktuellen Code von Roland Riegel, etwa so
Kenn den Code nicht, habe damals selber einen geschrieben. Bin jetzt zu
faul seine Routinen tz ergoogeln. Poste mal diese raw_init() und deine
Initialisierung der SPI.
Haste denn die 10µF Kondensatoren nach bestückt?
->Klugscheissmodus an:
Ich wette mal dein SPI Clock Prescaler ist 128 und die
Quarz Frequenz stimmt. Demnach ist nach Adam Riese, dein Spi Takt 57225
Hz.
->Klugscheissmodus aus
Gruß
@Fabian
> Haste denn die 10µF Kondensatoren nach bestückt?
welche 10µF Kondesatoren ? bei dem MAX-Chip ? Ich verwende einen MAX202,
für den reichen 100 nF (deswegen nehme ich den so gerne...:-)
gute Nacht
Moin,
nein wie oben schon erwähnt, sollten an den LT1086 die 10µF
Kondensatoren vor und hinter den Reglern.
Code ist so schwer zu beurteilen, da das gepostete ja praktisch nur aus
Funktionsaufrufen besteht.
Gruß
> beim Lesen der R1 werden 16 Clockpulse ausgegeben - zum einen hätte ich > nur 8
Clock erwartet,
Es könnten auch noch mehr Takte sein, je nach Karte, Lust, Laune und
Mondphase aber immer ein vielfaches von 8.
@Martin:
> je nach Karte, Lust, Laune und Mondphase ...
Nein, aber danke, ich hab's im SanDisk Handbuch gefunden, es geht um die
Zeit Ncr(Abschnitt 5.23)
@Fabian:
> 10 µF an den Reglern
Ja stimmt, hatte ich aber auch schon versucht.
Ich vermute, dass die Widerstandsteiler die Flanken versauen, was ich
mit meinem 20 MHz Oszi nicht mehr richtig sehen kann - zumal ich gestern
noch einen Artikel gefunden habe, der ähnliches beschreibt. Seit gestern
habe ich noch eine 1GB Karte von extrememory, die antwortet plötzlich,
aber die Karten-Identifikation (Hersteller etc) ist bei jedem Lesen
anders. Ausserdem benimmt sich die Schaltung unterschiedlich, wenn ich
die Vcc zwischen 3.5 und 5V variiere, das deutet alles auf unsaubere
Signale hin.
Ich besorge mir jetzt erstmal einen schnellen 3.3V Treiber und dann sehe
ich weiter, aber vielen Dank auch.
Den Code könnt ihr euch unter
http://www.roland-riegel.de/sd-reader/index.html laden, ich verwende nur
das sd_raw.c und ein paar angepasste H-Dateien.
Fabian, wenn du aber freundlicherweise mal deinen Code posten könntest,
vielleicht in einer Minimalversion, wäre das sicher hilfreich,
danke, Matthias
Hi,
bin noch bei der Arbeit, kann ja hwut abend mal was raussuchen und
anpassen fürn Mega8. Was brauchste denn nur die Ini oder auch lesen und
so ?
>10 µF an den Reglern>Ja stimmt, hatte ich aber auch schon versucht.
Und ich hoffe die sind noch dran ?
>Ich vermute, dass die Widerstandsteiler die Flanken versauen, was ich>mit meinem 20 MHz Oszi nicht mehr richtig sehen kann
Sicher werden die Flanken nen bissl flacher. Aber SD Karten sind da
eigentlich sehr gutmütig. Hatte noch nie Probleme mit Widerständen als
Teiler.
>Ich besorge mir jetzt erstmal einen schnellen 3.3V Treiber und dann sehe>ich weiter, aber vielen Dank auch.
Kürz lieber erstmal deine Leitungen radikal. 12cm und mehr funzen
eigentlich bei mir schon, aber probieren geht über studieren.
>Ausserdem benimmt sich die Schaltung unterschiedlich, wenn ich>die Vcc zwischen 3.5 und 5V variiere, das deutet alles auf unsaubere>Signale hin.
Diese Aussage verstehe ich nicht. Hauste 5 Volt auf deine SD Karte ?
Oder versorgst du deinen Mega nur mit 3,5 Volt, denn beides geht nicht.
Erstes weil die SD Karten nur 3,6 Volt vertragen, zweiteres wegen den
Spannungsteilern. ???
Gruß
Hallo,
> Was brauchste denn nur die Ini oder auch lesen und...
das Ini würde mir schon reichen, wenn du so was wie GetInfo hast, mit
dem man die Kartendaten lesen kann, hätte ich was aussagekräftiges
> Widerstände als Teiler...
naja ich halte das auch nicht für wahrscheinlich, aber im Moment
probiere ich alles durch...
Die Leitungen werde ich ohnehin kürzen - nur waren die Signale lt. Oszi
ganz passabel.
Den ATmega habe ich natürlich am Labornetzteil mit 5V, die SD-Karte hat,
wie oben beschrieben, einen eigenen 3.3V Regler. Ich habe testhalber die
5V etwas variiert, innerhalb der Grenzen die der ATmega verträgt - aber
ein klares Fehlerbild gibt das nun auch nicht.
Ich habe mir vom Nachbarn mal noch eine SD-Karte geliehen, eine 1GB
Sandisk, die kann ich initialisieren, aber das Auslesen der Info-Bytes
liefert jedesmal andere Werte. Irgenwie scheint meine Schaltung knapp an
der Kante von irgendeiner Toleranz zu sein - ich suche weiter...
Hi,
ich habe die Schaltung komplett zerlegt und neu aufgebaut, die Leitungen
betragen jetzt nur noch ca. 6 cm - und nun kann ich alle meine SD-Karten
lesen.
Soweit ich das per Oszi beurteilen kann, haben sich die Signale nicht
verändert, also bin ich verwundert aber erst mal zufrieden...
danke fürs Helfen