por polesapart » 03 Set 2013 15:38
Que eu recorde das 39439483904 normas (ok, tá mais pra 2 ou 3) que tive que ler pra resolver o mesmo problema, a norma que criou os SDHC torna opcional o suporte SPI *apenas* para os µSD, sendo ainda mandatário o suporte para cartões de tamanho convencional. Como na prática o que os fabricantes fizeram foi passar a produzir só circuitos µSD, prevendo que venderiam mais destes do que os SDHC de tamanho convencional (que costumam ser apenas uma caixa grande para a mesma plaquinha que eles vendem na versão µSD), eu ainda não deparei com *nenhum* (dos cerca de 20 modelos diferentes que testei) µSDHC que não suportasse SPI.
São 3 "segredos industriais" que tive que aprender a duras penas (leia-se testando) para portar uma biblioteca que só lia SDCARD para SDHC, mantendo a correta compatibilidade com cartões mais antigos:
1) A rotina de inicialização precisa ser alterada. É preciso interrogar se o cartão segue a norma sd 2.0 (cmd 0x8 parametro 0x1aa), e caso sim, verificar se é um sdhc. alguns cartões são bastante suscetíveis a sequencia correta de inicialização: Mesmo que não seja sdhc, os cartoes com norma 2.0 (sairam varios de 2gb) precisam de uma inicializacao diferenciada. Os SDHC ainda um pouco mais específica.
2) Os cartões SDHC usam endereços em blocos de 512 bytes (hmm, blocos de tamanho variável conforme a norma, vc inicializa lendo os descritores, se lembro bem, mas na prática 512 bytes funciona bem em todo o range suportado pelo SDHC), enquanto os antigos usam endereços em bytes - ainda que vc especifique que usará blocos de transferência de 512 bytes. No código que faz a leitura/gravação de setores, verifique se vc tem um multiplicador por 512; substitua por uma variável que por default será 512, mas será setada para 1, caso seja um sdhc).
3) A inicialização do cartao, feita com o "ACMD 41", que é mandatório para SDHC (e acho que para SD 2.0), costuma levar beeeeeeem mais tempo (ou ciclos de clock) nos cartões maiores. Então é necessário geralmente aumentar o timeout específico de resposta à este comando, durante a sequencia de init, para evitar que o procedimento aborte.
Se lembro bem era isso.
Warning: time of day goes back (-163479us), taking countermeasures.
