Memória SD

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Mensagempor fabiorike » 22 Nov 2006 08:55

Bom Dia

É preciso gravar no bloco todo,isto é, 512 bytes, para depois eu conseguir ler, eu queria primeiramente gravar um caractere só para testar será que vai funcionar?

Obrigado
fabiorike
Bit
 
Mensagens: 46
Registrado em: 16 Out 2006 10:32

Mensagempor chipselect » 22 Nov 2006 12:23

é preciso gravar o tamanho do bloco que você definiu no cartão.

Caso esteja trabalhando com tamanho de bloco de 512 bytes, tem que gravar os 512 bytes, para ficar compatível com a maioria dos cartões SD.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabiorike » 22 Nov 2006 14:17

Boa Tarde Chipselect
Obrigado pelas dicas.
Quando eu mando o CMD0 o cartão está retornando 00h, quando mando CMD1 ele tbm retorna 00h, a escrita CMD24 ele retorna 00h, mas ele não esta conseguindo ler.
EU achei estranho que ele só retorna 00h. O q será q pode estar errado
Me ajude
Obrigado + uma vez
fabiorike
Bit
 
Mensagens: 46
Registrado em: 16 Out 2006 10:32

Mensagempor chipselect » 22 Nov 2006 23:02

boa noite Fabio

Quando você manda um comando pro SD, ele devolve uma resposta, que pode ser do tipo R1 (1 byte) ou R3 (5 bytes).

A maioria dos comandos devolvem R1, o CMD58 devolve R3.

O fato de vc estar recebendo 0x00 (00h) indica que não ocorreu erro, a não ser que você não tenha colocado os resistores de pull-up no circuito.

O formato da resposta R1 é (flag em bits):
[0 (zero) ] - bit mais significativo
[erro nos parâmetros]
[erro de endereço ]
[erro ao apagar ]
[erro de CRC ]
[comando inválido ]
[ "Erase Reset" ]
[ Iddle State ] - bit menos significativo


Algoritmo básico pra leitura (sem timeout, etc...)
[code]
resposta=SD_send_cmd(SD_CMD17,setor << SD_BLOCKSIZE_NBITS, NULL);
SD_cs_on();
do
{
tmp = SD_get_byte();
i++;
}while ((tmp != 0xFE) ); //espera pelo token de inicio
if ((tmp & SD_MSK_TOK_DATAERROR) == 0)
{
//o cartão retornou erro, toma providência e sai fora
return erro;
}

//se o cartão não retornou erro, lê o bloco de dados inteiro (no meu caso, 512 bytes)
SD_SPIRead(data,SD_BLOCKSIZE);//lê 512 bytes da SPI
SD_SPIRead(checksum,3);//lê 3 bytes da SPI
SD_cs_off();
[/code]
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabiorike » 23 Nov 2006 08:49

Bom Dia ChipSelect tudo bem.

Só uma outra perguntinha heheh, eu posso ligar direto o cartão SD no controlador com 5V ou tenho que por um resistores para diminuir a tensão para + ou - 3V.
Obrigado
fabiorike
Bit
 
Mensagens: 46
Registrado em: 16 Out 2006 10:32

Mensagempor proex » 23 Nov 2006 11:04

Alguns comentários de quem ja usou SDCARD com Microcontrolador:

Dependendo do porte do MCU, esqueçam formataçao tipo FAT 16 se o cartao nao for fazer troca de dados entre o seu microcontrolador e um computador PC.

O programa fica muito grande, complexo e perde muito tempo pra tratar o FAT16.

Mas e o seu cartao for para trocar dados entre MCU e PC, use um MCU mais potente e com bastante memoria de programa.

Nao existe muitos exemplos de codigos para SDcard com microcontroladores tipo PIC ou 8051.


Os poucos que encontrei (2) continham bugs e nao funcionaram.

Tive que fazer as minhas próprias rotinas, em assembler para PIC.

Como meu projeto se trata de um gravador de voz para linha telefonica, e nao exige interface com PC, nao precisei usar formataçao tipo FAT16.

Por default, o cartão SD vem configurado como uma memoria dividida em setores de 512 bytes.

No meu caso especifico, para conseguir gravar ou ler sequencialmente, precisei usar o comando MULTIPLE BLOCK READ e MULTIPLE BLOCK WRITE.

Durante esses processos, vc precisa tomar muita atençao no endereçamento correto de cada bloco, senao o cartao fica bobo.

Dá um bom trabalho.

Depois de terminar o projeto, descobri que poderia configurar o cartao como uma memoria linear e gravar byte á byte sequencialmente, sem me proocupar com blocos ou setores.

As informaçoes encontradas na net sobre SDcard são confusas.

O datasheet da Sandisk é horrivel e gera mais duvidas ainda com relaçao ao modo de inicializaçao e funcionamento do cartao.

Muitas coisas descobri durante a briga com o cartao em cima da bancada.

Vc nunca deve alimentar o cartao com 5V, e sim com 3V3.

No meu caso, o proprio PIC foi alimentado com 3V3. Entao nao precisei usar esses resistores.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor chipselect » 24 Nov 2006 10:05

Fabio

A maioria dos SD podem operar até no máximo com 3,6V. Não use divisor resistivo pra gerar 3,3V pq vc vai ter muita dor de cabeça com isso.

Caso você queira utilizar o SD para trocar informações com o PC em um microcontrolador bixado, existe alguns recursos que você deve lançar mão.

O método mais simples é você utilizar apenas um arquivo no SDCARD. Assim você conseguirá escrever no cartão com MCU e ler no PC depois, sem sequer implementar uma linha de código de FAT-16.

Você precisa para isso:
- configurar o tamanho de bloco para 1 byte (CUIDADO: não são todos os cartões SD/MMC que suportam isso!)
-No PC, você formata o cartão, cria um único arquivo enorme nele contendo uma string logo no inicio, que seria a marcação pro mcu localizar. Essa marcação poderia ser a string ":\inicio".
- quando o MCU inicia o cartão, ele varre todos os blocos do cartão (em sequencia) procurando a string de marcação inicial. Uma vez encontrada, o MCU sabe que a partir daquele endereço de bloco ele pode escrever que estará dentro do arquivo ainda e não irá corromper a FAT-16.

Esse método funciona bem e não irá corromper a FAT-16 desde que você não escreva além do limite do arquivo. Uma vez formatado ou com o cartão "limpo", quando um arquivo é criado, todos os seus clusteres estarão em sequencia no cartão. Então basta encontrar o primeiro setor que é onde tá escrito a string de inicio.

Eu sugiro criar um arquivo com o tamanho máximo possível no cartão.

A vantagem é que você não escreve uma linha de código de FAT-16, mas as desvantagens são:
- lento, pois tamanho de bloco de 1 byte deixa o pacote com um overhead desfavorável.
- não será compatível com todos os cartões SD.
- Como o cartão SD utiliza memória FLASH, escrever 1 byte muitas vezes significa escrever um bloco interno inteiro da flash (geralmente de 4K), logo, se você fizer uma escrita byte a byte, quando tiver preenchido os primeiros 4K, toda essa área já terá sido gravada 4 mil vezes. Se você considerar que os fabricantes geralmente especificam 100 mil gravações, você tem ai um pequeno problema de vida útil.

O tamanho de bloco de 1 byte pode até ser maior, caso seu MCU tenha memóiria ram suficiente pra gerenciar isso e o SD aceite o tamanho.



Proex, como é esse seu método de acesso linear do SD? Isso eu não conhecia, só conheço tamanho de bloco = 1 byte e o modo de memória dos Compact Flash
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor proex » 24 Nov 2006 13:03

Para tratar o cartao como uma memoria linear vc deve setar o bit WRITE_BLK_MISALIGN no registrador CSD.

Assim vc pode ler ou gravar partindo de qualquer posiçao desejada, sem ter que partir obrigatóriamente do inicio de um bloco.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor fabiorike » 04 Dez 2006 09:49

Bom Dia

A unica coisa que eu quero é gravar uma frase no Sd e depois escrever esta frase em um display (grafico ou lcd). Sem utilizar PC algum.
Obrigado
fabiorike
Bit
 
Mensagens: 46
Registrado em: 16 Out 2006 10:32

Mensagempor fabiorike » 04 Dez 2006 16:49

Mas como eu posso alimentar o SD sem usar os resistores ja que a saida do controlador é de 5V e tem de ser 5V para alimentar o display?
Obrigado
fabiorike
Bit
 
Mensagens: 46
Registrado em: 16 Out 2006 10:32

Mensagempor lucflores » 04 Dez 2006 18:25

voçê pode colocar um regulador somente para o SD a Anolog e a texas tem reguladores nessa faixa de tensão, ou você pode usar ate o LM317 e ajustar essa tensão, so tem que ver se existe lm317 de tamanho pequeno.
lucflores
Nibble
 
Mensagens: 90
Registrado em: 16 Nov 2006 15:39

Mensagempor chipselect » 04 Dez 2006 23:07

para ligar os sinais do SD ao 8051 você pode usar portas não inversoras com saída em coletor ou dreno aberto e resistores de pull-up para 3.3V, como o 74HC07.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabiorike » 07 Dez 2006 14:37

boa Tarde

Não consigo fazer este cartão SD funcionar, antes ele ate respondia e o controlador lia o 00h, mas agora eu mando a instrução CMD0 e o cartão responde mas nada acontece o controlador nao receber ou recebe outra coisa, mas o pulso no port esta lá.

minha rotina para o controlador receber o byte (SPI)
recepcao:
mov A,SPSR
anl A,#SPIF
jz recepcao
mov A,SPDR
ret
me ajudem
fabiorike
Bit
 
Mensagens: 46
Registrado em: 16 Out 2006 10:32

Mensagempor fabiorike » 08 Dez 2006 10:16

Bom Dia

Só uma perguntinha, vcs controlam a alimentação do SD pelo controlador?
ou vcs ligam o SD direto no 3V3 e deixa ele ligado?
obrigado
fabiorike
Bit
 
Mensagens: 46
Registrado em: 16 Out 2006 10:32

Mensagempor Viktor » 08 Dez 2006 10:46

Aqui você encontra tudo pronto : http://elm-chan.org/fsw/ff/00index_e.html
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33

AnteriorPróximo

Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

cron

x