segunda-feira, 20 de novembro de 2006

Leitor de MMC/SD rápido: Mais alguns Testes dos Registradores de Deslocamento, correções e conclusões

Após o teste do registrador de saída, iniciaram-se os testes com o registrador de entrada. Para isso, os pinos 3 e 5 do 74HC125 foram conectados e os seguintes programas foram executados:

DADO: EQU 0
SPI: EQU 12

ORG 9000H
LD A,0
IN A,(14) ; ativa CS
LD A,0
IN A,(15) ; ativa 74125
LD A,0
IN A,(12)
NOP
NOP
IN A,(12)
LD (9050H),A
RET

E, em Basic

5 DEFUSR0=&H9000
10 INPUT “DADO”;D
20 POKE &H9009,D
30 A=USR0(0)
40 PRINT PEEK &H9050
50 GOTO 10

O programa em Basic simplesmente passa um parâmetro para o programa em assembler, que por sua vez, transmite à saída o dado desejado no primeiro IN, e em seguida lê o valor ecoado para o registrador de entrado, no segundo IN.

Foi notada uma instabilidade na leitura dos valores, ou seja, nem sempre o valor lido correspondia ao valor escrito.

O programa em Basic foi alterado para um loop que variava incrementalmente o valor transmidito de 0 a 255, e comparava o valor transmitido com o valor recebido, mostrando quais bits continham erros.

Esse programa produziu erros que sempre se repetiam, revelando uma natureza deterministica, descartando assim maus contatos no protótipo.

O 74HC125 foi retirado, e no lugar foi colocado uma ponte entre os pinos 2 e 6 em seu soquete, mas os erros continuavam os mesmos.

Uma nova análise revelou a origem do problema. No circuito, o mesmo sinal de clock foi utilizado em ambos os registradores de deslocamento (o de entrada e o de saída) e por isso ambos fazem “shift” dos dados na borda de subida (pois em ambos a borda de subida é a ativa).

Mas acontece que do ponto de vista do LS165, um “shift” é realmente um “shift”, mas do pondo de vista do LS595, o “shift” é um o “LATCH,” pois no momento do shift é
que o bit atual é capturado para dentro de um flip-flop. Desta forma, o registrador de entrada (LS595) estava tentando capturar um sinal (saída do LS165) enqanto este ainda estava se acomodando, gerando os erros mencionados.

É por isso que quando o “shift” era feito manualmente, os resultados eram aleatórios, pois o erro dependia da carga eletrica reminiscente nas portas no momento em que era dado o “ENTER”.

O bit 7 nunca ficava errado, porque quando o IORQ chega pela instrução 'IN A,(SPI)', o LS165 recebe o sinal da via de dados e já coloca o bit mais significativo na saída QH. Assim, quando os ciclos de clock automático começavam, o sinal já era estável, e nunca era lido errado.

A correção para o problema foi inverter o sinal de clock do LS165, de forma que o “Shift” aconteça durante a borda de descida, respeitando assim as especificações do cartão SD/MMC, em modo SPI.


De forma simplificada esta é a sequência de eventos:

Na borda de subida:
a) O LS595 captura o sinal que o cartão disponibilizou na linha DOUT
b)O Cartão captura o sinal que o LS165 disponibilizou na linha DIN

Na borda de descida: (que se torna de subida para o LS165 interno)
a)O LS165 faz shift no byte sendo transmitido ao cartão e sinal e disponibiliza o próximo bit na linha DIN
b)O cartão faz shift no byte que está sendo transmidito ao LS595 e o disponibiliza na linha DOUT

A forma de onda abaixo ilustra a operação do circuito.



Após a inicialização do cartão, quando o pino CS é levado a zero, o cartão inicializa sua saída, disponibilizando o bit mais significativo do primeiro byte a ser transmitido na linha de dados. Em seguida :

  1. O programa decodifica e executa a instrução IN
  2. O Z80 coloca nas linhas D8..D15 o dado a ser transmitido
  3. O Z80 baixa a linha IORQ
  4. O dado a ser transmitido é transferido para os flip-flops internos do LS165
  5. O bit mais significativo do byte a ser transmitido fica disponivel (valido) na saida QH do LS165
  6. O Z80 sobe a linha IORQ
  7. O gerador de clock automático é habilitado e está pronto para começar a contar a partir da próxima borda de subida
  8. O Z80 começa a executar a proxima instrução
  9. A linha SCK sobe, pois
  10. o LS595 captura para o flip flop interno, o bit mais significativo vindo do cartao, pela linha DIN
  11. o cartão captura o bit mais significativo enviado pelo pino QH do LS165
  12. A linha SCK desce
  13. A linha INV_SCK sobe simultaneamente.
  14. O LS165 coloca em sua saida QH o bit 6 do dado a ser transmitido ao cartao
  15. O cartão coloca em sua linha DOUT o bit 6 do dado a ser transmitido ao micro
  16. A linha SCK sobe...
E o processo se repete até os 8 bits terem sido transferidos.

Ao final da transferência deste byte, a linha DOUT do cartão já contém o bit mais significativo do próximo byte a ser transferido. Se houverem mais dados a serem trocados, o processo continua.

Nenhum comentário: