segunda-feira, 26 de fevereiro de 2007

HB-7000: Mais testes com o "driver" de escrita

Terminei de debugar parte de escrita do "driver" do leitor/gravador de cartões, que apesar de estar funcionando, estava me intrigando, pois a interface parecia receber 2 bytes a mais entre a transmissão do CRC do bloco, e o recebimento da resposta ("acknowledge") do cartão.

A causa era a falta de um NOP entre as instruções OUT que escreviam o CRC "dummy", e as intruções IN logo em seguida.

É que as instruções de entrada/saída automática (INI, OUTI, INIR, OUTIR) demoram alguns ciclos de clock a mais que as instruções IN e OUT, dando tempo da interface transferir automaticamente os 8 bits. No caso da instrução IN e OUT eu tenho apenas o tempo entre a borda de subida do sinal IORQ da instrução anterior e a borda de descida deste mesmo sinal na próxima instrução.Pelas minhas contas até dava, mas vou ter que estudar isso mais a fundo depois.

O fato é que nos testes que eu fiz, o NOP realmente fez a diferença, e resolveu o problema.


Segue abaixo o trecho de código que foi corrigido:

LD A,0FFH
OUT (C),A ; DUMMY CRC
NOP
OUT (C),A ; DUMMY CRC
NOP
IN A,(C) ; DESCARTA
NOP
IN A,(C); TRANSF RESPOSTA
AND 01FH
CP 05
JP NZ,ERROR


Uma sutileza no funcionamento da interface, é que quando se faz uma leitura, o valor lido é o que foi recebido na transferência anterior. Por isso a leitura da primeira instrução IN logo após a transferência do CRC é descartada. Este primeiro IN também poderia ser um OUT, pois serve apenas para iniciar a transferência do byte seguinte.

O código atual, capturado da porta da impressora, encontra-se neste link.

Nenhum comentário: