sexta-feira, 2 de março de 2007

Acerto na rotina de inicialização.

Eu mexi mais um pouco na rotina de inicialização.

Eu computei corretamente o valor de HL para o Delay de 1ms assim que a alimentação do cartão é ligada.

Eu tinha notado que o cartao algumas recusava-se a inicializar quando removido com o seu Vcc ainda ligado. Ciclando-se a alimentação ele inicializava - out (13),129 :out(13),1 .

Quando coloquei o delay de 1ms no inicio da rotina, eu chutei um valor pra HL que acabou resolvendo o problema, mas quando fui computar, em vez de 1ms eu estava aguardando 180ms!

Lendo de novo a especificação do cartão, eu reparei que o tempo de resposta ao comando CMD1 (ou ADMD41) é da ordem de centenas de milissegundos. Algumas implementações de interfaces de leitura destes cartões com microcontroladores chegam a aguardar 1segundo antes de sinalizar um erro.

O código anterior usava o contador B num "loop" para aguardar a resposta correta ao comando CMD1(ACMD41). Isso resultava num "loop" com um tempo menor que 40ms. Como o cartão não respondia neste tempo, a rotina retornava erro.

Refiz a rotina de inicialização, colocando o "delay" pós "power-up" de 1ms e usando um "loop" que dura no minimo 800ms. Agora funciona mesmo quando eu tiro o cartão e o recoloco.

Deu pra notar também que o tempo de acesso ao cartão reduziu. Antes o tempo de inicialização era perceptível (180ms). Agora nem dá pra notar.

Agora falta refazer alguns calculos apenas, pro segundo loop de inicialização, que envia os comandos ACMD41, caso o CMD1 falhe (alguns SDs precisam ser iniciados com dessa maneira). O Valor de HL muda, pois o comando ACMD41 é uma sequência de envio dos comandos CMD55 e CMD41, ou seja, gasta mais ciclos de "clock". Consequentemente o valor de HL vai ser menor.

Segue abaixo uma captura da tela, com 3 execuções simultâneas.

  • Na primeira o cartão inicializou sem problemas
  • Na segunda eu retirei fora o cartão.
  • Na terceira eu recoloquei o cartão e rodei de novo o programa. Dá pra notar que o cartão demorou mais tempo até responder. Detalhe importante: Olhando a saída com "verbose" ativado, dá pra ver que o cartão respondeu após 26 chamadas. Demorei a entender porque, pois eu á tinha feito vários testes, onde o cartão não inicializara após 255 chamadas (40ms). A explicação é que quando eu uso o modo "verbose" eu gasto bastante tempo chamando a rotina de impressão dos caracteres recebidos, que por sua vez chama a BIOS. E este tempo gasto pelo fato e eu estar "imprimindo" os caracteres, é suficiente para o cartão terminar seu processo interno de inicialização.


O código atual encontra-se neste link.

Nenhum comentário: