Forum: Mikrocontroller und Digitale Elektronik SD-Karte - Initialisierungs Timing - langsam


von Ilja (Gast)


Angehängte Dateien:

Lesenswert?

Hallo -

ich habe ein Problem mit der Initialisierung einer SD-Karte. Die Karte 
ist ueber einfache Spannungsteiler (1.8k+3.3k) an einen Atmel (Vsup=5V) 
gehaengt. Die 3.3V fuer die Karte kommen aus einem Spannungsregler. MISO 
aus der Karte geht direkt zum Atmel. Prinzipiell laeuft die Routine, 
eine alte SD-Karte konnte ich erfolgreich lesen und beschreiben. Mit 
einer neuen SD-Karte tritt folgendes Problem auf:

Die Karte antwortet korrekt und will 0x01 ausgeben, da die Kanten 
allerdings sehr (!) ausgeschliffen sind kommt beim uC (Atmel) nur noch 
0x00 an. Das Hardware-SPI-Timing ist schon auf minimaler Geschwindigkeit 
((1<<SPR0)|(1<<SPR1),(0<<SPI2X)).

Beim Messen mit dem Oszi sehe ich die Flanken der Karte: Mehr als 10us 
Anstiegszeit! Bei 3.3V und wenn ich einen Widerstand gegen Masse haette 
von ca. 1kOhm wuerde mir irgendwo eine Kapazitaet von 1nF (!) so eine 
Flanke ergeben. Es haengt nur der uC und die Karte am MISO (naja... und 
das Oszi). Die Leitung ist <10cm. Das hat mit den Specs nun wirklich nix 
mehr zu tun. Kann doch garnicht sein - In den Specs heisst es, dass 
der Init langsamer sein muss als 400kHz. Wo in meiner Schaltung so eine 
Kapazitaet sitzen sollte ist mir voellig schleierhaft.

Der angehaengte Oszi-Screenshot zeigt folgendes:

CLK (5V, am AVR) und MISO (an SD-Karte)

* links: Reste von der Init-Sequenz (...0x95)
* kurz warten
* 1 Dummy write (ich schreibe 0xFF)
* dann kommt eine Antwort von der SD-Karte - ich erwarte ein 0x01, d.h. 
Idle-Mode ready. 0x01 kommt - total ausgewaschen - Atmel erkennt 0x00.
* danach kommt fast SPI zum Display schreiben

Nun einige Fragen: Gibt es irgendwie die Moeglichkeit den Hardware-SPI 
noch langsamer zu schalten? Oder muss ich dann 'von Hand' nen Software 
SPI bauen?

Ich habe bereits den Pull-Up am MISO ein- und ausgeschaltet - kein 
Unterschied.

Wenn Levelshifter: Welcher laeuft gut an der SD-Karte? Reicht es, dass 
ich nur MISO ueber nen Levelshifter laufen lasse?

Gibt's nen einfachen Weg die aktuelle Flanke irgendwie zu verkuerzen? 
Sowas wie PullUp oder PullDown auf GND? Meine Versuche MISO mit 1kOhm 
auf 5V zu ziehen waren leider nicht erfolgreich...

Die anderen Implementationen mit ner SD-Karte direkt am MISO von nem 
5V-Atmel laufen ja auch... Uebersehe ich was?

Gruesse - Ilja

von Guest (Gast)


Lesenswert?

Das mit den Widerständen haut in den seltensten Fällen immer gut hin.
Wenn schon Pegelshifter, dann ALLE Signale shiften; idealerweise noch 
einer, der die Pins tristate schalten kann.
Wird z.B MISO weiterhin direkt an den AVR gelegt, ist die Karte hin, 
wenn der ISP-Programmer dranhängt und kommuniziert.

Es gibt u.a. für ca. 20 EUR nen fertigen Slot, der bereits alles 
draufhat bei Display3000. Der funktioniert bei mir perfekt und hat noch 
nie Probleme bereitet.

von (prx) A. K. (prx)


Lesenswert?

Hast du für die Messung einen 1:1 Tastkopf verwendet? Der schlägt mit 
erheblicher kapazitiver Last zu Buche. Sieht so aus, als ob der 
MISO-Ausgang dieser SD etwas schwach auf der Brust ist.

von Ilja (Gast)


Lesenswert?

Ja, is nen 1:1 Tastkopf (Rigol-Trash).

Die CLK habe ich am Atmel abgegriffen (sieht man ja: 5V) das MISO ist 
direkt von der Karte (sieht man ja auch die ~3.nochwas V). Die Level 
sind okay, denn wenn ich spaeter lese, kommen auch brav die 0xFF zurueck 
(trotz 3.3V out).

Cheers
            Ilja

von (prx) A. K. (prx)


Lesenswert?

Guest schrieb:

> Das mit den Widerständen haut in den seltensten Fällen immer gut hin.

Hier geht es um die MISO-Leitung, also 3,3V raus 5V rein. Diese Leitung 
hat (hoffentlich) keine Spannungsteiler dran ;-).

von (prx) A. K. (prx)


Lesenswert?

Ilja schrieb:

> Ja, is nen 1:1 Tastkopf (Rigol-Trash).

Dann schalte um auf 10:1. Tastköpfe in 1:1 Einstellung sind nur selten 
wirklich sinnvoll zu gebrauchen, oft beeinflusst dessen niedrige 
Geschwindigkeit und hohe kapazitive Last erheblich die Messung.

Apropos Trash: Die Testecs sind zwar besser, aber für den hier 
betrachteten Zeitrahmen sind die Rigols ok.

von Ilja (Gast)


Angehängte Dateien:

Lesenswert?

Hi A.K. -

Yup - ich habe jetzt nochmal 1kOhm zwischen MISO und +5V gehaengt und 
den Tastkopf auf 10:1 umgestellt. Leider immer noch das gleiche Ergebnis 
(siehe Screenshot).

Aber die Init funktioniert ja leider auch nicht wenn ich den Tastkopf 
abklemme.

Welchen Levelshifter benutzt den Display 3000. Gibt's nen Plan von deren 
Board? Was ist das mit dem Tristate auf deren Website. Ist das wirklich 
noetig? Habt ihr nen Levelshifter den ihr empfehlen koennt?

Gruesse

               Ilja

von (prx) A. K. (prx)


Lesenswert?

Ilja schrieb:

> Yup - ich habe jetzt nochmal 1kOhm zwischen MISO und +5V gehaengt

Lass das lieber. Denn so fliesst Strom in den Ausgang der mit 3,3V 
betriebenen SD rein. Das muss die nicht unbedingt mögen.

Wenn bereits das nackte unverfälschte MISO-Signal der SD so verquast 
aussieht, dann ist ein besserer Levelshifter auch keine Lösung. Denn 
auch der wird aus Scheisse kein Gold machen.

von Ilja (Gast)


Lesenswert?

Hi A.K.

Klar - sicherlich kann ich aus der Flanke nicht eine Anstiegszeit von 
1ns rauszaubern. Das sehe ich ja ein...

Die Frage ist nur was ich jetzt idealerweise machen soll. Die 
Erlaeuterungen zur Flankensteilheit auf Display3000 zum Levelshifter 
sind schon plausibel - also wuerde ich dann doch mal vermuten, dass nen 
Levelshifter was bringen koennte. (huestel... welcher Levelshifter?)

Ich habe auch schon versucht den Atmel beim SPI auf die hintere Flanke 
detektieren zu lassen ((1<CPHA)) - das hat's leider auch nicht gebracht. 
Im Moment sehe ich nur alles noch langsamer zu machen, d.h. irgendwie 
einen Software-SPI 'zu Fuss' zu implementieren.

Komisch, dass es aber scheinbar bei vielen Implementationen gut 
laeuft... und ich habe auch schon zwei verschiedene Karten die so ein 
'flachbruestiges' MISO ausspucken. Ich habe auch nochmal die 3.3V mit 
10nF an direkt an der Karte gebuffert. Hmm.

Fuer Tipps und Tricks bin ich jetzt also mehr als offen...

          Ilja

von (prx) A. K. (prx)


Lesenswert?

Ilja schrieb:
> Hi A.K.
>
> Klar - sicherlich kann ich aus der Flanke nicht eine Anstiegszeit von
> 1ns rauszaubern. Das sehe ich ja ein...

Die Flankensteilheit zu erhöhen ist kein bischen schwierig. Die Frage 
ist eher der Zeitpunkt der Flanke, denn wenn das Datensignal dem 
Taktsignal nur mit 5µs Verzögerung folgen kann, dann wird das nix mit 
einer ordentlichen Datenrate.

von Ilja (Gast)


Lesenswert?

Naja - ich hoffe ja eigentlich, dass die Initialisierung lahm ist und 
spaeter das Schreiben und lesen ein wenig schneller. (So verstehe ich 
das wenigstens aus den SD-Specs)

Gruesse
              Ilja

von Ilja (Gast)


Angehängte Dateien:

Lesenswert?

Hmm - hier also nochmal ein Screenshot von einer anderen SD-Karte: Die 
Flanke ist Faktor 10 kuerzer! Scheinbar liegt es nicht an der Platine 
oder sonstwas - es scheint NUR an der SD-Karte zu haengen. Irgendwelche 
Ideen da nochmal ein wenig langsamer zu lesen oder irgendwelche Delays 
einzubauen?

Ich habe natuerlich schon Beitrag "SD-Card über SPI - manche gehen, manche nicht." 
angeschaut, aber leider bringt mich das auch nicht weiter.

Gruesse

             Ilja

von MeinerEiner (Gast)


Lesenswert?

Wie siehts denn mit der Funktionalität der "langsamen" Karte in anderen 
Geräten aus? Digicam etc.
Funktioniert die da? Wenn ja, genau so schnell wie ne andere?

von Ilja (Gast)


Lesenswert?

Ja, alles kuschelig. Die Karten sind schnell und gut..

Ich denke aber. dass die Karten die nicht laufen (Sandisk Ultra II 
15MB/s und eine NoName (disk2go.com)) im Compi ohnehin nicht im SPI Mode 
laufen.

Die Karte die laeuft ist vermutlich von 1999, eine Canon 16MB.

Gruesse
               Ilja

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.