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
intselect(void)/* 1:Successful, 0:Timeout */
3
{
4
CS_LOW();
5
xchg_spi(0xFF);/* Dummy clock (force DO enabled) */
6
7
if(wait_ready(500))return1;/* OK */
8
deselect();
9
return0;/* Timeout */
10
}
die darin aufgerufene Funtion wait_ready liefert Timeout, weil die
Variable d immer 0 ist.
1
static
2
intwait_ready(/* 1:Ready, 0:Timeout */
3
UINTwt/* Timeout [ms] */
4
)
5
{
6
BYTEd;
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
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?
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
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.
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.
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.
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.
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.
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.
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.
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.