Página 1 de 6

Memória SD

MensagemEnviado: 07 Nov 2006 10:34
por fabiorike
Bom Dia

Eu tenho um cartão SD, igual esse de máquina fotográfica e eu gostaria de usa-lo junto com o AT89S8253, alguem sabe como é a comunicação desse cartão, se é SPI?

Obrigado

MensagemEnviado: 07 Nov 2006 12:17
por jeanfernandes
Bom se for SD card tudo bem, pois a sony tem os modelitos dela.

Seguinte :

É SPI sim, mas eu tentei usar a SPI do MCU com o slave controlado por mim e nao tive muito sucesso nao. Ai fiz na mao.

Mas na base, voce precisar de DATA IN/OUT, CLOCK, CHIPSELECT, Alimentacao .

Codigo ? Tem aos tufos na rede. Sugiro que de uma olhada no Design Contest 2005 da ARM no site da Circuit Cellar. Lá voce encontra um projeto que tem o codigo pronto claor que pra ARM, so que é a mesma coisa. No mais googla ae que voce acha bilhoes de codigo.

Se for usar pra R/W no setor direto eh simples. Caso queira montar uma FAT ai o negocio eh mais embaixo, mas nao tanto assim.....

Veja o que voce consegue e depois retorna aqui.
Dica : Interessante é voce estudar o timming do sdcard. La tem os graficos de acesso ao cartao. COnsulta Sandisk que voce pega.

Xau.
:D

MensagemEnviado: 07 Nov 2006 13:52
por fabiorike
boa Tarde

Eu queria apenas gravar dados neste cartão de memória e depois conseguir ler esses dados para escreve-los no display.
O q é FAT?
Abraços

MensagemEnviado: 07 Nov 2006 15:08
por andre_luis
Se for trabalhar com FAT, tecnicamente, o buraco é mais em baixo.
Além de que, como postado no fórum antigo, o FAT agora é patenteado.

+++

No principio era um disco vazio ... E o bill viu que era bom

MensagemEnviado: 07 Nov 2006 15:18
por Wagner de Queiroz
fabiorike escreveu:O q é FAT?


FAT (Gordo), File Allocation Table - Tabela de Alocação de arquivos.

é Um sistema de arquivos usados pelo sistema MS-DOS e MS-Windows da Microsoft.

Explico:

Cada setor do disco tem um endereço unico. A tabela fat é uma tabela onde cada setor tem um endereço associado. Caso seu arquivo aumente de tamanho, a fat procura um setor de disco livre para continuar o arquivo. Caso seu arquivo encolha ou seja apagado, as entradas necessárias na fat sao liberadas. Cada arquivo que voce cria no sistema, precisa estar gravado nos setores do disco. A fat sabe a localização exata de todos os dados gravados.


http://en.wikipedia.org/wiki/File_Allocation_Table

Este link fala melhor que eu.


Dica: Por seguranca o sistema mantem duas copias identicas da FAT

Voce só é obrigado a usar fat caso queiraler o cartao no windows. Com o assunto da patente e seu custo envorvido, ta na hora de aprender outro sistema de arquivo como EXT2 do linux, hehe
http://en.wikipedia.org/wiki/Ext4 Ae pessoal. Este aqui esta Fresquinho. Pra algum DOIDO que queira desenvolver algo usando este novo sistema de arquivos:
Em tempo: Este ext4 suporta discos com até 1024 petabytes (Na verdade nem sei quanto é isso, minha mente só chega a imaginar até TeraByte)

http://www.bullopensource.org/ext4/

MensagemEnviado: 07 Nov 2006 17:49
por Nightcrawler
andre_teprom escreveu:Além de que, como postado no fórum antigo, o FAT agora é patenteado.


Se não me engano, não pode-se formatar nesse formato, mas pode usar se já tiver formatado.

MensagemEnviado: 07 Nov 2006 18:41
por chipselect
pode-se usar livremente a FAT-16, desde que você não utilize LFN.
A FAT somente foi patenteada o recurso da LFN.

MensagemEnviado: 07 Nov 2006 18:42
por joe-adb
Cara, os cartões SD podem operar em dois modos:
-no modo SD
-no modo SPI

Por default, eles inicializam no modo SD, você tem que então configurá-lo para trabalhar no modo SPI. Eles são compatíveis (pelo menos teoricamente) com os cartões MMC.

Eu e um colega de trabalho nos batemos bastante pra conseguir fazer funcionar... mas realmente há bastante informação e códigos prontos na internet.

No caso do AVR, existe uma biblioteca chamada procyon que tem um módulo para se trabalhar com os cartões MMC (que são compatíveis, até certo ponto, com os SD) e que implementa FAT também.

Aliás, procurando códigos-exemplo, o que eu mais achei foi para AVR mesmo.

Procure no site da SanDisk o datasheet dos cartões MMC e SD deles... eles têm todos os comandos e explicam em detalhes o funcionamento dos cartões.

Qualquer problema (o que eu creio que vai ser comum, sem querer desestimular) avisa...

MensagemEnviado: 07 Nov 2006 18:49
por joe-adb
jeanfernandes

Agora que li sua resposta cara, fiquei interessado (porque também sofri com o bichinho). Que tipo de problemas você teve?

E o que você quis dizer com "fiz na mão"? Ao invés de usar o SPI por hardware do micro, você emulou um SPI por software?

Eu quase apelei pra isso, mas consegui fazer funcionar (catando informação em fóruns aqui e ali pra complementar o datasheet da SanDisk) "meia boca" -> ele escreve sem problemas mas às vezes ele lê errado, ele lê uns 3 a 4 bytes certos e daí recebe 0x0F, 0x04... mais três ou quatro bytes corretos, e 0x0F, 0x04... sempre nesse padrão... Como tinha outras coisas pra fazer, assumi que estava "funcionando com um pequeno bug" e deixei para depois... você teve algum problema similar?

E se emulou o SPI por software, apenas isso resolveu? Porque pegando o sinal da SPI pelo osciloscópio, aparentemente tá tudo certinho, o cartão que responde de forma maluca (e isso ocorre com todos os 4 cartões que eu testei: 2 da Kingston, 1 da Canon e 1 made in Paragua ... nem lembro a marca).

Você tentou usar tamanhos de bloco diferentes de 512 bytes? Eu li em algum fórum que a maioria dos cartões SD não responde bem se o bloco não for de 512 bytes... mas li tanta informação contraditória que tava difícil saber em quem acreditar (inclusive na sequencia de inicialização do cartão eu tô usando um comando que no datasheet consta como reservado, mas que eu vi num fórum e realmente só com esse comando pro bichinho começar a responder... se não me engano é o CMD8... ou CMD58... não lembro de cabeça agora).

MensagemEnviado: 07 Nov 2006 20:56
por jeanfernandes
KKKKK vamo ser prolixos ne
o cara so quer varar o setor e sair dele...bixo eu vou ver o que te arrum ode link...

LFN - Long File Names, o FAT16 so permite 8 chars para nome + extensao....o LFN usa setores escondidos pra aumentar o nome do camarada.....

Vou ver o que faço eheheheheehehe

MensagemEnviado: 08 Nov 2006 14:15
por fabiorike
Gente,

Eu só quero conseguir escrever no Sd card e depois ler este dado, mas eu não estou entendendo como eu posso fazer isso?
Gostaria de ukma luz apenas um exemplo de escrever um caracter já é o bastante.

Me ajudem.

Obrigado

MensagemEnviado: 08 Nov 2006 20:52
por joe-adb
Bom, eu acho que ninguém leu o que eu escrevi..

Eu comentei que no Google você encontra toneladas de exemplos, inclusive mencionei a Procyon AVR Lib ...

Mas já que você quer tudo pronto e só porque eu tô de bom humor, vou postar os links aqui. Como você vai poder perceber pelos códigos, é basicamente uma receitinha de bolo usando uma sequência de comandos para a inicialização e configuração do cartão (CMD0, CMD55, ACMD41 - para SD Card ou CMD1 - Para MMC Card), e depois existe um comando para escrita de um bloco inteiro (CMD24) e outro para leitura de um bloco inteiro (CMD17) (assumo que a parte do SPI você sabe como fazer), lembrando que segundo o datasheet você pode setar o tamanho do bloco, embora o padrão (e pelo que vi em comentários na internet, o mais aconselhável) seja o tamanho de 512 bytes:

-Exemplo bem simples, para compilador CCS para PIC:
http://www.microchipc.com/sourcecode/#mmc

-Um projetinho para MSP430
http://www.true-random.com/homepage/pro ... index.html

-Projetinho bem básico também para AVR (e com link para o mesmo projeto usando PIC)
http://www.captain.at/electronic-atmega-mmc.php

-A biblioteca Procyon AVR Lib que eu mencionei (ela tem a interface com cartão MMC/SD nos arquivos mmc.h e mmc.c e se você quiser ir além, ela implementa também sistema de arquivos FAT nos arquivos fat.h e fat.c)
http://hubbard.engr.scu.edu/embedded/avr/avrlib/

-Projeto completinho, para AVR
http://www.roland-riegel.de/sd-reader/index.html

Espero que isso te ajude, fabiorike....


jeanfernandes, não entendi sua resposta, você chegou a ler o que eu te perguntei? Tive alguns problemas justamente tentando ler um bloco (512 bytes), recebendo sempre 3 ou 4 bytes corretos (que eu tinha acabado de escrever) e depois um byte 0x0F e outro byte 0x04, mais 3 ou 4 bytes corretos, e novamente os danados 0x0F, 0x04... seguindo esse padrão até o fim do bloco. Você tem idéia do que possa ser? E mais importante que isso, como resolver? hehe

MensagemEnviado: 09 Nov 2006 10:54
por fabiorike
Então o q eu fiquei com dúvida é como eu sei esses códigos, por exemplo:
para CMD0
if (Command(0x40,0,0,0x95) !=1)

Como eu sei que é 40h e 95h, e para escrever é 58h e assim por diante? Está no datasheet ? Pois eu li uns artigos do Sd e não vi nada. Eu queria entender para quem sabe fazer em assembler, hehe. Pois eu já fiz rotinas para display e teclados em assembler teria que mudar tudo para poder usar este cartão.
Obrigado

MensagemEnviado: 09 Nov 2006 15:47
por joe-adb
fabiorike

As informações detalhadas das sintaxes dos comandos e respostas do cartão SD você encontra no datasheet do cartão.
Eu usei o datasheet do cartão da SanDisk
(http://www.sandisk.com/Oem/Manuals/), já que não consegui encontrar o datasheet do cartão da Kingston, com o qual eu trabalhei durante a maior parte do desenvolvimento.
Creio que seja possível também baixar a especificação do padrão SD e MMC dos respectivos sites das organizações (SD: http://www.sdcard.org / MMC : http://www.mmca.org/home )

Só para lembrar (mais uma vez), o cartão SD é compatível com o cartão MMC e ambos trabalham em dois modos: no modo SPI (que é o que a maioria do pessoal que faz interface com microcontrolador usa, para aproveitar o periférico presente em grande parte dos microcontroladores) ou no modo SD/MMC...

Eu assumo que você vai usar o modo SPI (é o mais fácil) e sabe trabalhar com a SPI do seu micro...

Os comandos que você envia geralmente têm o mesmo número do seu mnemônico acrescidos de um ou com 0x40 (por exemplo, CMD0 = 0x00|0x40 = 0x40... CMD1 = 0x01|0x40 = 0x41), alguns comandos têm argumentos e todos têm que terminar com o envio do CRC (em alguns comandos é obrigatório enviar o CRC correto - no caso do CMD0, é 0x95 - mas o CRC pode ser desabilitado depois do CMD0 ou CMD1, não lembro agora de cabeça - mas está detalhado no datasheet, e daí basta enviar 0xFF ao invés de ter que calcular o CRC correto).
Para cada comando o cartão irá enviar uma resposta... no caso de ser um comando de leitura, após a resposta, ele enviará um pacote de dados, que inicia sempre com um data token (0xFE) seguido pelos dados propriamente ditos e depois pelo CRC.


Se você quer fazer em Assembly não há problema nenhum, inclusive existem códigos de exemplo em Assembly disponíveis na net também. Dependendo da sua familiaridade com o Assembly do seu processador, vai dar o mesmo trabalho que fazer em C (mas eu aconselharia a tentar fazer em C, por questão de elegância e portabilidade).

MensagemEnviado: 10 Nov 2006 09:00
por fabiorike
Bom Dia joe-adb

Eu não encontrei exemplos em assembler, vc sabe de algum site?
Obrigado