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)
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
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.
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.. :-)
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ß
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 !
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
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.. :-)
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!
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 ;-)
@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
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..
>> 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 ;-)
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
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.
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 ?
Hi, die Größe kann müsste man über den Befehl ID lesen können. Gruß, Ralf
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.
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 ?!?
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.
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.
>> 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.
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ß
"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.
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
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.)
Ja, danke. Ich werde den Busy-Pin nehmen. Ist wohl doch die bessere Wahl ;-) THX @ all
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.