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
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!!!
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.
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
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
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 ...
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.
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
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
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