Forum: Mikrocontroller und Digitale Elektronik Compactflash Karte - Memory mode


von Jörn (Gast)


Lesenswert?

Hi,

Ich versuch eine CF karte im Memory mode mit dieser hardware
http://mcselec.com/an_123.htm  anzusteuern. Hardwaretechnisch dürfte
alles korrekt sein.

Nur leider klappt nichtmal das Lesen und schreiben von registern :-(.

Normalerweise müsste ja das RDY signal auf 1 gehen wenn die karte
ready
ist, nur bei mir ist es dauerhaft 0. (RDY leitung habe ich mit
transistor an eine led gehängt)

So läuft ungefähr mein init ab:

Das reset Signal schalte ich einmal von 0 auf 1 um die karte zu
resetten. CE lege ich auf masse. Dann müsste das RDY Signal doch
eigentlich auf 1 gehen oder mache ich etwas falsch??

Als ich den Controller einmal programmiert habe und noch die CF karte
noch im sockel hatte ging die led plötzlich an und nach dem
programmieren sofort wieder aus. Weiß jedoch nit wieso....

Ich hoffe ihr könnt mir helfen! was mach ich beim init falsch??

danke schonmal im vorraus

MFG Jörn

von Jörn (Gast)


Lesenswert?

Hi,

So, habe es endlich geschafft das lesen von Registern der CF karte
funktioniert endlich.  Für das status register erhalte ich einen wert
von 0x50 und vom Error register lese ich 0x01.  Kann das überhaupt sein
? Müsste das Error register nicht 0 sein weil ja im status register kein
 Error bit gesetzt ist???

Habe auch schon versucht in ein register zu schreiben und den wert dann
wieder auszulesen allerdings war nie mein wert drin, scheint so als
würde das schreiben von registern nicht funktionieren...??

QuellCode "lesen":

  .global CF_read_register
  .func CF_read_register

CF_read_register:

  ldi  r16, 0x00      ;0x00 nach r16
  out  DDRC, r16      ;Datenport auf Eingang stellen

  ldi  r16, 0xff      ;0xff nach r16
  out  PORTC, r16      ;Interne Pullups für PORTA aktivieren

  rcall  CF_check_ready

  out  CF_ADDR, r24    ;Addresse ausgeben
  cbi CF_CONTROL, CE
  cbi  CF_CONTROL, OE      ;RD=0

  nop
  nop
  nop
  nop

  in  r24, PINC  ;Daten nach r24 lesen

  sbi  CF_CONTROL, OE      ;RD=1

  sbi CF_CONTROL, CE

  ret
  .endfunc





Quellcode "schreiben":

.global CF_write_register
  .func CF_write_register

CF_write_register:

  ldi  r16, 0xFF      ;0xFF nach r16
  out  DDRC, r16      ;Datenport auf Ausgang stellen

  out  CF_ADDR, r24      ;Addresse ausgeben

  ldi  r22, 0x24
  out  CF_DATA_PORT_WR, r22  ;Daten von r22 auf Datenport ausgeben

  rcall  CF_check_ready
  cbi CF_CONTROL, OE
  nop
  nop
  cbi  CF_CONTROL, WE      ;WR=0
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  sbi  CF_CONTROL, WE      ;WR=1
  nop
  nop
  sbi CF_CONTROL, OE


  ret
  .endfunc


Sind die routinen so richtig oder habe ich was wichtiges vergessen?

Bin für jede hilfe dankbar!!

MFG Jörn M

von Jörn (Gast)


Lesenswert?

Hi,

hat denn keiner ne idee wo der fehler liegt??

bin langsam echt am verzweifeln....


MFG Jörn

von Andreas Auer (Gast)


Lesenswert?

Hi.

Also mir scheint, dass deine Routinen eigentlich ganz ok sind, bis auf
die Funktion zum Schreiben eines Registers. Was machst du da mit:
"cbi CF_CONTROL, OE"

Wenn mich nicht alles täuscht, sollte dies doch die RD Leitung sein,
oder?? Könnte der Grund für das nicht funktionierende Schreiben eines
Registers sein.

Das Lesen des Statusregisters, scheint richtig funktioniert zu haben.
Der Wert 0x50 ist in Ordnung, denke ich.
Der Wert für das Error Register ist im Prinzip auch ok, da es nur einen
gültigen Wert enthält, wenn im Statusregister auch das Error Bit gesetzt
ist. Es muss also nicht 0 sein.

Zu Testzwecken, würd ich dann mal das Commandregister mit dem Wert 0xEC
füllen. Danach musst 512 Bytes vom Data-Register lesen. Der Befehl 0xEC
heisst "Identify Device" und gibt dir einige kartenspezifische Infos
zurück (Seriennummer, Versionsnummer, usw.). Mehr kannst dem CF
Datasheet entnehmen.

mfg
Andreas

--
Andreas Auer                 aauer1 (at) sbox.tugraz.at
Student of Telematics        http://home.pages.at/aauer1
Graz, University of Technology

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.