Forum: Mikrocontroller und Digitale Elektronik ATmega8 mit SD card will nicht


von Matthias D. (marvin42)


Lesenswert?

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.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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

von Matthias D. (marvin42)


Lesenswert?

@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 ?

von Jean P. (fubu1000)


Lesenswert?

Hi,
poste mal Code und Schaltplan, um alle Missverständnisse vorzubeugen.

Gruß

von Matthias D. (marvin42)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>ich werde mal einer Variante raussuchen..

Schaltplan so, wie Du es aufgebaut hast. Hast Du denn einen PullUp an 
DataOut der SD-Karte?!

von Matthias D. (marvin42)


Angehängte Dateien:

Lesenswert?

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

von Jean P. (fubu1000)


Lesenswert?

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ß

von Matthias D. (marvin42)


Angehängte Dateien:

Lesenswert?

@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

von Jean P. (fubu1000)


Lesenswert?

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ß

von Matthias D. (marvin42)


Lesenswert?

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

von Matthias D. (marvin42)


Lesenswert?

@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

von Jean P. (fubu1000)


Lesenswert?

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ß

von Martin (Gast)


Lesenswert?

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

von Matthias D. (marvin42)


Lesenswert?

@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

von Jean P. (fubu1000)


Lesenswert?

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ß

von Matthias D. (marvin42)


Lesenswert?

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

von Matthias D. (marvin42)


Lesenswert?

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
Noch kein Account? Hier anmelden.