Página 1 de 1

SD CARD

MensagemEnviado: 20 Jan 2014 22:35
por vtrx
Não tenho experiencia com SD card,estou tentendo entender umas rotinas que utilizam SPi e um cartão MINI de 4 Gigas.
A rotina que achei,usa UART e testei uma rotina que le a capacidade do cartão,o resultado é uma variavel de 32 bits(sd_size).
Na rotina original,que é Chinesa e não sei se esta correta,o resultado é mostrado da seguinte forma:
Código: Selecionar todos
   printf("\n\rSD Card Size: %ld  b\n\r",sd_size);


Isso me retorna "SD Card Size: -268435456 b"
Não parece correto.
Procurando na net,achei um trecho de código que parece que usa a mesma rotina,mas esta formatada assim:
Código: Selecionar todos
LCD_ShowNum(164,150,sd_size>>20,4,16);//显示SD卡容量


Apenas aproveirei a idéia e usei assim:
Código: Selecionar todos
   printf("\n\rSD Card Size: %ld  b\n\r",sd_size>>20,4,16);


Deste modo retornou;
SD Card Size: 3840 b

Esta ultima formatação esta correta?
Seria o retorno de 3.840 Gigas?

Re: SD CARD

MensagemEnviado: 20 Jan 2014 23:12
por cfreund
A variável está definida como unsigned, então utilize "%lu". E então, deverá imprimir: "4026531840"

Sim, está correto quando informa 3,8 GB, pois você fez shift para mostrar 12 MSB.

Retire o ",4,16". Não está fazendo nada além de ocupar espaço.

Re: SD CARD

MensagemEnviado: 21 Jan 2014 07:25
por xultz
Retire o ",4,16". Não está fazendo nada além de ocupar espaço.

O compilador não deveria ter dado erro por passar mais parâmetros que o necessário?

Re: SD CARD

MensagemEnviado: 21 Jan 2014 07:25
por vtrx
A variável está definida como unsigned, então utilize "%lu". E então, deverá imprimir: "4026531840"

Foi isso que acabei fazendo.
Como quase sempre programava a UART para enviar dados apenas,e em,ASM,não usava a fornatação,agora tiver que rever mas ja estou passando para usar LCD.
Obrigado.

Re: SD CARD

MensagemEnviado: 21 Jan 2014 07:55
por cfreund
xults,

Do jeito que está, não irá causar problemas na execução.

Apenas alguns poucos compiladores interpretam o texto de formatação e alertam sobre inconsistências. Só vi isso no Visual Studio.

Re: SD CARD

MensagemEnviado: 21 Jan 2014 21:35
por vtrx
Aproveitando,no KEil,estou precisando saber como transformar uma variavel u32 em String,seria para mostrar o valor acima no GLCD que ja tem a rotina que aceita char.
A frase é iniciado com;
Código: Selecionar todos
u8 Frase0[] = " SD CARD OK";

Iria mostar o valor de sd_size,que é Dword.


PS:Eu achei uma rotina para 16 bits e 'dobrei 'ela,deste modo funcionou,se alguem tivar algo mais interessante me de uma dica.

Código: Selecionar todos
void  DWordTOStr(u32 n,u8*str)   
 {
 u8 a[10];   
 u8 i,j;
 
 a[0]=(n/1000000000)%10;                       
 a[1]=(n/100000000)%10;                                         
 a[2]=(n/10000000)%10;                                         
 a[3]=(n/1000000)%10;                                           
 a[4]=(n/100000)%10;                                     
 a[5]=(n/10000)%10;                       
 a[6]=(n/1000)%10;                                         
 a[7]=(n/100)%10;                                         
 a[8]=(n/10)%10;                                           
 a[9]=(n/1)%10;     
 for(i=0;i<10;i++)   
  a[i]='0'+a[i];   
    for(i=0; a[i]=='0' && i<=3; i++ );                         
    for(j=0;j<i;j++)                           
        {*str=' '; str++;}                                 
    for(; i<10; i++)                                             
        {*str=a[i];str++;}             
       *str='\0';   
 }

Re: SD CARD

MensagemEnviado: 22 Jan 2014 04:39
por cfreund
Minha implementação:

Código: Selecionar todos
static const char base_key[16] = "0123456789ABCDEF";

char *ultoa_s(unsigned long val, unsigned char base, unsigned char width){
   static char buffer[33];
   unsigned char cnt;
   
   cnt = 32
   buffer[cnt] = 0;
   if((base >= 2) && (base <= 16)){
      do {
         if(width) --width;
         buffer[--cnt] = base_key[val % base];
         val /= base;
      } while(val && cnt);
      while(width-- && cnt) buffer[--cnt] = '0';
   }
   
   return (buffer + cnt);
}


Ex: strcpy(Frame0, ultoa_s(0xFAFAFAFA, 16, 0));

Re: SD CARD

MensagemEnviado: 22 Jan 2014 04:47
por cfreund
vtrx escreveu:
Código: Selecionar todos
u8 Frase0[] = " SD CARD OK";



Tenha em mente que o tamanho de "Frase0" é de 11 caracteres. Cuidado com buffer overflow.

Re: SD CARD

MensagemEnviado: 30 Jan 2014 14:44
por vtrx
Preciso continuar o aprendizado com SD CARD,e tenho algumas dúvidas sobre o uso da escrita/leitura sem OS.
Se alguem quiser ajudar,vou postar as dúvidas,mas dispenso críticas que não sejam feitas por algum ADM.

Re: SD CARD

MensagemEnviado: 31 Jan 2014 11:51
por vtrx
Via Email consegui implementar NTFS no SD,assunto encerrado.

Re: SD CARD

MensagemEnviado: 31 Jan 2014 17:12
por Rodrigo_P_A
vtrx escreveu:Via Email consegui implementar NTFS no SD,assunto encerrado.

Tem como compartilhar?