Mikrosha. Kapitel eins. SD-Karten-Controller



Viele Menschen erinnern sich an diesen wunderbaren PC. Ich habe das mit 11 bekommen. Es hat 28 Jahre gedauert und jetzt habe ich beschlossen, Erweiterungsgeräte, die mir damals wirklich fehlten, als Hobby herzustellen.

Idee


Im Netzwerk sah ich verschiedene Optionen für SD-Downloader für solche PCs. Ich mochte das Vorhandensein von Mikrocontrollern in ihnen nicht. Ich wollte eine "Vintage, Warm DIP" -Schaltung verwenden, weshalb ich mich entschied, "KR1533" für die Haushaltslogik zu verwenden.

Als Ergänzung. RAM Ich habe UT62256 angewendet. Dies ist der einzige importierte Chip im Projekt. Natürlich war es möglich, KP537RU10 oder KP537RU25A zu installieren, aber erstens mussten nicht nur ein, sondern zwei installiert werden (ich plante 4 KB zusätzlichen RAM), und zweitens hatte ich UT62256, aber ich hatte keinen KR537 und ich musste nicht bestellen Ich wollte. Daher erlaubte ich mir die Freiheit zu importieren, und dann kam die Idee auf, alle 32 KB zusätzlichen RAM mit Seitenwechsel zu nutzen.


Für das ROM habe ich KR573RF5 gewählt, es gab nur zwei saubere.

Flussdiagramm


Nachdem ich bei einer Tasse Tee gesessen hatte, zeichnete ich ein solches Blockdiagramm.



Hier ist der RAM-Chip, der ROM-Chip und der PORT-Block. Der PORT-Block verfügt über eine parallele Schnittstelle mit 8 Eingängen und 8 Ausgängen. Beim Schreiben in die EFFF-Adresse wird der geschriebene Code an den Ausgängen eingestellt, und beim Lesen von derselben Adresse entspricht der Lesewert dem Status der Eingänge. Drei der Ausgänge und einer der Eingänge sind über einen Pegelwandler mit der SD-Karte verbunden.

Der RAM wird durch den UT62256-Chip dargestellt und verfügt über 32 KB Speicher. Da der Bereich der E000-EFFE-Adressen fast 4 kB (4095 Byte) beträgt, erhalten wir 8 Seiten, die vom PORT-Block ausgewählt werden, Bits 1, 2 und 3. Das heißt, das Schreiben in die EFFF-Adresse setzt die Seite gemäß diesen drei Bits. Das Lesen von diesem Port zeigt auch, welche Seite gerade ausgewählt ist (in denselben Bits). Insgesamt haben wir 32760 Bytes zusätzlichen RAM (4095x8str).

Der ROM-Chip ist KR573RF5. Es ist mit dem Adressraum F000-F7FF verbunden und enthält den BSVV-Code (BIOS). Die Aufgabe dieses Codes besteht darin, die SD-Karte zu initialisieren, das Betriebssystem von ihr zu laden und die Steuerung darauf zu übertragen.

Dementsprechend geben wir nach dem Einschalten des PCs den GF000-Systemmonitor ein und drücken VK.

In Zukunft besteht die Idee, das native ROM des Systemmonitors so zu ändern, dass das Betriebssystem automatisch von der SD-Karte gestartet wird. Der PC wechselt dann zur Standard-Monitor-Eingabeaufforderung, wenn der Download fehlgeschlagen ist oder beispielsweise durch Drücken einer Taste unterbrochen wurde.
Ich werde noch einmal darüber nachdenken.

Planen


Ungefähr 2-3 Stunden am Computer, und ich habe das folgende Diagramm in EAGLE gezeichnet.


Zoom habe

ich basierend auf den Mikroschaltungen gezeichnet, die ich hatte. Es ist möglich, dass die Anzahl der Logikchips reduziert werden kann, wenn andere Gatter verwendet werden, aber ich hatte nur eines. Und in Zukunft werde ich höchstwahrscheinlich die Schaltung optimieren.

Low Level Circuit Parsing ...

... unter dem Spoiler entfernt, ich denke, nur wenige Menschen interessieren sich für diesen Dschungel.
V3/1, A14 A15 , N3 , .1. V1/2 G, IC2. A B, A12 A13 . , , A14 A15, A12 A13. — 1110,
A15-1; A14-1; A13-1; A12-0. N2. , 5 11, - , , . 1 5, 2 11. , 1C , 2C , .1 5, .0 — 11.

: Exxx =1, «PORT», Exxx C=0, «RAM».

«C» , (A0-A11). xFFF, =1, =0. : «PORT» EFFF, «RAM» E000-EFFE.

«RAM» CS IC3, , , E000-EFFE . E000-EFFE . EFFF IC4, . «PORT» «WR» c V1/5, V1/6 V3/4.

EFFF IC5,
B0-B7.

. « » CS3 CS .

Layout-Montage


Jetzt habe ich keine Gelegenheit mehr, die Platine zu Hause zu vergiften, und habe mit einem Stück folienbeschichteter doppelseitiger Leiterplatte das erforderliche Rechteck herausgesägt.

Dieses Rechteck wurde fest in den Steckplatz für die interne Schnittstelle des PCs eingesetzt, hing nicht heraus und bewegte sich nicht. Als nächstes kratzte ich die Pads hinten und vorne. Es ist ziemlich gut geworden. Dann die grobe Anordnung der Mikrokreise und die Aufklärung der Löcher. Auf der Vorderseite habe ich es mit einem großen Bohrer gebohrt, damit die Anschlüsse der Mikrokreise nicht mit der Frontfolie in Kontakt kommen. Auf der Rückseite habe ich den Umfang jeder Kontaktreihe zerkratzt und in Kontaktflächen unterteilt.

Im nächsten Schritt steckte ich alle Mikroschaltungen (und die Steckdose) ein und verschwand von hinten. Die Installation, die ich mit einem dünnen MGTF durchgeführt habe, hat viel Zeit in Anspruch genommen. Er führte die Verkabelung auf beiden Seiten, von vorne löte er direkt an die Beine der Mikrokreise, von hinten zu den Stellen.



Als der Lötvorgang beendet war, beschloss ich, auf den Signalpegelwandler zu achten. Tatsache ist, dass die SD-Karte mit einer Spannung von 3,3 V arbeitet und die Chips KR1533AP6 und KR1533IR22 TTL 5V. Deshalb musste ich einen kleinen Adapterschal herstellen, bei dem die Pegel auf Zenerdioden beschränkt waren.

Das Signal, das von der SD-Karte zum Controller kommt, habe ich gerade an die Quelle 3.3v gezogen. 10k Widerstand. Wie die Praxis gezeigt hat, muss dieses Signal nicht konvertiert werden.



Obwohl ich in der endgültigen Version wahrscheinlich einen Wechselrichter machen werde, der auf einem Komparator basiert.

Ich habe einen microSD-zu-SD-Adapter als Kartenhalter verwendet.

Im Allgemeinen gab es keine besonderen Probleme beim Zusammenbau des Layouts, obwohl ich befürchtete, dass einige der Mikroschaltungen fehlerhaft funktionieren könnten.

Layout-Tests


Zuerst überprüfte ich die RAM-Operation, schrieb mit der Systemmonitor-Direktive „F“ Muster „AA“, „55“, „F0“ und „0F“ in den E000-EFFE-Bereich und überprüfte sie mit der Direktive „D“. Alles stellte sich als normal heraus.

Dann begann ich mit der Anweisung „M“, verschiedene Werte in die EFFF-Adresse zu schreiben und die Änderungen an den Beinen des Registers 153322 mit einem Multimeter zu beobachten. Die Zustände entsprachen den aufgezeichneten Codes. Beim Lesen von diesem Port enthielt der Code die ausgewählte Seite gemäß dem Plan, und selbst wenn das MISO-Signal im Low-Bit gegen Masse geschlossen war, stellte sich heraus, dass es 0 war und beim Öffnen 1.

Es war sogar irgendwie verdächtig, dass alle Mikrokreise funktionierten und die Installation erfolgreich war keine Fehler.

BSVV


Natürlich hatte ich keine speziellen Tools zum Schreiben von Programmen für "580" 80 ". Ich musste ein Programm in ein Notizbuch (Notepad) schreiben und es dann manuell in Codes übersetzen.
Erstellte eine Datei im Editor unter DOS „HIEW“ und begann, sie mit Codes zu füllen. Für die Grundlagen habe ich mein Projekt unter AVR aufgenommen, bei dem die SD-Karte standardmäßig initialisiert wurde. Das Projekt war alt und verwendete kein Dateisystem, nur einen Logger.

Zuerst schrieb ich eine Low-Level-Funktion der SPI-Programmierschnittstelle und dann eine High-Level-SD-Karteninitialisierungsroutine.

Es stellte sich heraus, dass so etwas wie dieser Algorithmus ...

... was unter den Spoiler gestellt wird, denke ich, ist es schon allen bekannt.
1. () 90;
2. CS .1 10 FF;
3. CS .0;
4. CMD0;
5. 01, 7;
6. . =0, , 2;
7. CMD8;
8. ACMD41;
9. 00, 11
10. . =0, , 8;
11. CMD58.
12. 2 EFFE.
13. .

Das OCR-Kartenregister wurde auch in der Initialisierungsroutine gelesen, und das zweite Byte darin wurde in die EFFE-Adresse geschrieben. Dies war notwendig, um den Kartentyp zu bestimmen.

Im Fall von SDSC - 80h und im Fall von SDHC - C0h.

Wenn die Initialisierung nicht bestanden wurde, wurde die Meldung „SD CARD ERROR“ angezeigt und der Monitor ging ohne Zurücksetzen aus.

Ich konvertierte dieses BSVV in WAV und lud es über den Bandeingang auf den PC herunter, debuggte es dann, korrigierte den Quellcode und lud es erneut herunter.

Brücken


Jetzt habe ich zusätzlichen RAM, 32.760 Bytes groß, aufgeteilt in 8 Seiten. Aber wie navigiere ich zwischen den Seiten? Wie kann ein Programm, das auf der ersten Seite ausgeführt wird, eine Routine auf der vierten Seite aufrufen?

Um dieses Problem zu lösen, habe ich Software-Bridges bereitgestellt. Eine Brücke ist ein kleiner Bereich im ROM, der die Steuerübertragung vermittelt.

Zum Beispiel muss das Ausführen von Code die Kontrolle auf Seite 3 übertragen, um E4B5 zu adressieren. Dann setzt der Ausführungscode die unteren 12 Bits (4B5) in das Registerpaar des Prozessors HL und setzt in die oberen vier Bits den Wert 3 - die Seitenzahl. In das Registerpaar HL wird nun der Wert 34B5 geschrieben. Und der Code springt (JMP) in den ROM-Bereich, der als JMP-Bridge bezeichnet wird. Er wird nur an eine feste Adresse im ROM gesendet. Der Code in diesem Bereich extrahiert die Seitenzahl aus den hohen Bits des HL-Registerpaars und schreibt sie an der EFFF-Adresse in das Register des PORT-Blocks. Die dritte Seite des RAM wird jetzt im Bereich E000-EFFE angezeigt. Das JMP-Bridge-Programm setzt die vier hohen Bits des HL-Registerpaars zurück und schreibt dort "E". Jetzt gibt es im HL-Registerpaar bereits eine physikalische Adresse E4B5, und hier überträgt das JMP-Bridge-Programm die Steuerung an diese.

Dies überträgt die Kontrolle zwischen den Seiten.

Es gibt eine CALL-Bridge, die zum Aufrufen einer Subroutine mit einer Rückgabe erforderlich ist. Sie unterscheidet sich von JMP-Bridge durch das Speichern der aktuellen Seite auf dem Stapel und das umgekehrte Verfahren für die Rückgabe.

Die nächsten beiden Brücken sind STA-Bridge und LDA-Bridge. Wie die Namen andeuten, schreibt der erste das Batterieregister in eine logische Adresse (in HL) und der zweite liest Daten von der logischen Adresse in dieses Register.

Dank dieser beiden Brücken kann ein Programm, das von einer Seite ausgeführt wird, Daten auf einer anderen speichern.

Laden des Betriebssystems


Wenn Sie sich den Bootsektor der SD-Karte ansehen, sehen Sie, dass sich der Text „Festplattenfehler, drücken Sie eine beliebige Taste zum Neustart“ an den Adressen 1AC-1D4 befindet.



Ja, es ist so seltsam, wie es auf dem Foto aussieht, weil die Zeichenkodierung von Mikroshi nicht mit ASCII übereinstimmt.

Ich habe mich entschieden, diesen Bereich zu verwenden, um die Daten dort zum Herunterladen des PCs zu platzieren.

Zuerst habe ich den Code 00 in Position 1BA gesetzt und damit den Datensatz abgeschnitten. Jetzt sollte nur noch "Festplattenfehler" angezeigt werden und fertig. Die restlichen Bytes gehören mir. Das Prinzip ist einfach: 6 Byte MicrOS-Signatur und 4 Byte Adresse auf der SD-Karte am Anfang der Datei mit Betriebssystem. In BSVV habe ich geschrieben, dass nach dem Empfang des Bootsektors von der SD-Karte die Signatur überprüft wird. Wenn es eine gibt, nehmen Sie die nächsten 4 Bytes und verwenden Sie sie als Sektoradresse zum Laden des Betriebssystems.

Wenn keine Signatur vorhanden ist, wird die Meldung „OS DOWNLOAD ERROR“ angezeigt und der Systemmonitor erlischt ohne Zurücksetzen.

Gesamt


Und jetzt endlich funktioniert alles. BSVV ist geschrieben, aber ich muss es noch in ROM schreiben.



Und dafür muss ich alle Adressen von Unterprogrammaufrufen und -sprüngen bearbeiten, da dieser Prozessor eine absolute Adressierung hat. Und ich habe BSVV für die Region 6000-67FF geschrieben, um sie in den RAM zu laden. Aber jetzt müssen wir alle 6xxx in Fxxx ändern.

Außerdem bin ich in den "Popanetsky" -Bedingungen. Ich habe einen ROM-Programmierer, aber es ist ein alter unter einem LPT-Port. Und es gibt keinen einzigen Computer mit LPT. Aber es gibt ein Paar Atmega32A im PDIP40-Paket und ein Steckbrett. Möglicherweise müssen Sie LPT mit AVR emulieren. Aber vielleicht klappt alles ...

Das ist alles für jetzt. Vielen Dank für Ihre Aufmerksamkeit! Fortsetzung folgt…

All Articles