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 :
- O programa decodifica e executa a instrução IN
- O Z80 coloca nas linhas D8..D15 o dado a ser transmitido
- O Z80 baixa a linha IORQ
- O dado a ser transmitido é transferido para os flip-flops internos do LS165
- O bit mais significativo do byte a ser transmitido fica disponivel (valido) na saida QH do LS165
- O Z80 sobe a linha IORQ
- O gerador de clock automático é habilitado e está pronto para começar a contar a partir da próxima borda de subida
- O Z80 começa a executar a proxima instrução
- A linha SCK sobe, pois
- o LS595 captura para o flip flop interno, o bit mais significativo vindo do cartao, pela linha DIN
- o cartão captura o bit mais significativo enviado pelo pino QH do LS165
- A linha SCK desce
- A linha INV_SCK sobe simultaneamente.
- O LS165 coloca em sua saida QH o bit 6 do dado a ser transmitido ao cartao
- O cartão coloca em sua linha DOUT o bit 6 do dado a ser transmitido ao micro
- 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.