Forum: Mikrocontroller und Digitale Elektronik Elm Chan FatFs, funktioniert nicht mit Intenso microSD


von Alexander H. (ill_son)


Lesenswert?

Hallo,

ich habe folgendes Problem: für ein Projekt verwende ich das Fats File 
System von Eml Chan inklusive dessen Layer für die SD-Karte. Jetzt habe 
ich reproduzierbar das Problem, dass ich bei dieser microSD von Intenso 
(4GB) 
https://www.intenso.de/produkte/speicherkarten/microsd-karte-class-10 
einen Fehler 3 (FR_NOT_READY) bekommen. Ich habe mehrere Karten 
getestet, immer das gleiche. Alterativ habe ich noch SanDisk Ultra 16GB 
da. Die funktionieren problemlos, haben aber auch bessere Werte für die 
Datenraten.

Controller ist ein ATXMEGA128A3U mit internem 32MHz Quarz.

Ich habe folgendes schon versucht: SPI Clock ist beim initialisieren 
minimal (größtmöglicher Vorteiler). Beim normalen Betrieb habe ich mit 
maximaler Clock-Frequenz und halbe maximale Clock-Frequenz versucht. Ich 
habe versucht, das Timeout zu variieren.

Ich konnte auch die Stelle lokalisieren, wo der Fehler auftritt:
in der mmc_avr.c bei disk_initialize wird eine Funktion select 
aufgerufen:
1
static
2
int select (void)  /* 1:Successful, 0:Timeout */
3
{
4
  CS_LOW();
5
  xchg_spi(0xFF);  /* Dummy clock (force DO enabled) */
6
7
  if (wait_ready(500)) return 1;  /* OK */
8
  deselect();
9
  return 0;  /* Timeout */
10
}

die darin aufgerufene Funtion wait_ready liefert Timeout, weil die 
Variable d immer 0 ist.
1
static
2
int wait_ready (  /* 1:Ready, 0:Timeout */
3
  UINT wt      /* Timeout [ms] */
4
)
5
{
6
  BYTE d;
7
8
  Timer2 = wt / 10;
9
  do
10
    d = xchg_spi(0xFF);
11
  while (d != 0xFF && Timer2);
12
13
  return (d == 0xFF) ? 1 : 0;
14
}

Woran kann das liegen? Was könnte ich noch versuchen?

Danke und viele Grüße,

Alex

von Bernd (Gast)


Lesenswert?

Alexander H. schrieb:

> Was könnte ich noch versuchen?

Probehalber das Timeout verdoppeln.

von Alexander H. (ill_son)


Lesenswert?

Das hab ich schon versucht, ich hab auch das Timeout ganz ausgeschaltet. 
Hat nichts gebracht.

von Peter S. (cbscpe)


Lesenswert?

Ich würde da mal den LA an das SPI hängen und schauen was da genau 
schief läuft.

von Falk B. (falk)


Lesenswert?

Alexander H. schrieb:
> Controller ist ein ATXMEGA128A3U mit internem 32MHz Quarz.

Den gibt es nicht. Bestenfalls einen internen RC-Oszillator.

Zeig uns ein gescheites Bild und Schaltplan deiner Hardware. Pull-Up an 
MISO?

von Alexander H. (ill_son)


Lesenswert?

Hallo Falk,

Falk B. schrieb:
> Den gibt es nicht. Bestenfalls einen internen RC-Oszillator.

Den meinte ich, sorry falsch ausgedrückt.

Ich wollte gerade den Schaltplan posten. Die Hardware ist nicht von mir, 
sondern von eine von einem externen Dienstleister entwickelte und 
gefertigte Platine, also keine Bastellösung. Die SD hat auch eine eigene 
Spannungsversorgung (eigener Spannungswandler). Der Tip mit dem Pullup 
war genau der richtige. Ich hab ihn zugeschaltet, jetzt geht es. Vielen 
vielen Dank. Das war mir bisher nicht bekannt. Steht das irgendwo, 
kannst du mir da kurz noch was dazu sagen?

Grüße, Alex

von Falk B. (falk)


Lesenswert?

Alexander H. schrieb:
> Der Tip mit dem Pullup
> war genau der richtige. Ich hab ihn zugeschaltet, jetzt geht es. Vielen
> vielen Dank.

Das macht ein Bier!

> Das war mir bisher nicht bekannt. Steht das irgendwo,
> kannst du mir da kurz noch was dazu sagen?

https://www.mikrocontroller.net/articles/MMC-_und_SD-Karten

"Ein Pullup-Widerstand am Ausgang der MMC/SD Karte (DO) ist für eine 
saubere Initialisierung per SPI notwendig! (Thread mit Erklärung dazu). 
Bei manchen Karten sogar, um überhaupt ein Signal auf DO zu bekommen."

Ich würde nicht den internen Pull-Up des AVRs nutzen, der ist relativ 
hochohmig, so im Bereich 50k. Eher extern mit 5-10k.

: Bearbeitet durch User
von Alexander H. (ill_son)


Lesenswert?

Allerdings scheint die Intenso irgendwie langsamer zu sein. Wenn ich den 
Timeout (wie in der Library eingestellt) wieder zuschalte, gibt's wieder 
den Fehler. Muss mal noch mit den Werten experimentieren. Sind die 
Karten da echt so unterschiedlich?

Edit:
Erster Satz unter Do und Don't im von dir verlinkten Artikel sagt ja 
schon alles.

> Lasst euch nicht verrückt machen wenn es einfach nicht funktioniert, sondern
> probiert zu allererst mal eine SD-Karte eines anderen Herstellers aus. Die
> MMC-Implementierung für AVR von Elm Chan z. B. funktioniert mit SanDisk
> problemlos hat aber mit Platinum Karten ein Problem.

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Alexander H. schrieb:
> Sind die
> Karten da echt so unterschiedlich?

Ja, sind sie. Billige Intenso sind hier bei mir im µC Betrieb schnell 
ausgefallen (aber YMMV) - ich verwende lieber Sandisk oder Samsung 
Karten.

von dummschwaetzer (Gast)


Lesenswert?

Les mal die CID aus!
wen die ald ManufacturerId eine 0 hat kannst du die Karte(aus eigener 
Erfahrung) nicht mit dem SPI Bus Protocol betreiben!

von Mike J. (linuxmint_user)


Lesenswert?

Jim M. schrieb:
> Ja, sind sie. Billige Intenso sind hier bei mir im µC Betrieb schnell
> ausgefallen (aber YMMV) - ich verwende lieber Sandisk oder Samsung
> Karten.

Also die Leute welche Intenso gekauft haben, die hatten nicht viel 
Freude an ihrer SD, SSD oder was auch immer. Mit SanDisk habe ich auch 
schon schlechte Erfahrungen gemacht. Ich setze eher auf Samsung, die 
scheinen dann doch eher qualitativ bessere Hardware zu produzieren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> ind die Karten da echt so unterschiedlich?
Intenso ist billigste Consumerware. Die nehme ich bestenfalls, um Daten 
kurz mal von A nach B zu transferieren. Aber nicht, um darauf was zu 
speichern, das ich eine Woche später noch brauche.

> Sind die Karten da echt so unterschiedlich?
Nimm ein Oszi und sieh dir die Pegel und die Flanken an. Vergleiche sie 
mit Karten, die funktionieren.

: Bearbeitet durch Moderator
von Alexander H. (ill_son)


Lesenswert?

Danke für's Augen öffnen. Mir war schon bewusst, dass es billige 
(schlechtere) und teurere (meist bessere) Karten gibt. Aber wenn man die 
Dinger nur in den Rechner schiebt und da Daten drauf packt, wird einem 
der Unterschied nicht so deutlich. Man nimmt es nur wahr, wenn man die 
Datenraten auf den Verpackungen vergleicht (ja, Euphemismusalarm), dass 
es da Unterschiede gibt.

: Bearbeitet durch User
von Mike J. (linuxmint_user)


Lesenswert?

Alexander H. schrieb:
> Man nimmt es nur wahr, wenn man die
> Datenraten auf den Verpackungen vergleicht (ja, Euphemismusalarm), dass
> es da Unterschiede gibt.

Darum geht es eigentlich auch nicht.
Bei den SanDisk µSD-Karten war es so dass es da offenbar thermische 
Spannungsrisse gab und die elektrische Verbindung dann nicht mehr 
richtig funktioniert hat. Man konnte nach dem einstecken der SD-Karte in 
den PC etwa 10-15 Sekunden lang auf die Karte normal zugreifen, danach 
konnte man nichts mehr lesen, aber man sah noch das Dateisystem und nach 
etwa 10 Minuten konnte man mit der Karte gar nicht mehr kommunizieren.

Um die paar Gigabyte auszulesen hatte ich also nur 10-15 Sekunden Zeit, 
aber das eben mehr fach, so oft ich die Karte eben nach dem Abkühlen in 
den PC steckte.

Man hatte ja Zeit um die Ordner und Dateistruktur abzufragen, so wusste 
man wo alles ist. Dann hat man einfach nur noch ein Skript geschrieben 
welches die Dateien runter lädt. Ich habe dann die in den 10-15 Sekunden 
runtergeladenen Dateien jedes mal aus den Skript gelöscht.

Hat schon ein paar Stunden gedauert.
Mein Bekannter (für den ich das gemacht habe) hat natürlich nichts für 
die Datenrettung bezahlen müssen, also hat er sich wieder eine 
billig-SD-Karte gekauft.

Wenn er die Arbeitskosten für so etwas mit auf die Karte hoch rechnen 
würde, dann würde er sich lieber eine etwas teurere Karte kaufen und 
keinen Billigmüll.

von oszi40 (Gast)


Lesenswert?

Mike J. schrieb:
> eine etwas teurere Karte kaufen und keinen Billigmüll.
Intenso ist kein richtiger Chiphersteller. Allerdings gibt es auch da 
verschiedene Preisklassen, was sich dann auf Geschwindigkeit usw. 
auswirkt.

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.