Forum: Mikrocontroller und Digitale Elektronik CompactFlash Tutorial ?


von MicroMann (Gast)


Lesenswert?

Hallo liebe Leute !

Ich möchte eine CompactFlash Karte an meinen MC anschließen.

Leider ist mir die Ansteuerung der Karte nicht ganz klar.
Diese ist ja im Gegensatz zu statischem oder dynamischen RAM etwas
ungewöhnlich.
Kennt ihr eine gute Einführung (Buch, Dokument oder Link), die hier
einen ersten Einblick gewährt ?

Ich habe mir schon die Spec bei der CFA runtergesaugt.
Da da jedoch alle Lebenslagen und Möglichkeiten einer CF abgedeckt sind
ist das ganze etwas umfangreich. Der Anfänger wird hier mit sehr
speziellen Details erschlagen, was das Erkennen der Basics erschwert
(Aber das habt ihr bestimmt auch schon erlebt).

Ich werde es natürlich schon noch durcharbeiten, nur kann man mit dem
Basiswissen im Gepäck einfach mehr Aha-Effekte erleben.

Jaja, und gegoogelt habe ich auch schon. Leider mit mäßigem Erfolg (Es
gibt eben zu viele Anwendungen für CF. Die lassen die wertvollen Infos
in der Masse verschwinden)

von papa_of_t (Gast)


Lesenswert?

Ich hatte vor einiger Zeit das Problem "viel Speicher an einen AVR".
Da liefen mir auch SRams, serielle EProms, CF-Karten usw über den Weg.

div. Rams hatten mir zu viele Beine,
Eproms waren mir zu klein,
CF-Karten waren mir etwas aufwendig in der Ansteuerung, bzw. ich war
auch wie Du nicht zufrieden mit den Dokumentationen, die ich erhielt.

Eine gute Möglichkeit erscheint mir bis heute die SD-Karte. Auch nicht
ganz trivial in der Ansteuerung, aber sehr einfach über SPI
anzuschließen. Es gibt fertige Quelltextbeispiele hier im Forum, die
sogar funktionieren. Bild:

http://www.mikrocontroller.net/forum/read-1-294807.html#new

von MicroMann (Gast)


Lesenswert?

Hallo papa_of_t,

ich habe deinen Thread über den SD-RAM am AVR gelesen.
Respekt !

Leider bin ich schon auf CF festgelegt, da ich einige davon hier habe,
sowie auch schon den Halter.

Jetzt nochmal umsteigen ist etwas zu teuer ;-)

Ich habe hier und da ein wenig was zurechtgegoogelt und werde das mal
auswerten.
Ich hoffe dort einen leichten Einstieg zu finden.

Ist ja ein echtes Manko. Vielleicht schreibe ich mal ein
CF-Newbie-Tutorial wenn ich mich durch die Sch...Arggh..Mist CFA Spec
durchgekämpft habe.

von papa_of_t (Gast)


Lesenswert?

Dann laß mal was hören, wenn es geklappt hat. Das mit dem teuren Halter
kenne ich.. daher auch mein "Steckhalter". Ich drücke die Daumen!

Muß man denn bei CF in jedem Fall ein kleines IDE-Interface bauen und
Dateien lesen / schreiben? Bei SD schreibe ich einfach Blöcke, weil ich
PC- (Dateisystem-)Kompatibilität nicht brauche. Das schreibt auch viel
schneller, so 200-300 KByte / Sekunde.. :-)

von MicroMann (Gast)


Lesenswert?

Das geht bei CF auch.
Man braucht kein Dateisystem zu integrieren.
Ist für mich auch erstmal kein Thema.

Vielleicht später mal.

Ich melde mich wenn ich was neues weiß.

Gruß

von MicroMann (Gast)


Lesenswert?

Hallo nochmal,

ich weiß nicht warum, aber ich habe eine wertvolle Info in einem
2004'er Thread übersehen. Dort hat Erik eine geniale Beschreibung mit
allem drum und dran gemacht, wie man eine CF-Karte an einem ATMEGA 128
betreibt.

Hier nochmal der Link für das Dokument :

http://www.mikrocontroller.net/attachment.php/128617/Compact+Flash.DOC

Ein Hipp-Hipp-Hurra auf den Autor. Danke Erik !

von Stefan (Gast)


Lesenswert?

kann sein das dieser Link nicht geht??

von Baku (Gast)


Lesenswert?

Bei mir geht er.
Schönes Teil, obwohl ich es bäh(*) finde, sowas als .doc zu
schreiben...

Gruss,
Baku

(*)viele schlimme Worte durch 'bäh' ersetzt

von papa_of_t (Gast)


Lesenswert?

Ich hab mir die Datei angesehen - alle Achtung! Sehr ordentliche Arbeit.
Aber der Aufwand ist ja gewaltig! Ich würde das nur bauen, wenn ich
unbedingt noch schneller als 300 kByte / Sekunde schreiben muß. Mein
SD-"Schaltplan" beschränkt sich auf 7 Drähte und 2
Pull-up-Widerstände.. :-) Du solltest es Dir nochmal überlegen.. Falls
Du wirklich eine Platine anfertigen (lassen) mußt, dann kommt SD-Karte
und Sockel für je 10 Euro evtl. schon wieder billiger, ganz zu
schweigen von der Entwicklungszeit! Es gibt übrigens, wie ich heute
gesehen habe, auch die Variante für "Dünnbrettbohrer mit Geld" :-)

http://www.avisaro.com/html/speicher_module.html

Wobei "Dünnbrettbohrer" nicht so negaiv gemeint ist und durchaus
sinnvoll sein kann, wenn man wenig Zeit hat.. :-)

von Erik (Gast)


Lesenswert?

Danke für die Blumen... Die Doku ist wirklich nicht schlecht, ich habe
das ganze als Basis für ein Projekt verwendet welches eigentlich schon
feritg ist und läuft. (Bin am layouten).
Ich habe alles mit einem AVR und in ASM geproggt. Die Auswertung des
"CF-Busy habe ich allerdings nicht per Software wie in der Doku
beschrieben realisiert, sondern mittels der seperaten "Busy-Leitung"
der CF. Dadurch kann ich schneller auswerten als per Software, ich war
auf eine enorm hohe Datenrate angewiesen (für einen AVR).
Ich empfehle ausdrücklich CF's von Kingston, die funktionieren
einwandfrei und superschnell, mit den Sandisks hab ich schlechte
Erfahrungen gemacht.

Ich finde das Handling einiges einfacher als bei einer SD-Card.
Ausserdem ist CF meiner Meinung nach "industriekonformer und
robuster" als SD. Ich habe das Gefühl SD ist ein billigst Consumer
Produkt. Kingston gibt Lifetime Warranty auf seine CF's...
Ein grosser Nachteil ist aber natürlich der grössere Hardwareaufwand.
Bei Problemen kann ich euch evtl. helfen. Mittlerweile kann ich auch
ein wenig C proggen.
Viel Erfolg!

von MicroMann (Gast)


Angehängte Dateien:

Lesenswert?

Ja, das ist ne klasse Sache.

Ich habe das Dokument mal als PDF anhgehängt für die Vorsichtigen ;-)

Was mir noch nicht ganz klar ist :
In der CF Spec, sowie in diversen Datasheets von CF-Karten ist im
Memory mapped, sowie im I/O mapped modus A0 bis A10 an der Karte
angeschlossen. Im CF an ATMega128-Script ist auch von memory-mapped
modus die Rede (Und so habe ich es auch in einer App-note von SanDisk
gesehen als memory mapped mode) wobei nur A0-A3 angeschlossen sind (wie
im true IDE-Modus).

Wieso ist lt. Spec A0-A10 nötig, und in der Applikation nur A0-A3 für
den memory-mapped modus :-?

Wozu bräuchte man denn die restlichen Adressleitungen (Wenn man sie
denn anschließe)?

(Und ist anschließe der Konjunktiv von anschließen ?)
Fragen über Fragen ;-)

von Manfred Schäfer (Gast)


Lesenswert?

@Erik

welcher Art waren deine Probleme mit CF von Sandisk?
Ich möchte ebenfalls ein CF an einen Atmel oder ARM7 anschliessen und
bevorzuge zur Programmierung Assembler. Hast du schonmal überlegt den
Quellcode öffentlich zur Verfügung zu stellen?

Gruß

Manfred

von papa_of_t (Gast)


Lesenswert?

Der Konjunktiv ist meiner Meinung nach: "...wenn man sie anschlösse"
:-)

Das gehört zwar nicht hierher (Entschuldigung!), aber für gutes Deutsch
sollte immer Platz sein..

von MicroMann (Gast)


Lesenswert?

>> Der Konjunktiv ist meiner Meinung nach: "...wenn man sie
anschlösse"

Hab mal nachgeblättert:
'anschlösse ist der Konjunktiv im Präteritum
'anschließe' ist der Konjunktiv im Präsens.
'würde anschließen' ist der Konjunktiv 2 im Futur.

Da ich die Karte noch nicht angeschlossen habe, gilt für mich Präsens
(alt), oder besser Futur im Konjunktiv 2 und somit :
'Wenn man sie denn anschließen würde'.

Aber genug vom klug-geschissenen Offtopic und zurück zum Thema ;-)

von Ralf Hochhausen (Gast)


Lesenswert?

Hallo zusammen!

@MicroMann:
Die oberen Adressleitungen habe ich alle nicht angeschlossen weil alle
Register der CF-Karten mit den Adressleitungen A0 bis A3 angesprochen
werden können. Wenn ich es richtig in Erinnerung habe liegen die ganzen
oberen Adressleitungen auf Masse sodass nur die Adressen 0x00 bis 0x07
der CF-Karte angesprochen werden können. Das ganze nennt sich memory
mapped mode weil die CF-Karte sich aus Sicht des Controllers wie ein
RAM ansprechen lässt und sich in die normale Memory Map des Controllers
einfügt. Der Speicherbereich in dem die Karte zu finden ist wird über
den 138er Baustein bestimmt der das Chip Select erzeugt. Die
Beschaltung der CF-Karte die zu obiger Beschreibung passt ist auf
meiner HP zu finden: www.ralf-hochhausen.de .
Meine Informationen auf denen auch das obige Dokument basiert hatte ich
damals alle von Sandisk. Dort hatte ich eine Beispielapplikation mit
einem 8032 (oder so ähnlich) gefunden die die Ansteuerung so
realisierte.

Viele Grüße,

Ralf

von Erik (Gast)


Lesenswert?

Ich kann leider keine Sourcen freigeben (Arbeitgeber).
Wenn ihr aber euch genau an Ralf's Doku haltet, werdet ihr sicher ans
Ziel kommen. Die von Ralf beschriebene Sandisk Application Note habe
ich auch mal gelesen, allerdings finde ich sie nicht mehr. Sucht mal
bei Sandisk. Sie beschreibt eigentlich das gleiche, in ASM für einen
80xx uC.
In meinem Projekt musste ich einen konstanten Datenstrom von ca.
100kB/s schreiben/lesen. Aufgrund von RAM Engpass habe ich immer einen
Sektor adressiert und diesen dan geschrieben.
Nach dem 512ten Schreibzugriff ins Dataregister braucht die Karte ja
eine Zeit um den Sektor zu versorgen. Diese Busyzeit habe ich mittels
der Busyleitung agefragt. Bei den Sandiskkarten funktionierte dies
nicht richtig, die Busyzeiten streuen enorm, ich habs nicht hingekriegt
die 100 kB/s zu erreichen, obwohl ich 8 kB Puffer im uC hatte.
Sandisk gegen Kingston ausgetauscht und es funktionierte einwandfrei.

von MicroMann (Gast)


Lesenswert?

Ich bin jetzt schon weiter gekommen.

@ Erik & Ralf :
Wie ermittelt ihr die Größe der CF ?
Oder schreibt ihr das Proggi für eine bestimmte vorher festgelegte
Größe ?

von Ralf Hochhausen (Gast)


Lesenswert?

Hi,

die Größe kann müsste man über den Befehl ID lesen können.

Gruß,

Ralf

von MicroMann (Gast)


Lesenswert?

Hallo allerseits,

ich habe die Pinbelegung noch einmal durchgesehen.
Man braucht für die normalen Funktionen im memory mapped modus
tatsächlich nur A0-A3.

A10 braucht man für zusätzliche Zugriffsmodi beim Task-File Register.

A9 braucht man für den attribute memory Modus (in dem man verschiedene
Einstellungen vornehmen kann, ua. Umstellung vom Memory-mapped zum
I/O-mapped Modus)

A4 braucht man dann zusätzlich zu A0-A3 und A9 um einige direkt
adressierten Informationen im CIS auszulesen (165 Byte mit diversen
Karteninfos)

A5-A8 sind nach meinem jetzigen Wissensstand für den memory mapped
modus völlig überflüssig (das gilt aber nicht für den I/O mapped
Modus)

Zusammenfassend kann man sagen, dass für den memory mapped Modus die
Pinbelegung von Ralfs Beispiel völlig ausreichend ist.

von MicroMann (Gast)


Lesenswert?

Ach bevor ichs vergess :

@Ralf :

In der Anleitung ist imho ein kleiner bug :

void vSetLBAAddress(lba_address lbaAddress_)
{
  while(!(CFC_STATUS_REG & CFC_STATUS_BSY)){}
  CFC_SECTOR_NUMBER_REG  = lbaAddress_.byte[0];
  CFC_CYLINDER_LOW_REG   = lbaAddress_.byte[1];
}

Sollte das nicht eher
while(CFC_STATUS_REG & CFC_STATUS_BSY){}

heißen ?
Sonst wartest du doch solange bis die Karte beschäftigt ist ?!?

von Wolfram (Gast)


Lesenswert?

Nicht ganz,
Ich habe Ralfs Dokument mal überflogen, leider habe ich keine Schaltung
darin gefunden. Es gibt bei der CF Karte 2 PINs (Busy und WAIT) wenn ich
mich richtig erinnere.
die angeben ob die Karte gerade ein Kommando verarbeitet.
Bsp. du gibts ihr ein Lese Komando, die Karte braucht auch ihre Zeit
um
ihr Statusregister zu aktualisieren. Deshalb nach dem Lesekomando erst
auf den Pin schauen und dann ins Statusregister. Sonst kann es bei
höheren Geschwindigkeiten Probleme geben. Das Waitsignal "generiert"
selbstständig die nötige Anzahl von Waitstates wenn die CPU ein solches
hat. Wenn nicht musst du aufpassen das die CPU die Karte nicht
überfährt
durch einstellen der entsprechenden Anzahl von Waitstates. Oder sehr
niedrige RAM Busfrequenz. Ich habe 2003 eine solche Lösung mit Z180
und
Compactflashkarten von Sandisk gemacht die waren z.T. sehr langsam.
Nach dem Kommando Lesen/Schreiben war es auf jedenfall sicherer diesen
PIN auszuwerten, ansonsten hatte man Datenverlust, da die Karte noch
nicht soweit war.
Es geht auch schneller als das Statusregister auszuwerten und ist
sicherer.
Das eigentliche Auslesen des Sektors sollte am Stück gehen, ohne das
Waitsignal zu beachten. (bei 4 MHz RamBustakt)
Die oberen Adressleitungen braucht man nur wenn man auf die CIS
zugreift, oder das pseudospeicherfenster benutzen möchte z.B. bei
Zugriff mit DMAController (aufsteigend kopieren)
Was ich bei Ralf vermisse:
Eigentlich kommen die Daten immer 16bittig am Datenregister an, es sei
denn man fordert den 8Bit Modus an (das ist der Unterschied zu
Festplatten diese können diesen Modus unterstützen, CF muss diesen
Modus unterstützen.)
Also entweder 8Bit Modus und Datenregister auslesen oder normaler 16Bit
Modus und even und odd Datenregister auslesen.

von MicroMann (Gast)


Lesenswert?

Stimmt.
Habe ich vergessen.

Hatte ja Erik schon angedeutet, dass es mit hardwaremäßiger
WAIT-Leitung schneller geht, als mit Busy-Bit im Statusregister zu
pollen.

>> Also entweder 8Bit Modus und Datenregister auslesen oder normaler
>> 16Bit Modus und even und odd Datenregister auslesen.

Genau dafür gibts den A10.

Mal ne kleine Frage (Irgendwie habe ich da einen Hänger) :
Wenn ich 8-bittig auslese erhalte ich ein Byte.
Wenn ich 16-bittig auslese, sollte ich eigendlich 2 Bytes erhalten.

Wozu dann die Unterscheidung im Kommando Even und ODD-Byte auslesen :-?
Ich bekomme doch in jedem Fall das ungerade und das darauf folgende
gerade Byte beim 16-Bit Zugriff ?
Irgendwie ist da der Wurm drin.

von Wolfram (Gast)


Lesenswert?

>> Also entweder 8Bit Modus und Datenregister auslesen oder normaler
>> 16Bit Modus und even und odd Datenregister auslesen.

Genau dafür gibts den A10.

Mal ne kleine Frage (Irgendwie habe ich da einen Hänger) :
Wenn ich 8-bittig auslese erhalte ich ein Byte.
Wenn ich 16-bittig auslese, sollte ich eigendlich 2 Bytes erhalten.

Wozu dann die Unterscheidung im Kommando Even und ODD-Byte auslesen
:-?
Ich bekomme doch in jedem Fall das ungerade und das darauf folgende
gerade Byte beim 16-Bit Zugriff ?
Irgendwie ist da der Wurm drin.

Das ist ja dein Problem du hast nur einen 8bit Datenbus
Das Problem fällt dir erst beim Datentransfer auf da alle Register
ausser dem Datenregister 8bittig sind)
also wenn die Karte im 16 Bit Mode ist. und du adressierst lesend das
Datenregister legt die Karte an D0 bis D15 ein 16Bit Wort an.
Du hast aber nur D0 bis D7 angeschlossen. Du bekämst also immer nur den
Lowteil also jedes 2. Byte
Möglichkeiten zur Lösung
1. Möglichkeit 16 Bit Datenbus
Das wird wohl nichts mit dem AVR
2. Möglichkeit 8 Bit Modus der Karte dann kommt jeweils statt 256 (16
Bit Word) ,512 8Bit (Byte) an dem Datenregister(in diesem Fall 8Bit)
an
3. Möglichkeit das 16 Bit Datenregister wird in einen High und Low Teil
zerlegt auf den dann jeweils 8 Bittig zugegriffen wird.== Even und Odd
(Reihenfolge beachten)


Schau nochmal in die Spec ich glaube die Busy Leitung wars die du
pollen solltest.

von MicroMann (Gast)


Lesenswert?

Aha ! Ein Licht ist aufgegangen.
Ich hatte angenommen die EVEN-ODD Kiste sei für 16Bit Zugriff.
Im Nachhinein ist mir schleierhaft wie ich darauf gekommen bin ;-)

Tausend Dank Wolfram.

Hab auch nochmal wegen Busy/Ready und /Wait geschaut:

Busy/Ready signalisiert die Empfangsbereitschaft für einen neuen
Befehl

/wait managed die wait-states , dh. wenn zB. ein Lesezugriff erfolgt,
wird nach Anlegen der Signale an die CF diese Leitung solange auf low
gezogen, bis die Daten verfügbar sind, und vom Controller übernommen
werden können.

Im Prinzip sollte /Wait die Funktion des Busy/Ready mit übernehmen
können. Denn wenn die Daten an der CF-Karte anliegen ist der Zyklus für
die Karte abgeschlossen, und sie sollte bereit für den nächsten Zugriff
sein.

Gruß

von Erik (Gast)


Lesenswert?

"Im Prinzip sollte /Wait die Funktion des Busy/Ready mit übernehmen
können. Denn wenn die Daten an der CF-Karte anliegen ist der Zyklus
für
die Karte abgeschlossen, und sie sollte bereit für den nächsten
Zugriff
sein."

Das gilt wohl für Zugriffe auf das Datenregister, für das
"Kommando-Ready" wäre ich mir da nicht so sicher.
Busy/Ready als Status der Karte sollte dir eigentlich reichen, solange
du nicht mit mehr als 8 Mhz Quarz am AVR auf die CF zugreifst brauchst
du keine "Waitstates Handshakes".
Ich bin mir da nicht absolut sicher aber: Mein Design funktioniert und
ich verwende den Waitpin nicht.

von Ralf Hochhausen (Gast)


Lesenswert?

Hallo MicroMann,

danke für deinen Hinweis. Ich muss mir die Geschichte wohl nochmal
ansehen. Bei mir lief die Software soweit aber vielleicht habe ich was
vergessen. Ist schon eine Zeit her seid dem ich mich das letzte mal
damit beschäftigt habe. Ich denke dass ich meine Ansteuerung dann auch
auf das Hardwaresignal umstellen werde.

Bis denne,

Ralf

von Wolfram (Gast)


Lesenswert?

Wie Erik sagt:
Busy sollte die Leitung sein die du pollst
Wait brauchst du nur wenn du schneller zugreifen könntest als die
CFspec erlaubt.
Bsp:
1.auf den Adressbus legst du die Adresse des Statusregisters und
aktivierst die Leseleitung (das macht der Microcontroller bei
Ramzugriff)
2. Die Karte aktiviert ihre Waitleitung
3. Sie legt den inhalt des Datenregisters auf den Datenbus
4. Die Karte deaktiviert ihre Waitleitung
Da du keinen Mikrocontroller mit Waiteingang hast musst du entweder
langsamer Zugreifen als die Zugriffszeit der Karte beträgt oder du
legst Waitstates ein.
Es ist einfach die Zeit die die Karte braucht um den Inhalt eines
Registers auf den Datenbus zu legen. Ich glaube nicht das du diese bei
4 Mhz auf dem RamBus unterschreitest.

Busy Leitung: (das ist eine Ebene höher)
1.Du gibst das Lesekomando
2. Die Karte aktiviert Busy
3. Die Karte liest den Speicherblock in ihren internen Puffer
4. Die Karte deaktiviert Busy
5. Sie kann mit voller Geschwindigkeit ausgelesen werden

Das ist auch der Grund warum die Karte wenn man mehrere Sektoren
anfordert nach einer bestimmten Anzahl eine Pause macht. Da merkt man
den internen Puffer
Mir fiel es damals nur beim Lesen und Schreiben auf, das man Busy
Abfragen sollte. Alle anderen Kommandos waren schnell genug.

@Ralf schönes Dokument, vielleicht sollte der ganze Thread mit dem Link
auf das Dokument in das Codeforum, da die Frage öfters mal auftaucht.
Probier das ganze doch einmal bei 16Mhz ,dann liegen 8 Mhz auf dem
RamBus.

Ich würde am CFSockel mir noch die Leitungen für die Erkennung ob eine
Karte steckt abgreifen. Das wird später unproblematischer beim
Programmieren.
(wenn eine Karte steckt (und das Dateisystem aktiv ist) kann ich einen
Zugriff machen, das erspart wohl einiges an Timeoutroutinen.)

von MicroMann (Gast)


Lesenswert?

Ja, danke.
Ich werde den Busy-Pin nehmen.
Ist wohl doch die bessere Wahl ;-)

THX @ all

von MicroMann (Gast)


Lesenswert?

Hier nochmal zum Schluss einige brauchbare Links zum Thema :

Wie man eine CF-Karte im memory-mapped Modus an einen MC anschließt:
(Die besagte SanDisk Application note)
http://nexus.tfh-berlin.de/~martin/tfh/EMC/CD2/SanDisk/Sandisk15.pdf

Die offizielle CF-Spec. der CF Association gibts nach Registrierung
kostenlos bei:
http://www.compactflash.org/

Eine recht gute Zusammenfassung dessen ist das Toshiba-datasheet für
CompactFlash-Karten :
http://www.datasheetcatalog.com/datasheets_pdf/T/H/N/C/THNCF256MM.shtml
Dort haben sich relativ viele kleine Fehler eingeschlichen. Ist aber
nicht so schlimm.

Und Last but not least : Nochmal der Link zu Ralfs Dokument. Besonders
als ersten Einstieg wärmstens zu empfehlen :
http://www.mikrocontroller.net/attachment.php/300364/ATMEGA+128+Compact+Flash.pdf


Damit sollte eigendlich jedem das Werkzeug für ein erfolgreiches
Integrieren von CF-Karten in die eigene MC-Umgebung gegeben sein.
Viel Erfolg !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.