Forum: Mikrocontroller und Digitale Elektronik SD-Karte lässt sich nur einmal Lesen/Schreiben


von Niko (Gast)


Lesenswert?

Hallo!

Ich habe mir mit nem ATMEGA8 und BASCOM die Ansteuerung für ne SD-Karte 
programmiert.
Leider ließen sich nicht alle SD-Karten die ich hatte initialisieren, 
aber das habe ich mal so hingenommen.
So... nun habe ich hier zwei SD-Karten die sich initialisieren lassen.
Die eine (1GB von Platinum) lässt sich ohne Probleme beschreiben und 
auslesen (auch mehrmals hintereinander), die andere (256MB von takeMS) 
lässt sich nach dem Initialisieren nur einmal beschreiben/lesen. Egal ob 
ich CID, CSD oder einen ganzen Block lese, die Karte bleibt danach 
stumm, bzw. DO die ganze zeit auf high. Wenn ich sie dann wieder 
initialisiere, kann ich wieder einmal lesen oder schreiben.
Woran liegt das?? Hat da jemand ne vermutung?? Oder liegts einfach an 
der Karte, dass die sich einfach nicht dafür eignet?

MfG

Niko

von franky (Gast)


Lesenswert?

hallo,
mal langsam.
wie sprichst du deine SD karten an, ich vermute mal über SPI???
wie schnell ist der initialisierungstakt???
wie schnell schreibst und liest du, SPI takt???
zeig uns mal deinen code, denn das hört sich stark nach nem 
programmierfehler an!!!

von senex24 (Gast)


Lesenswert?

Zur Zeit versuche ich das gleiche, ATMega48 an 1 GB-SD-Karte von takeMS 
per SPI, mit Assembler programmiert. Keinerlei Probleme mit der Karte, 
also vermute ich auch Programmierfehler bei Niko.

von senex24 (Gast)


Lesenswert?

Aber da wir gerade beim Thema sind: was verwendet man am besten als 
Steckfassung für die SD-Karte? (Meine Konstruktion schildere ich lieber 
nicht)

von Niko (Gast)


Lesenswert?

Hallo!

Ich habe den Atmega8 auf 8MHz laufen, SPI mit nem prescaler von 128, 
also 62,5KHz SPI Frequenz. Die Benutze ich zu Initialisieren und zum 
Schreiben (vorläufig).

Hier zwei Beispielroutinen:
Erstmal die Initialisierung:

Mmc_init:

Waitms 10                                         'Kurz warten

For I = 1 To 10

   Cmd = &HFF                                    'die 80 Take
   Spiout Cmd , 1

Next

Reset Mmc_cs

Cmd = &H40
Spiout Cmd , 1

For I = 1 To 4
   Cmd = &H00
   Spiout Cmd , 1
Next

Cmd = &H95
Spiout Cmd , 1

Do
Spiin R1 , 1
Loop Until R1 <> 255

Set Mmc_cs

Spiin Cmd , 1                                  '8 SCK Impulse wenn CS 
high


Reset Mmc_cs


Do

   Cmd = &H41
   Spiout Cmd , 1

   For I = 1 To 4
      Cmd = &H00
      Spiout Cmd , 1
   Next

   Cmd = &HFF
   Spiout Cmd , 1

   Do
      Spiin R1 , 1
   Loop Until R1 <> 255

Loop Until R1 = 0                             'warten bis Karte bereit 
ist

Set Mmc_cs

Spiin Cmd , 1

Return

So.... und nun hier mal CSD_read:

Csd_lesen:

Reset Mmc_cs

Cmd = &H49
Spiout Cmd , 1

For I = 1 To 4
   Cmd = &H00
   Spiout Cmd , 1
Next

Cmd = &HFF
Spiout Cmd , 1

Do
   Spiin R1 , 1
Loop Until R1 <> 255

Spiin R1 , 1                                   '8 Dummy Takte

Do
Spiin R1 , 1
Loop Until R1 = &HFE                           'warten bis START-Byte 
kommt

For I = 1 To 16
Spiin Puffer(i) , 1
Next                                           'die 16 Byte einlesen

Spiin R1 , 2


Set Mmc_cs                                     '8 SCK Impulse wenn CS 
high

Spiin Cmd , 1

Return


Prizipiell konnte ich keinen Fehler entdecken. Zumal ja nur ein Befehl 
(egal welcher) nach dem Initialisieren bei der 256MB Karte von TakeMS 
angenommen wird, und danach Funkstille ist, und bei der 1GB Karte von 
Platinum alles einwandfrei Funktioniert.

MfG

Niko

von senex24 (Gast)


Lesenswert?

Ich habe keine Ahnung von BASCOM, aber fehlt im CMD9 nicht das 
abschließende Einlesen von CRC16?

von Niko (Gast)


Lesenswert?

Doch, tu ich. Nachdem ich die 16 Byte CSD Empfangen habe, lese ich mit 
"Spiin R1, 2" zwei Byte in R1 ein. R1 ist zwar nur eine Byte-Variable, 
aber ich fange mit den zwei CRC Bytes sowieso nicht an, also kann da 
auch ruhig ein Byte flöten gehen.

MfG

Niko

von Martin (Gast)


Lesenswert?

@ senex24
Such mal in http://www.csd-electronics.de/de/index.htm nach " 
SCDA1A1501"

Dann kannst du uns auch Deine neue Konstruktion schildern ;-)

von senex24 (Gast)


Lesenswert?

an Niko: okay, hatte ich nicht verstanden, jetzt weiß ich nicht weiter

an Martin: Danke für die Info. Dass das Ding aber fast so viel kostet 
wie eine Karte ...

von Martin (Gast)


Lesenswert?

Bei Reichelt kostet das Ding dann soviel wie 2 Karte.

Aber das ist wirklich relativ zu sehen, dass die MMCs/SDs in so kurzer 
Zeit so billig werden, war auch nicht zu ahnen.
Sei froh, denk mal an die Schmerzen in der Brieftaschengegend, wenn du 
eine 100Euro-Karte gleich beim ersten Versuch aufrauchst.
10 Euro kann man eher verschmerzen und den netten Nebeneffekt, das immer 
mehr Hobbyprogrammierer das Teil als Speicher entdecken und ein paar 
nette Dinge damit veranstalten, bringt es auch mit sich.
Naja, man ist auch nicht mehr der Einzige dem der Schädel raucht wenn 
etwas nicht gleich läuft.

von senex24 (Gast)


Lesenswert?

an Niko

Soweit ich Ihre Routinen und das BASCOM verstehen konnte, habe ich Ihr 
Programm unter Assembler nachgebildet und kann problemlos CSD mehrfach 
hintereinander lesen auf meiner (einzigen) 1 GB-Karte von takeMS.
Vielleicht doch ein Hardware-Problem, zumal ja einige Karten nicht zu 
initialisieren sind - Pegel, Flanken, Floating

von Niko (Gast)


Lesenswert?

Hmm.... Gut, mein Interface ist nicht optimal. die 3,3V werden mit zwei 
1N4148 Dioden aus 5V gemacht, mit nem Widerstand gegen GND nen halbwegs 
konstanten Stromfluss unterzogen und noch mit nem Kondensator geglättet. 
Die Pegelwandlung nimmt ein CD40106 vor, bei dem jeweils zwei 
Schmitt-Trigger hintereinander geschaltet sind (damit das Signal nicht 
invertiert wird).
Hab somit ne Spannung von 3,45V.

MfG

Schoko

von senex24 (Gast)


Lesenswert?

CD40106? Ist mir nicht ganz klar, man braucht doch:

1*  3.3 V -> 5.0 V  (DO)
3*  5.0 V -> 3.3 V  (CLK, DI, /CS)


Mögen die Spezialisten jetzt hell auflachen, bei mir funktioniert 
Folgendes (erstmal nur für die Testphase):

ATmega48 an 5.0 V

die SDC (1 GB takeMS) nimmt laut OCR 2.7 .. 3.6 V

SDC-Stromversorgung: gelbe LED an den 5 V, als Grundlast 56 k gegen GND 
sowie 100 nF und 6.8 uF Tantal. Hat auch den Vorteil, dass ich den 
SDC-Zustand so ungefähr an der LED ersehe.

DO: direkt per 220 Ohm an den m48, der erkennt das gerade noch
CLK, DI: je ein einfacher Spannungsteiler 2.7 k - 3.9 k
/CS: 2.2 k an die 3.3 V, Schottky-Diode an den m48 (Polarität!)
DAT1, DAT2: jeweils 100 k an die 3.3 V

von senex24 (Gast)


Lesenswert?

Ich vergaß: es funktioniert mit 30 cm Kabeln mit 5 MHz = 20 MHz / 4

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.