Mikrosha. Capítulo um. Controlador de cartão SD



Muitas pessoas se lembram deste PC maravilhoso. Eu consegui isso aos 11 anos. Demorou 28 anos e agora decidi fazer dispositivos de expansão, os quais realmente me faltavam como hobby.

Idéia


Na rede, vi várias opções de download de SD para esses PCs, não gostava da presença de microcontroladores neles, queria usar o circuito "vintage, quente DIP", e foi por isso que decidi usar o "KR1533" na lógica doméstica.

Como um complemento. RAM Apliquei o UT62256. Este é o único chip importado no projeto. Obviamente, era possível instalar o KP537RU10 ou o KP537RU25A, mas, em primeiro lugar, eles teriam que ser instalados, não um, mas dois (planejei 4 KB de RAM adicional) e, em segundo, o UT62256, mas não tinha o KR537 e não precisava pedir Eu queria. Portanto, eu me permiti a liberdade de importar e, em seguida, surgiu a idéia de usar todos os 32kB de RAM adicional, com troca de página.


Para a ROM que escolhi o KR573RF5, havia apenas duas limpas.

Fluxograma


Depois de me sentar com uma xícara de chá, desenhei um diagrama de blocos.



Aqui está o chip de RAM, o chip de ROM e o bloco PORT. O bloco PORT possui uma interface paralela com 8 entradas e 8 saídas. Ao escrever no endereço EFFF, o código escrito é definido nas saídas e, ao ler no mesmo endereço, o valor lido corresponde ao status das entradas. Três das saídas e uma das entradas estão conectadas ao cartão SD através de um conversor de nível.

A RAM é representada pelo chip UT62256 e possui 32kB de memória. Como o intervalo de endereços E000-EFFE é quase 4kB (4095 bytes), obtemos 8 páginas selecionadas pelo bloco PORT, bits 1,2 e 3. Ou seja, gravar no endereço EFFF define a página de acordo com esses três bits. Também a leitura desta porta mostra qual página está atualmente selecionada (nos mesmos bits). Total, temos 32760 bytes de RAM adicional (4095x8str).

O chip da ROM é KR573RF5. Ele está conectado ao espaço de endereço F000-F7FF e contém o código BSVV (BIOS); a tarefa desse código é inicializar o cartão SD, carregar o SO e transferir o controle para ele.

Assim, depois de ligar o PC, digitamos o GF000 System Monitor e pressionamos VK.

No futuro, existe uma ideia de modificar a ROM nativa do Monitor do sistema para inicializar automaticamente o sistema operacional a partir do cartão SD, e o PC irá para o prompt padrão do Monitor se o download falhar ou for interrompido, por exemplo, pressionando alguma tecla.
Eu vou pensar sobre isso novamente.

Esquema


Cerca de 2-3 horas no computador e desenhei o diagrama a seguir no EAGLE.


O zoom que

eu desenhei com base nos microcircuitos que eu tinha. É possível que o número de chips lógicos possa ser reduzido se outros portões forem usados, mas eu só tinha um. E no futuro, provavelmente otimizarei o circuito.

Análise de circuito de baixo nível ...

... removido por baixo do spoiler, acho que poucas pessoas estão interessadas nessa selva.
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 .

Montagem do layout


Agora não tenho oportunidade de envenenar a prancha em casa e, pegando um pedaço de PCB de dupla face revestido com papel alumínio, vi o retângulo necessário.

Esse retângulo foi firmemente inserido no slot de “interface interna” do PC, não saiu e não se moveu. Em seguida, arranhei as almofadas nas costas e na frente. Acabou muito bem. Depois, o arranjo aproximado dos microcircuitos e o reconhecimento dos buracos. Na parte frontal, perfurei-a com uma furadeira grande, para que os terminais dos microcircuitos não entrem em contato com a folha frontal. No verso, arranhei o perímetro de cada linha de contato e o dividi em almofadas de contato.

No próximo passo, coloquei todos os microcircuitos (e a tomada) e desapareci da parte de trás. Demorou muito tempo na instalação, que eu conduzi com um MGTF fino. Ele liderou a fiação dos dois lados, desde a frente que soldou diretamente nas pernas dos microcircuitos, da parte traseira aos locais.



Quando o processo de soldagem terminou, decidi prestar atenção ao conversor de nível de sinal. O fato é que o cartão SD funciona com uma tensão de 3,3V e os chips KR1533AP6 e KR1533IR22 TTL 5v. Portanto, tive que fazer um pequeno cachecol adaptador, no qual os níveis eram limitados aos diodos zener.

O sinal vindo do cartão SD para o controlador acabei de puxar para a fonte 3.3v. 10k resistor. Como a prática demonstrou, esse sinal não precisa ser convertido.



Embora na versão final eu provavelmente faça um inversor baseado em um comparador.

Usei um adaptador microSD para SD como suporte de cartão.

Em geral, não houve problemas especiais na montagem do layout, embora eu tenha medo de que alguns dos microcircuitos possam estar com defeito.

Testes de layout


Antes de tudo, verifiquei a operação da RAM, escrevi os padrões "AA", "55", "F0" e "0F" na área E000-EFFE usando a diretiva System Monitor "F" e os verifiquei usando a diretiva "D". Tudo acabou normal.

Além disso, com a diretiva “M”, comecei a escrever valores diferentes no endereço EFFF e observar as alterações nas pernas do registro 153322 com um multímetro, os estados correspondiam aos códigos registrados. Além disso, ao ler a partir desta porta, o código continha a página selecionada, de acordo com o plano, e mesmo quando o sinal MISO foi fechado para aterrar no bit mais baixo, acabou sendo 0 e quando aberto 1.

Era de alguma forma suspeito que todos os microcircuitos estavam funcionando e a instalação foi bem-sucedida sem erros.

BSVV


Obviamente, eu não tinha nenhuma ferramenta especial para escrever programas para o 58080. Eu tive que escrever um programa em um notebook (bloco de notas) e depois traduzi-lo em códigos manualmente.
Criou um arquivo no editor no DOS "HIEW" e começou a preenchê-lo com códigos. Para o básico, levei meu projeto ao AVR, no qual havia uma inicialização padrão do cartão SD. O projeto era antigo e não usava nenhum sistema de arquivos, apenas um criador de logs.

Primeiro, escrevi uma função de baixo nível da interface de programação SPI e, em seguida, uma rotina de inicialização de cartão SD de alto nível.

Aconteceu algo como este algoritmo ...

... que é colocado sob o spoiler, acho que já é conhecido 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. .

O registro do cartão de OCR também foi lido na rotina de inicialização e o segundo byte foi gravado no endereço EFFE. Isso foi necessário para determinar o tipo de cartão.

No caso do SDSC - 80h, e no caso do SDHC - C0h.

Se a inicialização não passou, a mensagem “SD CARD ERROR” foi exibida e o monitor apagou-se sem redefinir.

Eu converti este BSVV em WAV e o baixei para o PC através da entrada de fita, depois depurei, corrigi o código fonte e baixei novamente.

Pontes


Agora tenho RAM adicional, 32.760 bytes de tamanho, dividido em 8 páginas. Mas como navegar entre as páginas? Como um programa em execução na primeira página invoca uma rotina localizada na quarta?

Para resolver esse problema, forneci pontes de software. Uma ponte é uma pequena área na ROM que medeia a transferência de controle.

Por exemplo, o código em execução deve transferir o controle para a página número 3, para endereçar E4B5. Em seguida, o código de execução coloca os 12 bits inferiores (4B5) no par de registradores do processador HL, e nos quatro bits superiores coloca o valor 3 - o número da página. Agora, no par de registradores HL, o valor 34B5 é gravado. E o código salta (JMP) para a área da ROM, que é chamada de JMP-Bridge, está indo para um endereço fixo na ROM. O código nesta área extrai o número da página dos bits altos do par de registradores HL e os grava no registrador do bloco PORT no endereço EFFF. A terceira página da RAM agora é exibida na área E000-EFFE. O programa JMP-Bridge redefine os quatro bits altos do par de registradores HL e grava "E" lá. Agora, no par de registradores HL, já existe um endereço físico E4B5, e aqui o programa JMP-Bridge transfere o controle para ele.

Isso transfere o controle entre as páginas.

Há um CALL-Bridge, é necessário chamar uma sub-rotina com um retorno e difere do JMP-Bridge salvando a página atual na pilha e o procedimento inverso para retornar.

As próximas duas pontes são STA-Bridge e LDA-Bridge. Como os nomes sugerem, o primeiro grava o registro da bateria em um endereço lógico (em HL) e o segundo lê os dados do endereço lógico nesse registro.

Graças a essas duas pontes, um programa em execução em uma página pode armazenar dados em outra.

Carregamento do SO


Se você observar o setor de inicialização do cartão SD, poderá ver que o texto "Erro no disco, pressione qualquer tecla para reiniciar" está localizado nos endereços 1AC-1D4.



Sim, é tão estranho como fica na foto, porque a codificação de caracteres de Mikroshi não coincide com o ASCII.

Eu decidi usar essa área para colocar os dados lá para baixar o PC.

Primeiro, coloquei o código 00 na posição 1BA e, assim, cortei o registro. Agora, apenas "Erro de disco" deve ser exibido e é isso. Os bytes restantes são meus. O princípio é simples, assinatura MicrOS de 6 bytes e endereço de 4 bytes no cartão SD do início do arquivo com sistema operacional. No BSVV que escrevi, depois de receber o setor de inicialização do cartão SD, a assinatura é verificada e, se houver, pegue os próximos 4 bytes e use-o como o endereço do setor para carregar o sistema operacional.

Se não houver assinatura, a mensagem “ERRO DE DOWNLOAD DO SO” é exibida e o Monitor do Sistema apaga-se sem redefinir.

Total


E agora, finalmente, tudo funciona. O BSVV está escrito, mas ainda preciso gravá-lo na ROM.



E para isso, preciso editar todos os endereços de chamadas e saltos de sub-rotinas, pois esse processador possui endereçamento absoluto. E eu escrevi BSVV para a região 6000-67FF para carregar na RAM. Mas agora precisamos alterar todos os 6xxx para Fxxx.

Além disso, estou nas condições "popanetsky". Eu tenho um programador de ROM, mas é antigo, sob uma porta LPT. E não há um único computador com LPT. Mas há um par de Atmega32A, no pacote PDIP40 e uma placa de ensaio. Pode ser necessário emular o LPT usando o AVR. Mas talvez tudo dê certo ...

Isso é tudo por enquanto. Obrigado pela atenção! Continua…

All Articles