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 ?
Hi, poste mal Code und Schaltplan, um alle Missverständnisse vorzubeugen. Gruß
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..
>ich werde mal einer Variante raussuchen..
Schaltplan so, wie Du es aufgebaut hast. Hast Du denn einen PullUp an
DataOut der SD-Karte?!
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
1 | void main (void) |
2 | {
|
3 | sd_raw_init(); |
4 | |
5 | while (1) { } |
6 | }
|
matthias
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:
> Spi Takt 57225 Hz.
äh, ja - mein Fehler, Quarz ist natürlich 7.3728 MHz
Ich poste mal nur den Anfang, das sollte eigentlich reichen...
1 | uint8_t sd_raw_init() |
2 | {
|
3 | /* enable inputs for reading card status */
|
4 | configure_pin_available(); |
5 | configure_pin_locked(); |
6 | |
7 | /* enable outputs for MOSI, SCK, SS, input for MISO */
|
8 | configure_pin_mosi(); |
9 | configure_pin_sck(); |
10 | configure_pin_ss(); |
11 | configure_pin_miso(); |
12 | |
13 | unselect_card(); |
14 | |
15 | /* initialize SPI with lowest frequency; max. 400kHz during identification mode of card */
|
16 | SPCR = (0 << SPIE) | /* SPI Interrupt Enable */ |
17 | (1 << SPE) | /* SPI Enable */ |
18 | (0 << DORD) | /* Data Order: MSB first */ |
19 | (1 << MSTR) | /* Master mode */ |
20 | (0 << CPOL) | /* Clock Polarity: SCK low when idle */ |
21 | (0 << CPHA) | /* Clock Phase: sample on rising SCK edge */ |
22 | (1 << SPR1) | /* Clock Frequency: f_OSC / 128 */ |
23 | (1 << SPR0); |
24 | SPSR &= ~(1 << SPI2X); /* No doubled clock frequency */ |
25 | |
26 | /* initialization procedure */
|
27 | sd_raw_card_type = 0; |
28 | |
29 | if(!sd_raw_available()) |
30 | return 0; |
31 | |
32 | /* card needs 74 cycles minimum to start up */
|
33 | for(uint8_t i = 0; i < 10; ++i) |
34 | {
|
35 | /* wait 8 clock cycles */
|
36 | sd_raw_rec_byte(); |
37 | }
|
38 | |
39 | /* address card */
|
40 | select_card(); |
41 | |
42 | /* reset card */
|
43 | uint8_t response; |
44 | for(uint16_t i = 0; ; ++i) |
45 | {
|
46 | response = sd_raw_send_command(CMD_GO_IDLE_STATE, 0); |
47 | if(response == (1 << R1_IDLE_STATE)) |
48 | break; |
49 | |
50 | if(i == 0x1ff) |
51 | {
|
52 | unselect_card(); |
53 | return 0; // *** hier falle ich dann raus *** |
54 | }
|
55 | }
|
56 | |
57 | ...usw.... |
@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
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.