ATmega8 mit SD card will nicht

OP #1115486
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.
Persönliche Seite #1115553
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
(Firma: TravelRec.) Persönliche Seite #1115609
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.
OP #1115902
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 ?
OP #1117002
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
Angehängte Dateien:
#1117013
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ß
OP #1117023
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....
Gast #1117063
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.
OP #1117107
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
#1117719
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ß
OP #1118044
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...
OP #1118699
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren