Foi útil?

Solução

I parecem ter encontrado o problema. Quando eu calcular o CRC correto para CMD55 e enviá que em vez de um manequim CRC, o comando é aceito (resultar 0x01). Se você olhar para a especificação da camada física na seção 7.2.2 , ele diz explicitamente que:

A interface SPI é inicializado no modo CRC OFF no padrão. (Excepto para os comandos CMD0 e CMD8).

Este não parece ser o caso com esta série de Transcend cartões, violando assim a especificação. Também em caso de um erro de CRC a resposta deve ser 0x09 em vez de 0x05. Tentei explicitamente desligar a verificação de CRC com CMD59, mas isso não parece ajudar.

=> Cálculo do CRC correto para (todos?) Comandos faz com que o trabalho do cartão.

Estou em contato com suporte Transcend sobre isso. Se eu aprender alguma coisa útil que você vai saber aqui.

Note que eu usei outros 2 GB Transcend cartões antes, mas eles foram feitos em Taiwan, enquanto a nova é feita na Coreia (e parece ser um cartão de Samsung (MMAGR02GUDCA)).

Outras dicas

Eu tinha quase a mesma questão. Ao enviar ACMD41, mandei CMD55 seguido por CMD41. A resposta para CMD55 foi 0x01, indicando estado ocioso e executar o processo de inicialização (isto é normal, eu acho). CMD41 responderia com 0x05, indicando comando ilegal. Acontece que meu cartão especial que o CRC verificar por padrão, mesmo no modo SPI, e misreports erros CRC como comandos ilegais (ou seja, ele não segue a especificação SD). Quando eu calcular o CRC adequada, ele funciona bem. Aqui está o código de cálculo CRC7 I usado, ele tem funcionado bem para mim:

https://github.com/hazelnusse/crc7

A menos que você tenha tomado cuidado para desativar a verificação CRC, eu acho que é provavelmente o melhor para assumir que não está desativado e certifique-se de calcular o CRC adequada para cada quadro de comando. Do que eu posso dizer, alguns cartões de desativá-lo por padrão no modo SPI e outros habilitá-lo, mesmo que a especificação SD afirma ele deve ser desativado por padrão no modo SPI exceto para CMD8.

Você disse que você usou CRC 0 para o comando falhar. Presumo que você quis dizer que você enviou todo o último byte como 0x00. Note que o CRC7 apenas os primeiros 7 bits do último byte - o último bit chamado end bit deve ser sempre 1. Então, se você estavam enviando 0x00 como o último byte, com 0 como o último bit, o fracasso seria compreensível, e até mesmo o código de erro faria sentido. Se você enviar 1 como o último bit, ele deve funcionar, ou seja. Use algo como 0x01 ou 0xFF como o último byte.

É normal, é provável que a carga-bomba interna usado para fazer apagar tensão que leva mais tempo do que o habitual para estar pronto ... você tem que insistir na combinação CMD55 + ACMD41 até terminar a inicialização.

O CMD58 também pode ajudá-lo a verificar se você está fornecendo níveis corretos de tensão (por vezes tomadas têm problemas de contato).

Envio CMD0 com o chip select (0) sozinho não inicializar o cartão no modo SPI. Isso só define o modo SPI. O cartão não é inicializado até a volta ACMD41 aceites. Então CRC está desativado por padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top