Página 1 de 1

Erro em Inicialização de cartão SD

MensagemEnviado: 03 Mai 2010 16:15
por openavr
Ola pessoal,

Depois de ler muito cheguei a um ponto que travei aqui com relação a comunicacao com cartao SD

O que me acontece é o seguinte. Tenho dois cartoes SD aqui. um de 256mb e outro de 1Gb.

Estou enviando os comandos de inicio pro SD nesta sequencia:
CMD0, CMD55, ACMD41, CMD1 ...

o cartao 256mb responde sempre com 0x01 todos os comandos e nao muda para 0x00 após o CMD1.. tudo que envio para ele , responde com 0x01

e o cartao de 1GB é mais loco.. o CMD0 ele responde com 0x01... porem o CMD55 ele responde com 0x05 ou com 0xC1 ou ainda com 0xF0 - 0x5F ...

Existe sim muita coisa na internet, porem nao consegui decifrar o que li, pois cada site e autor fala de uma maneira entao estou bem confuso..creio que falte apenas algum detalhe...

Lembrando que no projeto vou ter q usar o de 1GB.
Outro detalhe tambem é q sao MicroSD com adaptador SD... mas creio q isso nao é o que esta influenciando ( OU É ? :shock: )

Agradeço qualquer ajuda! Obrigado!

MensagemEnviado: 03 Mai 2010 19:17
por proex
Realmente, a literatura disponivel para Sdcard é a coisa mais confusa que já vi. Sofri pacas tempos atras para fazer isso funcionar.

Ai os manés vão dizer: mas já existe codigo pronto em C pra isso.

Não existia na época e muito menos em Assembler pra PIC.

Não sei se vc está usando o barramento de 4 bits ou a interface SPI pra isso, eu usei a SPI.

Se vc estiver usando SPI, lembre-se que, durante a inicialização o clock da SPI deve ser baixo, (abaixo de 1Mhz).

Na sequencia abaixo tem os comandos que usei para fazer o cartão funcionar.

Ao energizar o circuito, vc deve enviar ao cartão, no minimo 80 pulsos de clock , MANTENDO O PINO CS EM NIVEL 1. Não estranhe , é assim mesmo.

O pino CS (Chip Select) é ativo em Zero mas sómente nesse caso ele dever ser mantido em UM durante o envio dos pulsos de clock.

Neste caso também, não interessa o que vc vai mandar pela linha de dados.

Esses pulsos de clock com o pino CS em 1 servem para inicializar alguns processos internos do Sdcard. Como o pino CS vai estar em 1, não haverá é claro nenhuma resposta imediata do cartao.

Após isso vc já pode começar a enviar os respectivos comandos de inicialização, manipulando o pino CS de acordo com a exigencia do protocolo.

Em síntese:

Envie os 80 pulsos de clock;
Envie o comando CMD0 (Reset)= 0x40. O cartão deve responde 0x01;
Envie o comando CMD1(Init Card)= 0x41. O cartão deve responder 0x00;
Envie o comando CMD55(Validation)=0x69. O cartão deve responder 0x00.

A partir daí o cartão estará inicalizado. Vc já pode aumentar o clock da SPI e mandar bala.

Essa sequencia foi testada somente em cartão de 1G.

Boa sorte.

.

MensagemEnviado: 03 Mai 2010 21:11
por openavr
Em síntese:

Envie os 80 pulsos de clock;
Envie o comando CMD0 (Reset)= 0x40. O cartão deve responde 0x01;
Envie o comando CMD1(Init Card)= 0x41. O cartão deve responder 0x00;
Envie o comando CMD55(Validation)=0x69. O cartão deve responder 0x00.


Oi proex... Esse inicio ai me parece que resolveu...
estranho o fato de cada lugar falar de um jeito...massssss.. importante eh q ta funcionando.. valeu!

Leitura.

MensagemEnviado: 07 Mai 2010 18:42
por openavr
Ola , gostaria de saber se tem alguma diferença entre cartoes de 1GB e outros.

Estou agora tentando fazer a leitura e gravação nos SD cards. Porem estou com dificuldades. E depois de procurar muito pela net nao achei a informacao que precisava, talvez voces possam me ajudar.

No cartao de 256mb estou conseguindo gravar os dados. Mudei o tamanho do bloco para 0x10 bytes,adaptei o codigo e tudo funciona perfeitamente!

Porem no cartao de 1GB as coisas não vao bem. Utilizando o mesmo codigo fonte q funciona no SD256mb sempre que envio a sequencia de gravação:


Código: Selecionar todos
0x58,0x00,0x00,0x00,0x20,0x10,0xFF,0xFF <-- Host
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x40 <- SD 1GB


Segundo a documentação q tem na net R1 = 0x40 significa erro de parametros. Mas porque sendo que estou enviando corretamente os dados tanto que o cartao de 256mb aceita perfeitamente o comando?

No caso da leitura é mais estranho, pois o SD1GB aceita o comando e retorna o 0x00 ... e apos alguns clocks retorna 0xFE porem os dados lidos são sempre 0x00 ...O que acontece?
Ja testei varios de 1Gb q tenho aki e varios de 256mb e acontece exatamente a mesma coisa que falei.

Alguma dica? Estou arrancando os cabelos com isso, pois preciso usar neste projeto cartoes de 1GB.

Obrigado!


Aqui funcionou com blocos de 512 bytes.
Setando o CMD16 para blocos menores, não funciona.
Lendo os datasheets q encontrei na net, vi que somente cartões SDHC trabalham com o bloco fixado em 512bytes. Porem os cartões SDHC possuem 2GB pra mais... Se este cartao meu só aceita bloco de 512bytes e tem 1GB ele é um SDHC entao?
Existe algum modelo de cartao com 1GB que nao seja SDHC? Preciso trabalhar com cartoes dessa capacidade porem que deixe trabalhar com blocos menores... alguem conhece ou tem pra indicar algum modelo assim?
Valeu!

MensagemEnviado: 14 Mai 2010 11:56
por chipselect
cartões de 1G não são SDHC, pelo menos não todos os que eu testei (vários modelos da Sandisk, Danelec, Kingston, os que vem com celulares Nokia e afins...)

Apesar do cartão não ser SDHC e ser de 2G ou menos, ele não é obrigado a suportar qualquer tamanho de bloco para escrita. O comando que você usa para setar o tamanho do bloco deve retornar um erro caso ele não suporte esse tamanho.

O bloco de tamanho igual a 512 bytes é um valor que a maioria dos fabricantes parece suportar pelo simples fato de que a FAT trabalha com esse tamanho por padrão, logo, é o mais seguro a ser utilizado.

Acho que os cartões menores que 1G deve suportar bloco menor que 512 bytes, principalmente os modelos japoneses, porque lá no Japão foi bastante utilizado um padrão de sistema de arquivos que utilizava bloco de 256 bytes e era "compatível" com windows.

Tenta criar um bufferzinho de 512 bytes para trabalhar com esse tamanho de bloco.