Festplatte ansteuern - alles klappt, nur Lesen nicht

OP Persönliche Seite #2559016
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...
Angehängte Dateien:
OP Persönliche Seite #2559811
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
OP Persönliche Seite #2561699
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren