SD Karte Sektor auslesen unzuverlässig

Gast #495309
Lesenswert?

Hallöchen, hab folgendes Problem:

Controller Freescale MC9S12X,
über SPI an SD-Karte (Toshiba 16MB oder SanDisk 128MB),
Initialisierung und OCR, CSD, CID Register auslesen kein Problem.
Taktrate 40kHz ... 4MHz alles soweit ok ...

Ich lasse zyklisch (alle 5 sek) immer den gleichen Sektor auslesen:

Beim Auslesen (512Byte) passiert es vielleicht jedes dritte mal, dass 
die ersten 10 Byte des Sektors falsch sind (stattdessen werden 10 Byte 
aus der Mitte des Sektors übertragen). Die restlichen 502 Byte sind dann 
in Ordnung.

Was auch ab und zu vorkommt:
Vor dem eigentlichen Sektor (512Byte) sollen ja zuerst mal so 60 bis 70 
"FF"- Bytes und dann das Startbyte "FE" und danach die 512 Byte Daten 
kommen. Manchmal fehlt aber das Startbyte einfach ohne Erklärung, die 
"FF"s sind da und die empfangenen Daten sind auch korrekt - nur das 
Startbyte fehlt. Wie kann das sein? Arbeiten die Karten derart 
unzuverlässig oder was ist da los?

Hat Jemand schon mal ähnliche Erfahrung gemacht? Probiere schon den 
ganzen Tag rum und bin kurz vorm verzweifeln ...
Gast #495383
Lesenswert?

Hallo,
ich habe schonmal ähnliches gehabt. Vor allem hatte ich Probleme mit 
SD-Karten, aber nicht mit MMC. Nach langem gesuche bin ich 
dahintergekommen, daß mein SPI ganz einfach zu schnell war...
Gast #495405
Lesenswert?

Meine Erfahrung bezüglich Geschwindigkeit:

habe auch eine SD-Karte am laufen (allerdings an einem ARM7) - das geht 
problemlos bis 18,43 MBit SPI-Geschwindigkeit.

Das ganze funktioniert mit Standardlitze (max. 6cm Kabellänge).

Habe die SD-Karte direkt an den I/O-Pins (keine Widerstände).

Der Kartenhalter stammt aus einem alten Kartenlesegerät.



Fazit: Sind Deine Parameter in diesen Grenzen, sollte es eigentlich 
nicht an der SPI-Geschwindigkeit liegen.
Gast #495482
Lesenswert?

Das mit der SPI-Geschwindigkeit hatte ich mir auch schon überlegt, aber 
selbst bei 40kHZ ist das Problem aufgetreten. Langsamer kann der 
Controller gar nicht g

Verdrahtet hab ich das System mit Fädeldraht, je ca. 5cm Draht, dann an 
den SPI-Pins nochmal 5cm Litze für die Oszi-Tastköpfe ... die 
Kontaktiereinrichtung ist gänzlich neu (von Farnell). Bauteile hängen 
keine zischen Controller und Karte, bis auf 470nF Kondensator zwischen 
+3,3V und GND.

Frage an srb(Gast): Wenn Du die SPI langsamer gemacht hast, war das 
Problem dann beseitigt? Wie schnell war denn Deine SPI? und Bei welcher 
Taktrate war dann die Grenze?

Was mir grad einfällt: Viele Codes für SD-Karten bedienen den 
"SlaveSelect"-Pin manuell durch Bit setzen/rücksetzen an einem I/O Port. 
Bei mir wird das automatisch über die SPI-Schnittstelle gemacht? -sieht 
auf dem Oszi auch ganz ok aus. Meint Ihr, das könnte ein Problem sein?

Frage an antworter(Gast): Ich verwende die einfachsten SD-Karten - also 
nix mit Ultra oder Highspeed oder so. Laut CSD-Register ist der 
Standardwert mit 25MHz eingetragen - gilt das aber auch für die SPI oder 
nur für den SD-Mode?

Hach, ich hab immer noch keine Idee, warum s net funktioniert :-(
Gast #495516
Lesenswert?

@Martin:

Ich benutze eine noname-SD-Karte (256MB). Da ich noch am implementieren 
bin, ist das Auslesen/Setzen der Register noch nicht enthalten.

Die Karte spreche ich von Anfang an mit hoher SPI-Geschwindigkeit (18 
MHz) an - geht wunderbar.

Meine Befehlsfolge zum Initialisieren:

CMD0 (go idle)
CMD1 (activate) (nicht ACMD41)

Anschließend kann ich die Karte ganz normal benutzen (bis jetzt: 
SetBlockSize & BlockRead implementiert).

Noch ein Tip: Richtig verläßlich lief es erst, nachdem ich die 
Timeout-Werte für die Operationen sehr hoch angesetzt habe (++100) - 
dies dürfte der hohen SPI-Geschwindigkeit geschuldet sein.



Viel Spaß & Erfolg :-)


P.S.: Der Abblockkondensator (100nF) hängt in 2-3cm Entfernung von den 
SD-Pins.

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