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:
Postar um comentário