Forum: Mikrocontroller und Digitale Elektronik Festplatte ansteuern - alles klappt, nur Lesen nicht


von Jonathan S. (joni-st) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,


ich versuche hier schon seit ein paar Stunden vergeblich, eine alte 
IDE-Festplatte anzusteuern. Ich kann die Platte problemlos in den 
Standby-Modus schicken und auch alle Register auslesen... Wenn ich aber 
versuche, einen Sektor von der Platte zu lesen, wird sofort das 
Error-Flag gesetzt, aber im Error-Register steht nichts, und im 
Datenpuffer der Festplatte steht nur Datenmüll. Das passiert sowohl im 
CHS- als auch im LBA-Modus und auch bei verschiedenen Festplatten. 
Defekt sind die Platten definitiv nicht.

Die Festplatte ist über 4k7-Angstwiderstände folgendermaßen an den µC 
(ATMEGA32) angeschlossen:
PORTA = DD0...7
PORTC = DD8...15
PORTB0...1 = CS0...1
PORTB2...4 = DA0...2
PORTD2 = DIOR
PORTD3 = DIOW


Ich hoffe, jemand kann mir sagen, was ich falsch mache...


Gruß
Jonathan


P.S.: Sorry, dass der Quälcode so unübersichtlich ist.

P.P.S.: Die Bezeichnung und die Parameter der Festplatte kann ich auch 
auslesen. Nur eben einen Sektor nicht...

von Reinhard Kern (Gast)


Lesenswert?

Jonathan Strobl schrieb:
> P.S.: Sorry, dass der Quälcode so unübersichtlich ist.

Vermutung, ohne dass ich mir das antun muss: die Platte arbeitet im 
DMA-Modus, und dein Controller hat keinen DMA.

Gruss Reinhard

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jonathan Strobl schrieb:
> Die Festplatte ist über 4k7-Angstwiderstände folgendermaßen an den µC
> (ATMEGA32) angeschlossen:

Ist das nicht vielleicht ein bisschen sehr hochohmig?

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
> Ist das nicht vielleicht ein bisschen sehr hochohmig?

Nee, die Kommunikation klappt ja. Ich kann die Platte ja problemlos in 
den Standby schicken, Register lesen/schreiben usw.

Das Problem hat sich eben übrigens (wahrscheinlich) geklärt: Im 
Wiki-Artikel "Festplatte" hat sich wahrscheinlich ein Zahlendreher 
eingeschlichen... Konkret wurden wohl das Register "Sector Number" 
(Adresse 110) und das Register "Device Register" (Adresse 011) 
vertauscht... Jedenfalls meldet die Platte keinen Fehler mehr, wenn ich 
sie "unvertauscht" ansteuere. Ob die Daten dann auch richtig sind, muss 
ich noch schauen.


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Angehängte Dateien:

Lesenswert?

Scheint wohl zu funktionieren. Da hat sich wohl tatsächlich ein Fehler 
in den Wiki-Artikel eingeschlichen.


Gruß
Jonathan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Na, dann Glückwunsch!

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Danke! :D

von Jonathan S. (joni-st) Benutzerseite


Angehängte Dateien:

Lesenswert?

So, vielleicht kann es ja jemand mal gebrauchen. Mit dem Programm im 
Anhang kann man (fast) alles Mögliche mit so einer Festplatte anstellen. 
Sektor lesen, Sektor schreiben, Register lesen, Register schreiben... 
Die Pinbelegung ist wie im ersten Post.

Ach ja: Über die serielle Schnittstelle (345600 Baud, 8N1) werden die 
Befehle im Klartext übertragen. Da wären: "Readsector", "Writesector", 
"Getstatus", "Getdata", "Geterror", "Putcommand", "GET", "PUT". Wenn 
nach einer "CS/DA"-Adresse gefragt wird, dann wird so eine Bitfolge 
erwartet: DA2-DA1-DA0-CS1-CS0. Bei "PUT" muss man einen Wert 
hexadezimal, binär oder dezimal eingeben: Hexadezimal z.B. "HE0" (also 
mit "H" am Anfang), binär z.B. "B11010", dezimal z.B. "65".

Viel Spaß damit ;)

Gruß
Jonathan

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.