Mikrosha Capítulo uno. Controlador de tarjeta SD



Mucha gente recuerda esta maravillosa PC. Obtuve esto cuando tenía 11 años. Tomó 28 años y ahora decidí hacer dispositivos de expansión, lo que realmente me faltaba como hobby.

Idea


En la red, vi varias opciones para los descargadores de SD para tales PC, no me gustó la presencia de microcontroladores en ellos, quería usar un circuito "DIP cálido y antiguo", por lo que decidí usar "KR1533" en la lógica doméstica.

Como un complemento. RAM apliqué UT62256. Este es el único chip importado en el proyecto. Por supuesto, fue posible instalar KP537RU10 o KP537RU25A, pero en primer lugar, habrían tenido que instalarse no uno sino dos (planeé 4 KB de RAM adicional), y en segundo lugar tenía UT62256, pero no tenía KR537 y no tenía que pedir Quería. Por lo tanto, me permití la libertad de importar, y luego surgió la idea de usar todos los 32kB de RAM adicional, con cambio de página.


Para la ROM elegí KR573RF5, solo había dos limpias.

Diagrama de flujo


Después de sentarme sobre una taza de té, dibujé un diagrama de bloques.



Aquí está el chip RAM, el chip ROM y el bloque PORT. El bloque PORT tiene una interfaz paralela que tiene 8 entradas y 8 salidas. Al escribir en la dirección EFFF, el código escrito se establece en las salidas, y cuando se lee desde la misma dirección, el valor de lectura corresponde al estado de las entradas. Tres de las salidas y una de las entradas están conectadas a la tarjeta SD a través de un convertidor de nivel.

La RAM está representada por el chip UT62256 y tiene 32kB de memoria. Como el rango de direcciones E000-EFFE es de casi 4kB (4095 bytes), obtenemos 8 páginas que son seleccionadas por el bloque PORT, bits 1,2 y 3. Es decir, escribir en la dirección EFFF establece la página de acuerdo con estos tres bits. También leer desde este puerto muestra qué página está seleccionada actualmente (en los mismos bits). Total, tenemos 32760 bytes de RAM adicional (4095x8str).

El chip ROM es KR573RF5. Está conectado al espacio de direcciones F000-F7FF y contiene el código BSVV (BIOS), la tarea de este código es inicializar la tarjeta SD, cargar el sistema operativo y transferirle el control.

En consecuencia, después de encender la PC, escribimos el Monitor del sistema GF000 y presionamos VK.

En el futuro, existe la idea de modificar la ROM nativa del Monitor del sistema para iniciar automáticamente el sistema operativo desde la tarjeta SD, y la PC irá al indicador estándar del Monitor si la descarga falló o se interrumpió, por ejemplo, presionando alguna tecla.
Lo pensaré de nuevo.

Esquema


Aproximadamente 2-3 horas en la computadora, y dibujé el siguiente diagrama en EAGLE.


Zoom

que dibujé en base a los microcircuitos que tenía. Es posible que la cantidad de chips lógicos se reduzca si se usan otras puertas, pero solo tuve una. Y en el futuro, lo más probable es que optimice el circuito.

Análisis de circuitos de bajo nivel ...

... eliminado bajo el spoiler, creo que pocas personas están interesadas en esta jungla.
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 .

Ensamblaje de diseño


Ahora no tengo oportunidad de envenenar el tablero en casa, y yo, tomando un pedazo de PCB de doble cara recubierto de aluminio, corté el rectángulo necesario.

Este rectángulo se insertó firmemente en la ranura de "interfaz interna" de la PC, no se colgó y no se movió. Luego, rasqué las almohadillas en la parte posterior y frontal. Resulto bastante bien. Luego, la disposición aproximada de los microcircuitos y el reconocimiento de los agujeros. En el lado frontal, lo perforé con un taladro grande para que los terminales de los microcircuitos no entren en contacto con la lámina frontal. En el reverso, rasqué el perímetro de cada fila de contacto y lo dividí en almohadillas de contacto.

El siguiente paso puse todos los microcircuitos (y el zócalo) y desapareció de la parte posterior. Me llevó mucho tiempo la instalación, que realicé con un MGTF delgado. Condujo el cableado en ambos lados, desde la parte delantera que soldaba directamente a las patas de los microcircuitos, desde la parte posterior a los sitios.



Cuando terminó el proceso de soldadura, decidí prestar atención al convertidor de nivel de señal. El hecho es que la tarjeta SD funciona con un voltaje de 3.3V, y los chips KR1533AP6 y KR1533IR22 TTL 5v. Por lo tanto, tuve que hacer una pequeña bufanda adaptadora, en la que los niveles se limitaban a diodos zener.

La señal proveniente de la tarjeta SD al controlador que acabo de extraer a la fuente 3.3v. Resistencia de 10k. Como la práctica ha demostrado, esta señal no necesita ser convertida.



Aunque en la versión final probablemente haré un inversor basado en un comparador.

Usé un adaptador de microSD a SD como soporte de la tarjeta.

En general, no hubo problemas especiales al ensamblar el diseño, aunque temía que algunos de los microcircuitos pudieran estar funcionando mal.

Pruebas de diseño


En primer lugar, verifiqué el funcionamiento de la RAM, escribí los patrones "AA", "55", "F0" y "0F" en el área E000-EFFE utilizando la directiva del Monitor del sistema "F" y los verifiqué utilizando la directiva "D". Todo resultó ser normal.

Luego, usando la directiva "M", comencé a escribir diferentes valores en la dirección EFFF y a observar los cambios en las patas del registro 153322 con un multímetro, los estados correspondían a los códigos grabados. Además, al leer desde este puerto, el código contenía la página seleccionada, de acuerdo con el plan, e incluso cuando la señal MISO se cerró al suelo, el bit bajo resultó ser 0, y cuando se abrió 1.

Incluso era sospechoso que todos los microcircuitos funcionaran y la instalación fuera exitosa Sin errores.

BSVV


Por supuesto, no tenía ninguna herramienta especial para escribir programas para 58080. Tuve que escribir un programa en un cuaderno (bloc de notas), luego traducirlo a códigos manualmente.
Creó un archivo en el editor bajo DOS "HIEW" y comenzó a llenarlo con códigos. Para lo básico, tomé mi proyecto bajo AVR, en el que había una inicialización estándar de la tarjeta SD. El proyecto era antiguo y no utilizaba ningún sistema de archivos, solo un registrador.

Primero escribí una función de bajo nivel de la interfaz de programación SPI, y luego una rutina de inicialización de tarjeta SD de alto nivel.

Resultó algo así como este algoritmo ...

... que se pone bajo el spoiler, creo que ya es conocido por todos.
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. .

El registro de la tarjeta OCR también se leyó en la rutina de inicialización, y el segundo byte se escribió en la dirección EFFE. Esto fue necesario para determinar el tipo de tarjeta.

En el caso de SDSC - 80h, y en el caso de SDHC - C0h.

Si no se aprobó la inicialización, aparecerá el mensaje "ERROR DE TARJETA SD" y luego el monitor se apagó sin reiniciar.

Convertí este BSVV en WAV y lo descargué a la PC a través de la entrada de cinta, luego lo depuré, corrigí el código fuente y lo descargué nuevamente.

Puentes


Ahora tengo RAM adicional, 32,760 bytes de tamaño, dividida en 8 páginas. ¿Pero cómo navegar entre páginas? ¿Cómo puede un programa que se ejecuta en la primera página invocar una rutina ubicada en la cuarta?

Para resolver este problema, he proporcionado puentes de software. Un puente es un área pequeña en ROM que media la transferencia de control.

Por ejemplo, el código de ejecución debe transferir el control a la página número 3, para direccionar E4B5. Luego, el código de ejecución coloca los 12 bits inferiores (4B5) en el par de registro del procesador HL, y en los cuatro bits superiores pone el valor 3: el número de página. Ahora en el par de registros HL se escribe el valor 34B5. Y el código salta (JMP) al área ROM, que se llama JMP-Bridge, solo va a una dirección fija en la ROM. El código en esta área extrae el número de página de los bits altos del par de registros HL y los escribe en el registro del bloque PORT en la dirección EFFF. La tercera página de RAM ahora se muestra en el área E000-EFFE. El programa JMP-Bridge restablece los cuatro bits altos del par de registros HL y escribe "E" allí. Ahora en el par de registros HL ya hay una dirección física E4B5, y aquí el programa JMP-Bridge le transfiere el control.

Esto transfiere el control entre páginas.

Hay un CALL-Bridge, es necesario llamar a una subrutina con un retorno, y difiere de JMP-Bridge al guardar la página actual en la pila y el procedimiento inverso para el retorno.

Los siguientes dos puentes son STA-Bridge y LDA-Bridge. Como sugieren los nombres, el primero escribe el registro de la batería en una dirección lógica (en HL), y el segundo lee los datos de la dirección lógica en este registro.

Gracias a estos dos puentes, un programa que se ejecuta desde una página puede almacenar datos en otra.

Carga del sistema operativo


Si observa el sector de inicio de la tarjeta SD, puede ver que el texto "Error de disco, presione cualquier tecla para reiniciar" se encuentra en las direcciones 1AC-1D4.



Sí, es tan extraño cómo se ve en la foto, porque la codificación de caracteres de Mikroshi no coincide con ASCII.

Decidí usar esta área para colocar los datos allí para descargar la PC.

En primer lugar, puse el código 00 en la posición 1BA, y así corté el récord. Ahora, solo se debe mostrar "Error de disco" y eso es todo. Los bytes restantes son míos. El principio es simple, la firma MicrOS de 6 bytes y la dirección de 4 bytes en la tarjeta SD del comienzo del archivo con el sistema operativo. En BSVV, escribí, después de recibir el sector de arranque de la tarjeta SD, se verifica la firma, y ​​si hay una, entonces tome los siguientes 4 bytes y úsela como la dirección del sector para cargar el sistema operativo.

Si no hay firma, se muestra el mensaje "ERROR DE DESCARGA DEL SO" y el Monitor del sistema se apaga sin reiniciar.

Total


Y ahora, finalmente, todo funciona. BSVV está escrito, pero aún necesito escribirlo en la ROM.



Y para esto, necesito editar todas las direcciones de llamadas y saltos de subrutina, ya que este procesador tiene direccionamiento absoluto. Y escribí BSVV para la región 6000-67FF para cargar en RAM. Pero ahora necesitamos cambiar todos los 6xxx a Fxxx.

Además, estoy en las condiciones "popanetsky". Tengo un programador de ROM, pero es antiguo, bajo un puerto LPT. Y no hay una sola computadora con LPT. Pero hay un par de Atmega32A, en el paquete PDIP40 y una placa de pruebas. Es posible que deba emular LPT con AVR. Pero tal vez todo saldrá bien ...

Eso es todo por ahora. ¡Gracias por la atención! Continuará…

All Articles