CompactFlash Busy & Ready Bits

Hallo,

ich habe eine Applikation mit Mikrocontroller und CompactFlash-Karte mit FAT-Dateisystem darauf.

Ich setzte einen "Read-Sector"-Befehl ab, um anschließend den Buffer auszulesen. Für den korrekten Ablauf warte ich nach dem "Read-Sector"-Befehl auf BUSY=0 und RDY=1 im Status-Register. Das ganze dauert aber (gemessen mit Hardwareflag-Ausgabe) ganze 1,2 ms!

RDY ist in weniger als einer Mikrosekunde auf 1 gesetzt, aber BUSY ist so langsam ...

Das ist doch nicht richtig so, oder? Der Datendurchsatz müsste doch viel höher gehen.

Was mache ich falsch?

Danke für jeden Hinweis und viele Grüße, Alois

Reply to
Alois Huber
Loading thread data ...

Alois Huber schrieb:

Jedesmal oder nur beim ersten Zugriff? IIRC schlafen CF-Karten nach einer gewissen Zeit ein und brauchen dann beim ersten Zugriff ein bischen bis sie wieder auf "Touren" sind.

--
Matthias Weißer
matthias@matwei.de
http://www.matwei.de
Reply to
Matthias Weißer

Jedesmal; ich rufe ausschließlich Sector-Reads in der Mainloop zyklisch auf, alle anderen Funktionen sind darin mittlerweile auskommentiert.

Was Du meinst ist die "Sleep-to-read"-Zeit, die 50 ms beträgt, wenn man 5 ms kein Kommando schickt (weil die Karte dann automatisch in den Sleep-Modus wechselt). Das kann ich aber ausschließen.

Mir ist auch nicht ganz klar, ob ich nur RDY pollen soll, oder RDY und BUSY (im Register Status, Adresse 0x1f7 bzw. Offset 0x7). Ich hab mal BUSY auskommentiert - funktioniert aber offensichtlich nicht, da die im folgenden eingelesenen Daten Müll sind.

Die CF-Card wird im True-IDE-Modus betrieben. Ich kann alle Funktionalitäten mit LBA-Adressierung damit ausführen:

- Boot-Sektor auslesen

- Volume-ID-Sektor auslesen

- Root-Directory auslesen

- Den Cluster einer gewünschten Datei berechnen und anschließend mit einem Algorithmus ggf. aus der FAT auf neue Sektoren zugreifen und Daten lesen, lesen, ..., bis die Endemarke 0xffffffff im FAT32-Eintrag steht

Nur geht es eben ewig langsam, wenn ich nach dem "Read Sector" Kommando auf die beiden Bits polle und dann endlich den Buffer auslesen kann.

Da die Karte im True-IDE-Modus angeschlossen ist brauche ich ja den Hardware-Pin RDY/BSY (Pin 37) ja nicht pollen, denn das ist im True-IDE-Modus ja das INTRQ-Signal. Oder liege ich da falsch? Ich mache das ausschließlich über das o.g. Register.

Reply to
Alois Huber

Alois Huber wrote in news:42cead54$0$18644$ snipped-for-privacy@news.sunsite.dk:

Da macht die dann wohl einen Read-Ahead? (Liest also den nächsten Sektor schonmal "auf Vorrat" in den interen Puffer). Versuche doch mal eine schnelle CF-Karte. Normale haben nur so 0,5-1,5MB/s da kommt das mit den 1.2ms pro 512 bytes schon hin.

M.

--
Bitte auf mwnews2@pentax.boerde.de antworten.
Reply to
Matthias Weingart

Hallo Alois,

Alois Huber schrieb:

in der CF-Spec steht, dass alle anderen Bits des Statusregisters ungültig sind wenn das BUSY-Bit gesetzt ist, also auch RDY.

Gruß Ernst

Reply to
Ernst Schwab

Hallo Ernst,

Hab ich gelesen. Also BUSY sperrt den Zugriff auf den Pufferspeicher - soweit klar.

Zum Verständnis der anderen Bits:

- RDY: soll dann nur nach dem Einschalten/Reset ge-"pollt" werden, richtig?

- DWF: gesetzt wenn Schreibfehler - ist klar

- DSC: "This bit is set when the CF card is ready" [1]: Was ist der Unterschied zu RDY?

- DRQ: gesetzt, wenn Daten im DATA-Register geholt bzw. geschrieben werden können

- CORR: Ein (Lese-)Fehler ist aufgetreten, wurde aber korrigiert - auch klar

- IDX: immer 0 - auch klar

- ERR: Fehler Sammelmeldung, Fehlerbeschreibung im Error-Register - auch klar

Um ein Protokoll aufzubauen, bedarf es:

  1. Initialisierung: Wie oben erwähnt - bei der Initialisierung RDY=1 pollen. UND/ODER: DSC=1 pollen?

  1. Handshaking Datentransfer: Nach Sector-Read auf BUSY=0 warten, dann kann der Buffer ausgelesen werden. ABER: Was ist dann die Bedeutung von DRQ, wenn es durch BUSY=1 ungültig ist?

Weiteres: DWF ist nich notwendig, da ich nur "Read-Only" brauche. CORR lasse ich unbeachtet. IDX ist nicht benutzt. ERR führt zur Fehlerroutine

Der Zusammenhang zwischen RDY und DSC bzw. BUSY und DRQ ist mir noch nicht klar. Im Manual [1] ist leider auch kein Protokollvorschlag erklärt. Ist echt müßig, wenn man sich alles zusammenklauben muß!

Das mit der BUSY-Zeit ist inzwischen klar - danke Matthias! Die Datentransferrate ist damit korrekt.

Viele Grüße, Alois

[1] CompactFlash Memory Card Product Manual, Rev. 10.0, SanDisk Corp.
Reply to
Alois Huber

Hallo Alois,

Alois Huber schrieb:

Das habe ich auch so verstanden. Hiermit wird wohl das Ende der Initialisierung nach Reset signalisiert.

DSC scheint die Fertigstellung des zuletzt gegebenen Kommandos anzuzeigen (laut Tabelle 56 [2] ist DSC bei jedem Kommando gültig).

Statt 'können' vielleicht eher 'müssen'.

Nach meiner Interpretation ja.

Ich interpretiere das so: Je nach Kommando wird DRQ aktiv oder nicht, siehe z.B. den Unterschied zwischen 'Read Verify Sector' und 'Read Sector'. Bei beiden wird BUSY aktiv, während die Karte die Daten aus dem Flash liest. Beim Verify ist das Kommando dann schon beendet, beim Read wird ist nach BUSY=0 noch DRQ aktiv, weil Daten zu übertragen sind. DRQ wird vermutlich genau dann aktiviert, wenn im Read-DMA-Kommando die DMAREQ-Leitung aktiviert würde, d.h. genau nach dem Transfer des letzten Datenwerts inaktiv.

Gruß Ernst

[2] CF+ and CompactFlash Specification Revision 3.0,
formatting link
Reply to
Ernst Schwab

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.