Hi Leute,
auch ich versuche (mit einem PIC16F877) auf eine CF-Karte zuzugreifen
und habe ein ähnliches Problem wie es Daniel in diesem Forum unter
http://www.mikrocontroller.net/forum/read-1-161430.html beschrieben
hat. Grundlage meiner Arbeit ist ebenfalls der oben erwähnte Artikel im
PDF-Format.
Die Frage in welchem der 3 in der CF-Spezifikation angegebenen Modi (PC
Card Memory Mode, PC Card I/O Mode, True IDE Mode) die Karte nun läuft
habe ich auch noch nicht restlos geklärt, ich denke aber sie läuft im
PC Card I/O-Mode, wenn das Auslesen über den /OE-Pin (Pin 9 der
CF-Karte) erfolgt. Den PC Card Memory Mode schließe ich aus. Leider
habe ich in der CF-Spezifikation keine eindeutigen Hinweise gefunden
(oder nicht verstanden).
Das Seltsame bei mir ist, dass ich zunächst zwei Sektoren, nämlich den
Master Boot Record (Sektor 0 der Karte) und den Bootsektor (Sektor 32
laut Partitionstabelle, entnommen dem 4-Byte-Wert ab Offset 454 im
Master Boot Record) problemlos von meiner 128MB Sandisk CF-Karte lesen
kann. Auf die gleiche Art und Weise möchte ich einen weiteren Sektor
lesen und bekomme dann plötzlich lauter gleiche Zeichen (0x58, hierbei
handelt es sich verarschenderweise um ein großes X). Das Verhalten ist
stabil, egal wie oft oder wie lange ich die Stromzufuhr unterbreche und
somit einen Reset meines µCs ausführe. Zeit- und Warteschleifen im Code
vor und nach dem Absetzen des ATA-Kommandos "Read Sector" 0x20
bringen nix. Mit meinem USB-Kartenleser (so ein ganz billiger für
9,99EUR) und dem Tool "WinHex" kann ich die Karte ordnungsgemäß
lesen, daraus schließe ich auch, dass sie noch funktioniert.
Ich hatte bereits zu Anfang meiner Experimente ein ähnliches Problem
bereits beim ersten Lesen eines Sektors wie auch bei "identify Drive"
0xEC, damals halfen relativ extreme Wartezeiten. Durch Umstellen des
Codes und Auswerten des RDY/-BSY-Signals (Pin 37) war das Problem
zunächst verschwunden. Das könnte ich vor dem 3. "Read-Sector"-Aufruf
noch überprüfen, habe ich noch nicht getan.
Vielleicht liegt's aber auch daran, dass ich beim 2. Aufruf nicht alle
512 Bytes über den /OE-Strobe abhole, da ich sie nicht benötige. Am
/OE-Strobe swelbst liegt's nicht, denn wenn ich den 3.
"Read-Sector"-Aufruf nicht absetze, bekomme ich astrein die übrigen
Bytes des zuvor gelesenen Sektors. Da ich aber trotzdem 512 Bytes lese,
im CF-Buffer aber nur noch (in diesem Fall) 464 Bytes drin sind, bekomme
ich 48 ungültige Bytes, die alle den Wert 0x55 haben (großes U).
Ich werde diese beiden Varianten noch testen und melde mich dann
nochmal.