Forum: Mikrocontroller und Digitale Elektronik Indentify Drive bei CF-Karte


von Daniel Lancelle (Gast)


Angehängte Dateien:

Lesenswert?

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

von Rufus T. Firefly (Gast)


Lesenswert?

Ich denke, daß Du die falschen Signalleitungen fürs Lesen und Schreiben
verwendest. Statt /WE und /OE solltest Du /IORD und /IOWR verwenden.

von Daniel Lancelle (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Daniel Lancelle (Gast)


Lesenswert?

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ß

von fury (Gast)


Lesenswert?

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.

von fury (Gast)


Angehängte Dateien:

Lesenswert?

Pin 9 und 36 für RD und WR ist in Ordnung.

Ein Teil meines Schaltplans im Anhang.

von Daniel Lancelle (Gast)


Lesenswert?

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

von fury (Gast)


Lesenswert?

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.

von Daniel Lancelle (Gast)


Lesenswert?

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

von Daniel Lancelle (Gast)


Angehängte Dateien:

Lesenswert?

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

von Daniel Lancelle (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

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

von Daniel Lancelle (Gast)


Lesenswert?

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

von Daniel Lancelle (Gast)


Lesenswert?

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

von Ralf (Gast)


Angehängte Dateien:

Lesenswert?

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

von Daniel Lancelle (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Daniel Lancelle (Gast)


Lesenswert?

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ß

von Ralf (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Daniel Lancelle (Gast)


Lesenswert?

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

von Erik (Gast)


Lesenswert?

Hi Daniel!

Reset ist definitiv high-aktiv! Ich denke mal da liegt der Fehler.

von Daniel Lancelle (Gast)


Lesenswert?

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

von Daniel Lancelle (Gast)


Angehängte Dateien:

Lesenswert?

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

von Daniel Lancelle (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.