Forum: Mikrocontroller und Digitale Elektronik CompactFlasch-Karte im Memory Mode ansteuern


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist nochmal der Sourcecode mit Pinbelegung der Ports

Alex

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Jörn (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Erik (Gast)


Lesenswert?

@ 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.

von Manuel Hunkeler (Gast)


Lesenswert?

Hallo miteinander!

Wäre auch an  Alexs Programm interessiert!
Please poste das doch mal :-)

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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

von Manuel Hunkeler (Gast)


Lesenswert?

Vielen Dank!
Werde mir das ganze mal genau durchdenken!

von Dennis Struss (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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