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.
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)
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
Ich habe keine Ahnung von BASCOM, aber fehlt im CMD9 nicht das abschließende Einlesen von CRC16?
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
@ senex24 Such mal in http://www.csd-electronics.de/de/index.htm nach " SCDA1A1501" Dann kannst du uns auch Deine neue Konstruktion schildern ;-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.