Mikrosha. Chapitre un. Contrôleur de carte SD



Beaucoup de gens se souviennent de ce merveilleux PC. Je l'ai eu quand j'avais 11 ans. Cela a pris 28 ans et maintenant j'ai décidé de faire des appareils d'extension, ce qui me manquait alors, comme passe-temps.

Idée


Sur le réseau, j'ai vu plusieurs options pour les téléchargeurs SD pour de tels PC, je n'aimais pas la présence de microcontrôleurs, je voulais utiliser des circuits "vintage, chaleureux DIP", c'est pourquoi j'ai décidé d'utiliser "KR1533" sur la logique domestique.

En complément. RAM J'ai appliqué UT62256. Il s'agit de la seule puce importée du projet. Bien sûr, il était possible d'installer KP537RU10 ou KP537RU25A, mais d'une part, ils devraient être installés non pas un mais deux (j'ai prévu 4 Ko de RAM supplémentaire), et d'autre part j'avais UT62256, mais je n'avais pas KR537, et je ne l'avais pas Je voulais. Par conséquent, je me suis permis la liberté d'importer, puis l'idée est venue d'utiliser les 32 Ko de RAM supplémentaires, avec changement de page.


Pour la ROM, j'ai choisi KR573RF5, il n'y en avait que deux propres.

Organigramme


Après m'être assis au-dessus d'une tasse de thé, j'ai dessiné un tel diagramme.



Voici la puce RAM, la puce ROM et le bloc PORT. Le bloc PORT a une interface parallèle ayant 8 entrées et 8 sorties. Lors de l'écriture à l'adresse EFFF, le code écrit est défini sur les sorties, et lors de la lecture à partir de la même adresse, la valeur lue correspond à l'état des entrées. Trois des sorties et une des entrées sont connectées à la carte SD via un convertisseur de niveau.

La RAM est représentée par la puce UT62256 et dispose de 32 Ko de mémoire. Étant donné que la plage d'adresses E000-EFFE est proche de 4 Ko (4095 octets), nous obtenons 8 pages sélectionnées par le bloc PORT, bits 1, 2 et 3. C'est-à-dire que l'écriture à l'adresse EFFF définit la page conformément à ces trois bits. La lecture de ce port montre également quelle page est actuellement sélectionnée (dans les mêmes bits). Au total, nous avons 32760 octets de RAM supplémentaire (4095x8str).

La puce ROM est KR573RF5. Il est connecté à l'espace d'adressage F000-F7FF et contient le code BSVV (BIOS), la tâche de ce code est d'initialiser la carte SD, de charger le système d'exploitation à partir de celle-ci et de lui transférer le contrôle.

En conséquence, après avoir allumé le PC, nous tapons le Moniteur système GF000 et appuyons sur VK.

À l'avenir, il est possible de modifier la ROM native du Moniteur système pour démarrer automatiquement le système d'exploitation à partir de la carte SD, et le PC ira à l'invite du moniteur standard si le téléchargement a échoué ou a été interrompu, par exemple, en appuyant sur une touche.
J'y repenserai.

Schème


Environ 2-3 heures à l'ordinateur, et j'ai dessiné le diagramme suivant dans EAGLE.


Zoom

J'ai dessiné en fonction des microcircuits que j'avais. Il est possible que le nombre de puces logiques puisse être réduit si d'autres portes sont utilisées, mais je n'en avais qu'une. Et à l'avenir, j'optimiserai très probablement le circuit.

Analyse de circuit de bas niveau ...

... enlevé sous le spoiler, je pense que peu de gens sont intéressés par cette jungle.
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 .

Assemblage de disposition


Maintenant, je n'ai plus la possibilité d'empoisonner la planche à la maison, et moi, en prenant un morceau de PCB double face recouvert d'une feuille, j'en ai scié le rectangle nécessaire.

Ce rectangle était fermement inséré dans la fente «interface interne» du PC, ne pendait pas et ne bougeait pas. Ensuite, j'ai gratté les coussinets à l'arrière et à l'avant. Cela s'est plutôt bien passé. Puis l'agencement grossier des microcircuits et la reconnaissance des trous. Sur la face avant, je l'ai percé avec une grosse perceuse afin que les bornes des microcircuits n'entrent pas en contact avec la feuille avant. Au verso, j'ai gratté le périmètre de chaque rangée de contacts et je l'ai divisé en plots de contact.

L'étape suivante, j'ai mis tous les microcircuits (et la prise) et disparu de l'arrière. Il a fallu beaucoup de temps à l'installation, que j'ai réalisée avec un MGTF fin. Il a conduit le câblage des deux côtés, de l'avant, il a soudé directement aux jambes des microcircuits, de l'arrière aux sites.



Une fois le processus de soudage terminé, j'ai décidé de faire attention au convertisseur de niveau de signal. Le fait est que la carte SD fonctionne avec une tension de 3,3V, et les puces KR1533AP6 et KR1533IR22 TTL 5v. Par conséquent, j'ai dû faire un petit foulard adaptateur, sur lequel les niveaux étaient limités aux diodes zener.

Le signal provenant de la carte SD vers le contrôleur que je viens de tirer vers la source 3.3v. Résistance 10k. Comme la pratique l'a montré, ce signal n'a pas besoin d'être converti.



Bien que dans la version finale, je ferai probablement un onduleur basé sur un comparateur.

J'ai utilisé un adaptateur microSD vers SD comme support de carte.

En général, il n'y a eu aucun problème particulier lors de l'assemblage de la mise en page, même si j'avais peur que certains microcircuits ne fonctionnent pas correctement.

Tests de disposition


Tout d'abord, j'ai vérifié le fonctionnement de la RAM, écrit les modèles «AA», «55», «F0» et «0F» dans la zone E000-EFFE en utilisant la directive System Monitor «F» et les ai vérifiés en utilisant la directive «D». Tout s'est avéré normal.

De plus, avec la directive «M», j'ai commencé à écrire différentes valeurs à l'adresse EFFF, et à regarder les changements sur les pattes du registre 153322 avec un multimètre, les états correspondaient aux codes enregistrés. De plus, lors de la lecture à partir de ce port, le code contenait la page sélectionnée, conformément au plan, et même lorsque le signal MISO était fermé au sol dans le bit bas, il s'est avéré être 0 et lorsqu'il a été ouvert 1.

Il était même quelque peu suspect que tous les microcircuits fonctionnent et que l'installation ait réussi. pas d'erreurs.

BSVV


Bien sûr, je n'avais pas d'outils spéciaux pour écrire des programmes pour 58080. J'ai dû écrire un programme dans un cahier (bloc-notes), puis le traduire manuellement en codes.
Créé un fichier dans l'éditeur sous DOS "HIEW" et commencé à le remplir de codes. Pour l'essentiel, j'ai pris mon projet sous AVR, dans lequel il y avait une initialisation standard de la carte SD. Le projet était ancien et n'utilisait aucun système de fichiers, juste un enregistreur.

J'ai d'abord écrit une fonction de bas niveau de l'interface de programmation SPI, puis une routine d'initialisation de carte SD de haut niveau.

Il s'est avéré quelque chose comme cet algorithme ...

... qui est mis sous le spoiler, je pense qu'il est déjà connu de tout le monde.
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. .

Le registre de la carte OCR a également été lu dans la routine d'initialisation et le 2ème octet a été écrit à l'adresse EFFE. Cela était nécessaire pour déterminer le type de carte.

Dans le cas de SDSC - 80h, et dans le cas de SDHC - C0h.

Si l'initialisation n'a pas réussi, le message «SD CARD ERROR» s'est affiché, puis le moniteur s'est éteint sans réinitialisation.

J'ai converti ce BSVV en WAV et l'ai téléchargé sur le PC via l'entrée bande, puis je l'ai débogué, corrigé le code source et téléchargé à nouveau.

Des ponts


J'ai maintenant de la RAM supplémentaire, d'une taille de 32 760 octets, divisée en 8 pages. Mais comment naviguer entre les pages? Comment un programme exécuté sur la première page peut-il invoquer une routine située sur la quatrième?

Pour résoudre ce problème, j'ai fourni des ponts logiciels. Un pont est une petite zone dans la ROM qui sert de médiateur au transfert de contrôle.

Par exemple, l'exécution du code doit transférer le contrôle à la page numéro 3, à l'adresse E4B5. Ensuite, le code d'exécution place les 12 bits inférieurs (4B5) dans la paire de registres du processeur HL, et dans les quatre bits supérieurs met la valeur 3 - le numéro de page. Maintenant, dans la paire de registres HL, la valeur 34B5 est écrite. Et le code saute (JMP) dans la zone ROM, qui est appelée le pont JMP, il va simplement à une adresse fixe dans la ROM. Le code dans cette zone extrait le numéro de page des bits hauts de la paire de registres HL et les écrit dans le registre du bloc PORT à l'adresse EFFF. La troisième page de RAM est maintenant affichée dans la zone E000-EFFE. Le programme JMP-Bridge réinitialise les quatre bits de poids fort de la paire de registres HL et y écrit «E». Maintenant, dans la paire de registres HL, il y a déjà une adresse physique E4B5, et ici le programme JMP-Bridge lui transfère le contrôle.

Cela transfère le contrôle entre les pages.

Il y a un CALL-Bridge, il est nécessaire d'appeler un sous-programme avec un retour, et diffère de JMP-Bridge en enregistrant la page actuelle sur la pile, et la procédure inverse pour le retour.

Les deux ponts suivants sont STA-Bridge et LDA-Bridge. Comme les noms le suggèrent, le premier écrit le registre de la batterie dans une adresse logique (en HL), et le second lit les données de l'adresse logique dans ce registre.

Grâce à ces deux ponts, un programme s'exécutant à partir d'une page peut stocker des données dans une autre.

Chargement du système d'exploitation


Si vous regardez le secteur de démarrage de la carte SD, vous pouvez voir que le texte «Erreur de disque, appuyez sur n'importe quelle touche pour redémarrer» se trouve aux adresses 1AC-1D4.



Oui, c'est tellement étrange à quoi cela ressemble sur la photo, car l'encodage des caractères de Mikroshi ne coïncide pas avec ASCII.

J'ai décidé d'utiliser cette zone pour y placer les données pour télécharger le PC.

Tout d'abord, je mets le code 00 en position 1BA, et ainsi je coupe le record. Maintenant, juste "Erreur de disque" devrait s'afficher et c'est tout. Les octets restants sont à moi. Le principe est simple, 6 octets de signature MicrOS, et 4 octets d'adresse sur la carte SD du début du fichier avec OS. Dans BSVV, j'ai écrit, après avoir reçu le secteur de démarrage de la carte SD, la signature est vérifiée, et s'il y en a une, prenez les 4 octets suivants et utilisez-la comme adresse de secteur pour charger le système d'exploitation.

S'il n'y a pas de signature, le message «OS DOWNLOAD ERROR» s'affiche et le Moniteur système s'éteint sans réinitialisation.

Total


Et maintenant, enfin, tout fonctionne. BSVV est écrit, mais j'ai encore besoin de l'écrire sur ROM.



Et pour cela, je dois modifier toutes les adresses des appels et des sauts de sous-programme, car ce processeur a un adressage absolu. Et j'ai écrit BSVV pour la région 6000-67FF à charger en RAM. Mais maintenant, nous devons changer tous les 6xxx en Fxxx.

De plus, je suis dans les conditions «popanetsky». J'ai un programmeur ROM, mais c'est un ancien, sous un port LPT. Et il n'y a pas un seul ordinateur avec LPT. Mais il y a une paire d'Atmega32A, dans le package PDIP40 et une planche à pain. Vous devrez peut-être émuler LPT à l'aide d'AVR. Mais peut-être que tout ira bien ...

C'est tout pour l'instant. Merci pour l'attention! À suivre…

All Articles