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.
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.
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.
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.
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:
Initialisierung: Wie oben erwähnt - bei der Initialisierung RDY=1 pollen. UND/ODER: DSC=1 pollen?
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.
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,
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.