Hallo alle zusammen, ich möchte eine Compact-Flash-Karte mit einem PIC16F877 auslesen (Studienarbeit). Hierzu habe ich den Memory Mode gewählt, da man hier schön mit 8 Bit operieren kann. Zum Einstieg versuche ich gerade mit dem Identifycomand kartenspezifische Infos auszulesen. Das klappt aber noch nicht. Wenn ich das Progamm laufen lasse wird das READY-flag der CF-Karte nicht gesetzt, mit Debugger (Step by Step) schon. Im Internet habe ich eine Artikel gefunden, PIC a CompactFlash Card von Mark Samuels. Nach dieser Beschreibung habe ich die CF-Karte angeschlossen und auch versucht den PIC zu programmieren. Vielleicht kennt ja jemand diesen Artikel. Der Anschluss der Karte ist folgendermaßen: - Datensignale D0 bis D7 werden verwendet (am PIC), D8 bis D15 sind offen - Adresssignale A0, A1, A2 werden verwendet (am PIC), A3 bis A10 sind LOW - Steuersingnale (am PIC): Grundeinstellung CE1 = LOW Reset = LOW, wenn Reset nicht aktiv. Stimmt das? WE = HIGH OE = HIGH Ready = HIGH, wenn Karte bereit. Stimmt das? CD1 = LOW, wenn Karte im Sockel (pullup auf Masse) - restlichen PINs der Karte: Vcc und GND ist klar! WP = offen CD2 = offen CE2 = HIGH VS1 = offen IORD = offen IOWR = offen CSEL = GND WAIT = offen INPACK = offen REG = HIGH BVD1 = offen BVD2 = offen Ist dieser Anschluss korrekt? Hat das jemand schon mal so gemacht? Im Assemblerprogramm gehe ich folgendermaßen vor: 1. Initialisierung der PORTS und Grundeinstellungen der Outputsignale (s.o.) 2. Reset (Reset kurz auf High und dann wieder Low) 3. halbe Sekunde warten 4. Adressleitungen A0,A1 und A3 auf high 5. Identifycomand 0xEC an den Datenleitungen D0-D7 anlegen 6. Überprüfen ob Karte READY 7. Schreibimpuls (WE kurz auf Low setzen und dann wieder High) 8. Überprüfen ob Karte READY 9. Datenport auf Input schalten 10. Leseimpuls (OE auf Low) 11. Jetzt sollte 0x8A am Datenport anliegen -> Speichern 12. OE wieder High Gibt es in dieser Vorgehensweise schon einen Fehler (Sourcecode im Anhang)? Des Weiteren bin ich mir in folgenden Punkten nicht ganz sicher: -Wenn die Karte auf das Indentifycomand 0xEC antwortet, ist dann das erste Word immer 848A hex (default-value)? - Muss man eine Mindestfrequenz beim Ansprechen einhalten, oder kann ich mit dem Debugger Schritt für Schritt die Befehle durchgehen? - Wird der Reset über L->H->L durchgeführt? Oder ist es andersrum, weil der Reseteingang der Karte negiert ist? Wenn mir jemand weiterhelfen könnte, wäre ich echt dankbar!! Alex
Hier ist nochmal der Sourcecode mit Pinbelegung der Ports Alex
Hier ist der Schaltplan nachdem ich mich orientiert habe. Ich habe allerdings, wie man im Sourcecode erkennen kann, noch mehr Steursignale und Adressleitungen am PIC aufgeleget. Alex
Hi, Ich bin auch dabei die karte nach diesem Artikel anzusteuen. Allerdings nicht mit einem PIC sondern mit dem ATmega162. Bei mir funzt das mit dem identify command auch noch nit. Hast du mal das status und error register ausgelesen? beim status register erhalte ich den wert 0x50 und beim error register 0x01. Erhältst du die selben werte?? Desweiteren habe ich probiert ein register (cyl_lo_reg) zu beschreiben und den reingeschriebenen wert wieder auszulesen, allerdings ohne erfolg. Scheint als würde das mit dem register beschreiben nicht so ganz funktionieren. Kannst ja mal bei dir ausprobieren, vielleicht ham wa ja das selbe Problem ;-). MFG Jörn
Hi Jörn, status und error Register habe ich noch nicht ausgelesen. Werde es bei nächster Gelegenheit mal probieren. Ich dachte mir, dass das Auslesen der DiscInfos mit 0xEC erstmal das Einfachste wäre, vor allem weil ich dann als Word einen Defaultwert zurückbekommen sollte. Dieser sollte 848A hex sein, wenn ich die CF-Specifiaction richtig verstanden habe. Wie probierst du das aus? Ich hab so einen Emulator, der den PIC simuliert. Am Rechner sehe ich dann die Werte. Weißt du ob es einen Unterschied macht, ob man das Programm Schritt für Schritt durchgeht oder sollte man es rennen lassen, damit die CF überhaupt antwortet? Alex
Hi, Oh das man als erstes wort beim identify command einen default wert zurück bekommen sollte wusste ich gar nicht, bei mir kommt auf jedenfall immer 0x00, ist ja auch eigentlich logisch, wenn nicht mal das schreiben eines simplen register läuft, ich weiß allerdings nicht ob man das überhaupt so testen kann (register beschreiben und wieder auslesen). Status und error register lesen ist ja im prinzip noch einfacher als das identify command weil man dort nur lesen muss und nicht erst ein commando schreiben. Leider habe ich auch überhaupt keine ahnung wie Zeitkritisch die ansteuerung bei einer CF karte ist... Was mir noch kopfzerbrechen bereitet ist das ich beim error register 0x01 zurück bekomme, was laut CF spec. allgemeiner fehler oder so sein soll. Komischerweise ist aber im Status regiser nicht das error bit gesetzt, heißt das ich brauch das error register nicht zu beachten?? MFG Jörn
Hi Jörg, ich glaube ich habe es geschafft mit dem identifycomand Infos auszulesen. Als ersten Wert habe ich 848Ah bekommen. Das sieht schon mal gut aus. Meinen Assemblersourcecode habe ich mal angehängt, vieleicht findest du damit Fehler in der Lese- und Schreiberoutine oder falsche Signalbelegungen. In welcher Sprache programmierst du eigentlich? Gruß Alex
Hi, das ja ne erfreuliche nachricht, woran hat es denn gelegen??. Könntest du trozdem bitte mal direkt nach dem reset einmal status und error register auslesen und mir die werte mitteilen, dann weiß ich wenigstens ob die passen. Also ich programmiere in Assembler, C kann ich auchn bisschen, habe früher auch mal mitn PIC aon bissel rumgespielt, daher kann ich auchn bissel PIC assembler. MFG Jörn M
Hi Jörg, Also ich hab mal das ERROR und STATUS Register nach einem Reset ausgelesen: ERROR: 01h STATUS: 50h Woran es gelegen hat? Bei meinem PIC gibt es am Ausgangsport A einen Pin, der einen open drain hat. D.h. dieser schaltet nicht automatisch auf high sondern braucht noch einen pullup Widerstand. Außerdem darf ich über diesen Port nicht mit 20 MHz drüber, dann schafft er es nicht. Wenn ich aber nur Port C,D,E benutze, wie im Artikel beschrieben, dann funzt es auch ohne Probleme bei 20 MHz Ozi-Takt. MFG, Alex
Hi, das würde also bedeuten, das das register auslesen bereits funktioniert, habe ja die selben werte wie du. habe dein programm mal auf avr umgeschrieben, ich erhalte aber bei identify nur 0xff. Könntest du mal das sector low register mit einem beliebigen wert beschreiben und gucken ob du beim wieder auslesen den wert zurück erhälst?? Bei mir funzt das nämlich nicht. Habe heute nochmal meine ganze hardware durchgemessen, alles fehlerfrei. Liegt dann entweder am AVR oder am programm. Mein prog ist im anhang. Was für eine CF karte verwendest du?? ich habe eine von Medion son billig teil müsste aber eigentlich trozdem gehen oder?? Wie lässt du dir die gelesenen werte anzeigen?? MFG Jörn
Hab noch ne frage: interessiert sich deine Karte eigentlich dafür was du mit der Reset leitung machst?? ich kann die bei mir auf 1 auf 0 oder sogar gar nit anschließen, das status register kannn ich immer auslesen. ISt das bei dir auch so?? MFG Jörn
Beim Auslesen der Drive-Infos ist meine Karte vom Reset auch völlig unbeeindruckt. Ich habe hier mehrere Karten rumfliegen. Ich experimentiere mit einer Sandisk von Nikon 16MB. Ein Billigteil sollte auch funktionieren. Wenn vorhanden kannst du diese ja im Kartenleser oder Digitalkamera testen. Ich habe mal über dein Programm drüber geschaut. Sieht soweit ganz gut aus, habe allerdings etwas Probleme jeden Befehl zu verstehen, da ich ja auf einem PIC programmiere. Vielleicht könntest du zumindest die relevanten Schrittblöcke argumentieren. Setzt du eingentlich das CE1-Signal auf 0? Meintest du das Cylinder low Register (Adresse 100)? Ich habe dort mal ein Byte reingeschrieben und diesen Wert bei jedem OE Impuls wieder rausbekommen. Bei den Adressen 010 und 011 geht dies auch! War das so in deinem Sinne oder hab ich da was falschverstanden? Alex
Hi, Ja die karte funktioniert im kartenleser einwandfrei. Die CE leitung habe ich direkt auf masse gelegt. ja genau so meinte ich das mit dem register beschreiben und wieder auslesen. Zeigt also das bei mir das schreiben einfach nit geht und deshalb auch das identify command nit funzt. Hmm, das jetzt schon mein drittes oder viertes programm was ich geschrieben habe, und immer das selbe ergebnis. Langsam glaub ich das doch was mit meiem CF adapter nit stimmt. Mit welcher spannung betreibst du die CF karte? ich verwende 3,3 V Jörn
Hi, ich verwende 5 V. So ist es auch im Schaltplan vom Artikel! Es ist aber trotzdem komisch, dass du lesen kannst aber nicht schreiben, da der einzige unterschied darin liegt, den Datenport auf Output umzustellen, Befehl oder Daten anlengen, und mit WE mal kurz auf low zu gehen. Vielleicht erkennt die Karte beim Schreiben die Daten nicht, da diese nur mit 3,3 Volt anliegen. Versuchs spaßeshalber mal mit 5 V, vorausgesetzt du kannst es so einfach umstellen wegen dem µC. Halt mich auf dem laufendnen! Gruß Alex
Hi, habe das ganze mal mit 5V probiert, wieder das selbe wie mit 3V. Habe sogar alles durchgemessen, die Signale kommen bis zur CF karte. Was mir allerdings aufgefallen ist das troz 5V betrieb der Signalpegel der RDY leitung bei nur 3,3 V liegt. Bin immoment ratlos und hab keine ahnung wie ich nun weiter vorgehen soll??? Wie funktioiert das mit so einem Debugger??? kannst du dann am PIC mit hardware dran testen und am PC anzeigen lassen?? Weißt du ob es sowas auch für den AVR giebt? MFG Jörn
Ja, ich habe so ein "Teil", welches an den pins einen kompleten PIC simuliert! Den Wert der Register und der Ports kann man sich am PC anzeigen lassen und alles Schritt für Schritt durchgehen. Ich habe mir das Gerät von der Fachhochschule ausgeliehen, um meine Studienarbeit zu machen. Obs sowas auch für deinen AVR gibt weiß ich nicht. Schau doch einfach mal auf der Homepage des Herstellers. Ist aber bestimmt nicht billig. Ich weiß allerdings auch nicht, woran das bei dir noch liegen könnte?? An meinem ReadyPIN liegen 4,9 V an !!!! Gruß Alex
Hi, Juhuuuuuuuuuuuuuuu!!!! Endlich funktioniert es ich hab das default word mit dem identify command erfolgreich ausgelesen!!!! Woran es lag??? War ein Hardware fehler, den ich beim durchmessen nicht gefunden hab, habe vor lauter frust einfach den CF sockel von meiner Platine gerissen, die Abgewinkelten beinchen abgekniffen und kabel drangelötet funzt jet einwandfrei ;-) Endlich kann mein mp3 player projekt weiter gehen **freu** Jörn
Hey das freut mich ja, ich habe inzwischen sogar gezielt sectoren gelesen und auf die cf-karte geschrieben. Als nächstes will ich ein Fat Dateisystem verwalten bzw mich mit seriellem senden und empfangen mit rs232 auseinandersetzen. Gruß Alex
@ Alex Salü! Tönt ja sehr interessant! Progst du in Assembler?! Wenn ja, könntest Du mal Dein Code hier Posten?! Bitte, ich bin sehr interessiert wie so ned CF genau funzt.... Habe mal in die Offiziellen spec. geschaut, 150 Seiten Datenblatt, hat mich schier erschlagen, mich interessiert nur wie man ne cf genau ansteuert inkl. Adressierung, ohne fat.
Hallo miteinander! Wäre auch an Alexs Programm interessiert! Please poste das doch mal :-)
Hallo Erik und Manuel, für die weiteren Funktionen schreibe ich mein Programme in C. Aber um die erste Kommunikation mit der Karte auszuprobieren, habe ich ein Programm in Assembler geschrieben, das die Cardinfos über das Identify-comand ausließt. (Ist im Anhang) Was die Adressierung der Sektoren angeht, so habe ich auch noch eine Word-Datei angehängt. In dieser ist es unter "Lesen eines Sektors der CF-Karte" sehr genau beschrieben wie dies funktioniert. Gruß Alex
Vielen Dank! Werde mir das ganze mal genau durchdenken!
HI Alex, dieser Bericht hier liest sich wie eine spannende Geschichte. Ich habe auch Interesse an deinem Programm. So wie es mir scheint versuchst du als nächstes ein Fat Dateisystem zu implementieren. Mein Ziehl wäre es mal, eine über einen CF-Card-Reader(zb usw) vom Pc mit mp3dateien bespielte cf-karte mit einem Mikrocontroller aus zu lesen. Ich bin hierbei noch in den startlöcher, nutze aber auch den Pic16F877. So könnte ich dir momentan keine unterstützung bieten, wäre aber am weiteren verlauf deiner ergebnisse interessiert. bei erfolg gibts natürlich auch rückmeldung von mir. letztendlicher ziehl wäre es, die daten an einen hardware-mp3 decoderchip weiter zu leiten und sie damit hörbar zu machen - ein mini-mp3 player zum in die tasche stecken, sozusagen. das scheint ja auch jörg zu tangieren, der hier schon fleißig mitgepostet hat. mfg dennis
Hallo Dennis, wo stehst du gerade? Hast du schon eine Versuchsplatine für die CF-Karte, oder eine komplette Schaltung so wie du dir das vorstellst? Wo hängst momentan? Halt mich mal aufm Laufenden!! Gruß Alex
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.