Hallo Leute! Ich arbeite mich grad in den Betrieb einer CF-Karte ein, bin aber schon am Anfang auf ein Problem gestoßen. Ich hab das Identify-Drive Kommando ausgeführt, aber die CF-Karte gibt mir für alle 512 Byte den Wert 253 zurück. Da kann was nicht stimmen. Im Anhang ist ein Bild von der Beschaltung der Karte. Die Schaltung läuft mit einem AT90S8515 auf dem STK200. Meine Frage ist jetzt, ob mein Vorgehen Richtig ist: Die CF-Karte wird mit CE1 auf low aktiviert. Ich lege Portb.0, Portb.1 und Portb.2 (A0-A2) auf high, um das Commandregister anzusprechen. PortC, der Datenport wird auf Ausgang geschaltet und der Wert 0xEC angelegt. Dann lege ich WE auf 0 und kurz darauf wieder auf 1. Damit müßte der Befehl ins Commandregister geschrieben sein. Dann lege ich Portb.0, Portb.1 und Portb.2 (A0-A2) auf low, um das Datenregister zu adressieren. Ich schalte den Datenport auf Eingang. Ich lege das Signal OE auf low und lese die Daten an PortC. Danach lege ich OE wieder auf high. Das Ganze mach ich insgesamt 512 mal. Zum Schluß wird CE1 wieder auf high gelegt um die CF-Karte zu deaktivieren. Sieht hier irgendjemand einen Fehler, oder ist das Prinzip soweit richtig? MfG Daniel
Ich denke, daß Du die falschen Signalleitungen fürs Lesen und Schreiben verwendest. Statt /WE und /OE solltest Du /IORD und /IOWR verwenden.
Hmm... Da ich aber im PC Card Memorymodus arbeite (hoffe ich zumindest) muß ich diese Leitungen benutzen. Ich habe als Vorgabe diesen Artikel (siehe Anhang) benutzt. Gruß
Wenn Du im PC-Card-Memory-Modus arbeitest, was schickst Du dann ein "identify drive" an das Teil? Das ist doch ein IDE-Kommando und ist zusammen mit dem TrueIDE-Interface zu verwenden. Sieh' Dir mal die CF-Spezifikation auf www.compactflash.org an, vielleicht hilft's ja.
Ja, die Spezifikation hab ich schon. Bei knapp 150 Seiten, komm ich ein bischen durcheinander. Wird noch etwas dauern, bis ich da firm bin. Ich bin ja auch nicht sicher welcher Modus das ist. In der Spezifikation steht, daß im true-ide mode WE nicht verwendet wird. in dem Artikel wurde das Signal aber verwendet, also kann es sich nicht um den IDE-Modus halten. Allerdings ist im Artikel auch von dem Identify-Drive-Kommando die Rede. Ich bin jetzt etwas verwirrt... Gruß
Als das Kommando CF_Identify (0ECh) funktioniert bei mir im PC-Card-Memory-Mode. Die Karten sind von Canon???, Extrem und Toshiba. Quellcode, kann ich nur in 8051-Assembler liefern, und den Schaltplan habe ich gerade nicht zur Hand.
Pin 9 und 36 für RD und WR ist in Ordnung. Ein Teil meines Schaltplans im Anhang.
Unsere Anschlußpläne sind sehr ähnlich. Ich hab auch schon nen kleinen Code geschrieben (den kann ich später auch nochmal posten, falls es nötig ist). Ich hab nochmal genau nachgeguckt und festgestellt, daß ich im PC-Card-Memorymodus arbeite. Im Artikel steht zwar "Common Memory mode" , aber ich glaube, damit ist dasselbe gemeint. Ich hab mir das Timingdiagramm für diesen Modus in der Spezifikation angeschaut. Abgesehen davon, daß ich das Signal "Wait" nicht benutze, sieht eigentlich alles vernünftig aus. Ich würde nur gerne wissen, ob der Ablauf, so wie ich ihn oben beschrieben hab richtig ist, oder ob ich einen logischen Fehler gemacht hab. Ansonsten muß irgendwo anders was faul sein. Ich bin für jede Hilfe dankbar. Grüße Daniel
Ich sehe da jetzt auf Anhieb keinen Fehler. Ich kann dir noch folgende Seite empfehlen http://www.ralf-hochhausen.de/Elektronik/MP3-Player/Conpact_Flash_Interface/conpact_flash_interface.html In dem Zip steht auch der Signalverlauf.
Danke für den Tip! Die Seite ist recht interessant. Ich muß mir den Inhalt erstmal in Ruhe zu Gemüte führen. Ich hoffe, ich kann das Problem dann beseitigen. Ansonsten poste ich noch ne Frage. Gruß Daniel
So langsam bin ich echt am verzweifeln... Laut der Website die fury mir empfohlen hat, hab ich alles soweit richtig gemacht. Zum Identify-Drive_Kommando stand da allerdings nicht. Mein Bustiming ist meines Erachtens auch in Ordnung. Aber in der Praxis will es immer noch nicht funktionieren. Ich glaube langsam die CF-Karte will mich ärgern. Ich hab nochmal alle Leitungen und die Hardware 2 mal auf Fehler geprüft. Ich poste jetzt nochmal den Sourcecode in den Anhang, vielleicht kann mir doch noch irgendjemand helfen. Ich wäre sehr dankbar dafür. Gruß Daniel
Nur mal zur Kontrolle, ob ich nicht total verplant bin. Dies (siehe Anhang) ist doch die Pinbelegung der CF-Karte, wenn ich frontal auf ihre Steckleiste sehe; oder irre ich mich?
Hallo, ohne jetzt groß durch Deinen Code gegangen zu sein, hatte ich am Anfang auch etwas Probleme mit dem Reset der Karte. D.h. meine CF-Karte hat etwa 400ms gebraucht bis sie sich selbst initialisiert hatte. Deshalb lese ich zu Beginn immer das Statusregister und warte so lange, bis die Karte sich initialisiert hat. Vielleicht solltest Du auch zunächst überprüfen, ob das Lesen der verschiedenen Register der Karte funktioniert. Dann gibt es wohl auch große unterschiede bei den maximalen Geschwindigkeiten der Karten von verschiedenen Herstellern, sodass das Timing evtl. angepasst werden muss. Ich habe mit meinen Toshiba-Karten aber nie Probleme gehabt. Wie Du die Karte in Deiner Abbildung halten musst, kannst Du an den Führungsschienen an der Seite der Karte sehen. Die sind unterschiedlich breit. Ich habe im Moment aber keine Karte zur Hand, sodass ich nur den Hinweis geben kann. Ich denke mal, dass es an der fehlenden Abfrage des Statusregisters liegt und die Karte noch nicht fertig ist, wenn Du anfängst das Identify-Drive Kommando auszuführen (ich habe diese Abfrage zumindest nicht gesehen). Ich hoffe es hilft etwas.... Viele Grüße, Ralf
Vielen Dank für die Infos. Ich hab mich auch an den Schlitzen orientiert, wollte nur noch mal sicher gehn. Ich versuch das mal mit der Abfrage des Statusregisters. Hoffentlich laüft es dann. Gruß Daniel
Ich hab das mal probiert. Es funktioniert nicht. Das lesen und schreiben der Register ist fehlerhaft. Ich kriege beim auslesen 00000111 zurück. Das kann schonmal nicht sein, da das vorletzte Bit laut Spezifikation immer 0 ist. Ralf, wie hast du die Register geschrieben/gelesen? Gruß Daniel
Hallo, ich habe bei mir die CF-Karte direkt an den externen Speicherbus angeschlossen und greife auf die Register der Karte wie auch ganz normales RAM zu. Beim 8515 gab es wohl mal ein paar Probleme beim Anschluss an den externen Bus, da dieser Controller teilweise sehr kurze ALE-Pulse erzeugt. Aber den externen bus verwendest Du ja nicht. Hast Du das Timin schonmal überprüft oder die Software evtl. mal simuliert? Vielleicht findest Du dabei ja den Fehler. Ich habe dir nochmal meinen Code angehängt. Meine Schaltung hast Du ja wahrscheinlich schon aus obigem Link.... Ralf
Danke! Ich werd das nochmal in Ruhe durchgehen und dann schau ich mal. Deine Seite hab ich schon gelesen; sehr interessant. Ich glaube aber, ich hab nen kleinen Fehler auf deiner Seite entdeckt. Muß nicht im Sectorcount-Register die Anzahl der Sektoren stehen, die gelesen werden, und im Sektornumber-Register der Startsektor? In deiner Beschreibung stands genau andersherum. http://www.ralf-hochhausen.de/Elektronik/MP3-Player/Conpact_Flash_Interface/Software/software.html#SektorLesen (auf dieser Seite relativ weit unten) Ansonsten nochmal vielen Dank. Gruß Daniel
Hallo Daniel, danke für den Tip! Du hast recht, das Sector Number Register ist Teil der LBA-Adresse und in das Sector-Count Regsiter kommt die Anzahl der zu lesenden Sektoren rein. Im Code sollte es aber alles passen. Viele Grüße, Ralf
Hmm, ich steige durch deinen Sourcecode noch nicht wirklich durch. AVRs programmier ich nicht in C. Ich hab nochmal alles gecheckt, aber es funktioniert immer noch nicht. Die Verkabelung ist in Ordnung, die CF-Karte ist auch intakt. Hardwaremäßig hab ich da keine Fehler gefunden. Der Fehler muß denke ich im Softwareteil liegen. Es ist doch richtig, wenn ich z.B. das Statusregister auslesen will, daß ich zunächst CE1 auf 0 lege, dann an A0-A2 1 anlege, OE auf 0, Daten lesen, OE auf 1, CE1 auf 1 setzen...? Mit dem Timing kann ich eigentlich nix falsch gemacht haben, da ich großzügige Pausen eingebaut habe. Diese Karte macht mich noch fertig... Gruß
Hi Daniel, mir gerade noch das folgende aufgefallen: Du hast den Reset-Pin auf Port A0 gelegt. In deinem Programm setzt du diesen Pin zunächst auf High und erzeugst dann einen Low-Impulse um die Karte zu resetten. Bei mir liegt dieser Pin dauerhaft auf Low. In meinem Toshiba Datenblatt steht das folgende: When the reset signal is high this resets the CF-Card... Das wäre also genau das entgegengesetzte von dem was Du machst. Dann habe ich noch gefunden, dass nach dem Einschalten dieses Signal für etwa 1ms hochohmig oder High sein sollte (was bei mir nicht zutrifft aber es geht bisher ohne Probleme, die Schaltung war von SANDISK). Bei Fury liegt das Signal nach einer gewissen Zeit auch auf Masse (über die RC-Kombination). Vielleicht liegt also das Problem darin, dass deine Karte sich die ganze Zeit im Reset befindet. Versuch hier doch mal was anderes. Viele Grüße, Ralf
Hallo, ich nochmal ... vielleicht ist die folgende Seite auch was für dich: http://www.mcselec.com/an_123.htm hier wird der reset-pin auch auf low gezogen... Grüße, Ralf
Hallo Ralf! Im Artikel, nach dem ich die Schaltung gebaut habe, ist Reset als lowaktiv gekennzeichnet. Aber ich werde das nochmal prüfen und auch noch mal mit einem High-Puls probieren. Die Seite, die du mir empfohlen hast, werde ich mir auch noch mal zu Gemüte führen. Vielen Dank für deine Hilfe und Bemühungen. Gruß Daniel
Hi Daniel! Reset ist definitiv high-aktiv! Ich denke mal da liegt der Fehler.
Hallo! Ich hab nochmal in der Spezifikation nachgeschaut; ihr habt recht, Reset ist high-aktiv, außer für den True-IDE-Mode, aber der interessiert hier ja nicht. Ich hab mein Programm nochmal geändert, aber es funktioniert immer noch nicht (verzweifel), bei der Abfrage des Statusregister bekomme ich immer der Wert 00000111 zurückgeliefert, was ja nicht sein kann, da das vorletzte Bit laut Spezifikation immer 0 ist. Da ist echt der Wurm drin, so schwer kann das doch nicht sein. Ich werde mir jetzt nochmal den Artikel durlesen, den Ralf mir empfohlen hat, mal schauen, ob was dabei rauskommt. Vielen Dank erstmal. Gruß Daniel
Hallo, ich hab nochmal den Artikel und den zugehörigen Code in Bascom durchgearbeitet. Ich verfahre eigentlich genauso, ich verwende auch dieselben Leitungen der CF-Karte. Es will allerdings immer noch nicht fuktionieren. Könnte es vielleicht daran liegen, daß ich zu LANGSAM bin? Die Verzögerungen nach jeder Aktion sind mit einer Mikrosekunde ja sehr großzügig bemessen. Ich hab nochmal meinen aktuellen Sourcecode in den Anhang gepackt. Über die Abfrage des RDY-Bits kommt die Software nicht hinaus. Vielleicht entdeckt ja doch jemand den Fehler. Gruß Daniel
Noch ne Sache... Müssen die Leitungen IOread und IOwrite auf high gelegt werden? In einigen Schaltungen wurde das so gemacht, in dem Artikel, nach dem ich mich orientiert hab, wurde es nicht gemacht. Gruß
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.