Qual é a sequência de comandos correta para a inicialização do cartão microSD no SPI?

18

Estou tentando fazer interface com um cartão microSD (2 GB, Kingston, Sandisk) com um controlador Silicon Labs C8051F931 .

Estou muito confuso sobre a sequência que tenho que seguir para a inicialização. No livro Projetos de cartão SD usando o microcontrolador PIC , a página 135 menciona:

As etapas para alternar o cartão SD para o modo SPI devem ser as seguintes:
Inicialização.
• Envie pelo menos 74 pulsos de clock para o cartão com os contornos de dados e CS configurados para a lógica "1."
• Defina a linha do CD baixa.
• Envie o comando CMD0 de 6 bytes “40 00 00 00 00 95” para colocar o cartão no modo SPI.
• Verifique a resposta R1 para garantir que não haja bits de erro definidos.
• Envie o comando CMD1 repetidamente até que o bit "in-idle-state" na resposta R1 esteja definido como "0";
• e não haja bits de erro definidos. Agora o cartão está pronto para operações de leitura / gravação.

Eu tentei isso, mas estou recebendo 01 mesmo para o CDM1. 00 é esperado.

Também aqui vejo uma sequência de comandos diferente em que ele envia o CMD8 após o CMD0. Mas o livro diz que tenho que enviar o CMD1.

Qual é a sequência correta?

gpuguy
fonte

Respostas:

34

Na verdade, a maioria das informações / códigos que você pode encontrar na inicialização do SD é datada ou imprecisa, pois antecede o SDHC e o SDXC por anos. Atualmente, o procedimento é mais complicado, pois obriga a lidar com o hardware antigo de uma maneira compatível com versões anteriores.

Em primeiro lugar, como mencionado por outros, selecione uma baixa taxa de clock inicial (geralmente na faixa de 100 kHz - 400 kHz; use 400 kHz, se possível); você poderá mudar para um relógio mais alto mais tarde, se o dispositivo permitir. Enquanto os novos cartões podem suportar com segurança o clock do MHz, os mais velhos reclamam (ou seja, não se comunicam ou devolvem lixo).

A próxima coisa é que você não deve usar CMD1para inicializar cartões SD / SDHC / SDXC, a menos que seu cartão não reconheça CMD55/ ACMD41; como dito na especificação do cartão SD:

Em qualquer um dos casos, o CMD1 não é recomendado porque pode ser difícil para o host distinguir entre o MultiMediaCard e o cartão de memória SD.

Alguns controladores (placas de maior capacidade e mais novos) simplesmente permanecerão inativos se você emitir CMD1para eles. Você deve emitir primeiro CMD8 0x1AAapós a redefinição ( CMD0) e depois tentar usar CMD55 + ACMD41. Se e somente se isso falhar, use CMD1.

tl; dr para inicializar o cartão no modo SPI, você deve:

  1. CMD0arg:, 0x0CRC: 0x95(response 0x01:) - observe que, no caso de uma 0xFFresposta ilegível, você deve simplesmente repetir esta etapa; Veja abaixo para mais informações.

  2. CMD8arg:, 0x000001AACRC: 0x87(resposta 0x01:, seguida por eco de arg, neste caso 0x000001AA) - embora possa parecer que este comando seja opcional, é completamente obrigatório para placas mais recentes. Embora 0x1AAseja um valor de argumento comum aqui, você também pode passar outros valores; consulte "Tabela 7-5: Operação da placa para CMD8 no modo SPI", p. 108 na especificação para detalhes.

    3a. CMD55arg:, 0x0CRC: any, 0x65na verdade (resposta 0x01:; CMD55sendo o prefixo de todos ACMD ; se a resposta for 0x05, você tem um cartão antigo - repita CMD1com arg 0x0[CRC 0xF9] em vez de CMD55/ ACMD41)

    3b ACMD41, arg:, 0x40000000CRC: any, 0x77na verdade (observe que esse argumento assume que o cartão é um HCS, o que geralmente é o caso; use 0x0arg [CRC 0xE5] para cartões mais antigos). Se a resposta for 0x0, você está bem; se for 0x01, vá para 3a; se for 0x05, veja a nota acima (em 3a.); se não estiver, algo está errado com isso (veja também abaixo).

CMD1CMD0CMD8CMD55ACMD41CMD55ACMD41CMD0CMD8CMD1CMD1CMD55ACMD41CMD10x05nn00xFFCMD0nCMD00xFF0x01CMD8

Observe que as respostas que possuem o MSB definido, mas 0xFFgeralmente não sugerem que o seu SPI tenha uma alteração no relógio (como resultado, por exemplo, da queda de Vcc, que ocorre rotineiramente quando você está usando hotplugs SD). Para corrigi-lo, você pode tentar redefinir completamente o dispositivo (ligar / desligar, desativar / confirmar S̲S̲ etc.); que normalmente funciona.

Além disso, a especificação diz

Após a última transação de barramento do cartão de memória SD, é necessário que o host forneça 8 (oito) ciclos de relógio para o cartão concluir a operação antes de desligar o relógio.

Poderia funcionar sem ele, mas como 8 ciclos = 1 byte de saída SPI, não vai doer muito e é bom tê-lo.

Observe que você deve declarar S̲S̲ (também conhecido como CS) baixo pelo menos antes e depois de cada um CMD- é totalmente obrigatório no caso de CMD0(o dispositivo não liga sem ele) e, na realidade, necessário para todos os outros CMDse você tiver um padrão compatível com cartão SD. Conectar o S̲S̲ do cartão ao GND permanentemente pode parecerpara ser uma boa idéia se o cartão for o único cliente SPI ao qual o host se conectará, pois isso poupará o pino de saída do uC e a necessidade de gerenciá-lo por código, e porque o cartão deve assumir que está selecionado todos do tempo. Na realidade, algumas cartas (se não a maioria delas) realmente esperam que uma inclinação de alto a baixo acenda em vez de simplesmente detectarem baixa e, portanto, ficam com raiva se você não alternar o bit S̲S̲ e depois ficar relógios ou cuspir lixo; alguns cartões (geralmente mais novos) devem funcionar, outros (mais antigos) podem não funcionar, YMMV (mais uma vez). Ainda assim, para qualquer configuração SPI mais robusta (> 1 dispositivo escravo), lembre-se de declarar o pino baixo antes de qualquer transação real com o cartão SD fornecido.

Além disso, enquanto as especificações dizem que apenas CMD0e CMD8devem ter CRC no modo SPI, alguns cartões SD (como os da Transcend) parecem exigir CRC adequado para CMD55/ ACMD41- se você quer estar do lado seguro, basta usar um valor pré-calculado para eles.

Além disso, embora o SPI não exija pullups / downs por si só, lançar um pullup de 47k no MISO pode ser uma boa idéia; alguns dispositivos deixam seu pino DO alto Z em circunstâncias específicas (não inicializadas, por exemplo), e os pinos flutuantes sempre podem ser uma fonte de problemas estranhos. Se o seu uC possui 3,3 Vcc, você pode usar pullups internos; se for 5V, não faça isso, a menos que sua linha MISO já tenha uma tradução lógica de 5-> 3.3V adequada.

Leitura adicional:

Como usar o MMC / SDC

SD Especificações Parte 1 Simplificado Física Camada Especificação Simplificado - mais importante seções 6.4.1 Poder-se e 7.2.1 Seleção do Modo e inicialização com Figura 7-1 : Cartão de Memória SD Diagrama Estado (modo SPI)

vaxquis
fonte
4

As especificações para cartões SD estão disponíveis no sdcard.org . A versão simplificada deixou alguns detalhes, mas você deve procurar, por exemplo, a figura 7-2 na parte 1, onde as seqüências de inicialização são explicadas para cartões SDHC e SD.

Cartões MicroSD <= 2 GB podem funcionar como cartões mais antigos, portanto, eles devem fornecer 0x00resultados para CMD1 eventualmente . Isso pode precisar de mais algumas tentativas, pois a placa pode usar o relógio externo do barramento SPI para conduzir algum processamento interno.

Turbo J
fonte
2

Adicionando à excelente resposta @vaxquis, gostaria de citar o gráfico correspondente da " Especificação simplificada da camada física versão 4.10 , © Copyright 2001-2013 SD Group (Panasonic, SanDisk, Toshiba) e SD Card Association" (Figura 7-2 : Fluxo de inicialização do modo SPI):

Sequência de inicialização SPI do cartão SD

Aqui você pode ver quais comandos enviar em qual ordem e o que as respostas nos dizem sobre o tipo de cartão. Eu acho que é desejável que um dispositivo suporte tantos cartões quanto possível; e enquanto se trata das operações básicas de leitura e gravação de blocos de 512 bytes, isso deve ser possível para pelo menos todos os cartões SD e HC V1.x e V2.0.

JimmyB
fonte
2

Eu ofereço isso como outra possibilidade. No modo SPI, o Samsung MicroSD EVO 32GB exige que todos os códigos de comando tenham códigos CRC válidos. Aposto que eles não são os únicos. Li um comentário em que a pessoa acreditava que todos os cartões acima de 32 GB poderiam ser assim. Estou depurando um bug há mais de uma semana. Meu código não funcionaria até que todos os códigos enviados para o cartão tivessem códigos CRC válidos. Usei isso para calcular todos os códigos CRC https://github.com/hazelnusse/crc7/blob/master/crc7.cc Até tentei usar o comando 59 para desativar os códigos CRC, não. Espero que isso poupe a alguém muito tempo e esforço.

Meu código de inicialização com valores CRC ..

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)
Dave
fonte
-2

Você tem certeza de que seu barramento SPI está a 400 kHz? A inicialização deve ocorrer com o barramento SPI em execução em 400 kHz até o cartão SD informar que está no estado inativo, no qual a taxa de clock do barramento SPI pode ser aumentada (o máximo exato parece variar de fabricante para fabricante, mas parece que 12 MHz é uma aposta segura para a maioria dos cartões).

Além disso, de acordo com o seguinte: http://elm-chan.org/docs/mmc/mmc_e.html CMD1 é a inicialização adequada. O CMD8 é necessário apenas para consultar a faixa de tensão, o que não deve ser um problema para cartões não SDHC (<= 2 GB).

Zuofu
fonte
na verdade, muitos cartões SD (principalmente os mais novos, sendo o meu Sony SR-32C4 32GB) não serão CMD8lançados sem emissão prévia. Além disso, o relógio geralmente não é um problema, desde que esteja dentro do alcance sensato.
precisa saber é o seguinte
-3

Talvez seja tarde demais, mas a resposta do cartão está OK! Após o CMD0, a resposta deve ser 0x01 - isso significa que o cartão ESTÁ no estado Ocioso e pronto para o trabalho. Se você tiver algo como 0b00000101, o 1 no 2º lugar diz que este é um comando ilegal e o 1 no 0-s diz que o sard ainda está no estado Ocioso e pronto para o trabalho. Se a resposta for 0x00, significa que o cartão NÃO ESTÁ no estado Ocioso e você deve enviar outro comando RESET.

Peca
fonte
você já leu a pergunta? OP disse claramente I tried this, but I am getting 01 even for CDM1- ficando IDLE em resposta a CMD1em NÃO OK. Você não está abordando o verdadeiro problema dele com sua "resposta".
precisa saber é o seguinte