Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC

la escritura la realizastte a nivel logico o a nivel fisico, la computadora solo reconose nivel logico para lo cual tendrias que escribir en la sd atravez de fat
 
gracias, estuve revisando y ni siquiera inisializa me fije bien las tensiones que tenia y si, son las correctas asi que eso no es, entonces debe ser algo del soft, tenes idea de como se maneja la frecuencia del clk usando spi por software??? gracias sbl
 
la frecuencia del spi la tienes que configurar en el segundo byte, despues de inicializarlo puedes alterar ese byte y configurarlo a mayor velocidad dependiendo del pic que utilises.
 
mmm la verdad que no te entiendo, mira, yo lo que hago para configurarlo es esto(aclaro que la simulacion anda bien)
#include <16f84a.h>
#fuses HS,NOWDT
#use delay(clock=10M)
#use spi(master,di=pin_a0,do=pin_a1,clk=pin_a2,bits=8,baud=9600)


void main(){
//instrucciones funciones etc
//en lugar del spi_write uso spi_xfer(funcion que se usa cuadno se implementa spi por software)
}



lo que nose es con que frecuencia estaria trabajando el clk del spi que implemento.. espero haberme explicado bien
 
la verdad con un f84 no me funciono utilise un f873 y logre inicialisar una SD standar, me puedes dar tu codigo para revisarlo a simple vista veo que debes de moodificar
aud=9600 por una mayor lo cual debe darte mayor velocidad pero el limite no sabria darte
 
que diferencias hay entre usar una sd comun y una micro sd con su adaptador?
#include <16f84a.h>
#fuses HS,NOWDT
#use delay(clock=10M)
#use spi(master,di=pin_a0,do=pin_a1,clk=pin_a2,bits=8)


int sd_init(){ //funcion de reset e inicializacion

int8 i;
output_high(pin_a3); //desactivo la sd
for(i=0;i<10;i++){
spi_xfer(0xff); //sincronizacion con sd que se le envian 80 ciclos de reloj, esto lo he leido
} // en un foro
output_low(pin_a3); //activo la sd
spi_xfer(0x40);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x95);
while(i!=0x01){
i=spi_xfer(0xff); //espero respuesta al cmd0
output_high(pin_b1); //asi me avisa que esta esperando la respuesta
}
output_low(pin_b1);
//una vez que obtuvo la respuesta...
output_high(pin_a3);
output_low(pin_a3);
spi_xfer(0x41);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x01);
while(i!=0x00){
i=spi_xfer(0xff);
output_high(pin_b1);
}
output_low(pin_b1);

return 1;


void main(){
setup_tris_b(0x00);

sd_init();

}






bien, ese es el programa que estoy utilizando, lo interesante es que en la simulacion anduvo de maravillas, pero en la tarjeta real no hay caso no responde

bien estuve revisando mi programa completo y mi plaqueta y llegue a la conclucion de que la inicializacion la hace bien, el problema viene en la escritura de la tarjeta, alguna recomendacion acerca del sistema fat? la verdad nose nada de eso y lo que he encontrado no me ha ayudado mucho que digamos jejeje alguien que me diga como funciona asi intento con eso escribir la tarjeta.. muchisimas gracias enseguida les adjunto mi funcion de escritura para ver si encuentran uds algun error en lo que estoy haciendo muchisimas gracias

funcion de escritura( hecha por mi, haber si porfavor me ayudan a descubrir los errores....)

int escritura(){
int8 i;
spi_xfer(0x58);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x00);
spi_xfer(0x01);
while(i!=0x00){
i=spi_xfer(0xff);
output_high(pin_b1);
}
return 1;
}




esta funcion es parte de mi codigo anterior

lo que nececito saber es que moco me estoy mandando????muchas gracias
 
Última edición:
la verdad yo me rifiero a si estas utilizando una tarjeta de 1GB o micro sd de 4GB ya que la de 1GB es SD pero la de 4GB es SDHC con respecto a la secuencia que envias revisaste en la hoja de de datos de las tarjetas SD si mal no recuerdo son mas codigos los necesarios para una adecuada inicializacion.
 
la verdad estoy utilizando una micro-sd de 128MB con un adaptador supongo que es factible el proyecto con esa tarjeta, con respecto a la informacion solo he leido lo que encontre en internet el unico datasheet sobre las sd que tengo esta en ingles lo cual mucho no manejo pero me voy a poner a estudarlo bien en estos dias, muchisimas gracias x tu ayuda sbl, voy a estudiar esa informacion y a revisar lo que me dijiste, gracias
 
Última edición:
eldo te recomiendo que utilises esta secuancia
clok los 80pulsos
reset CMD0 reseteo de tarjeta
mdSPI CMD1 mado spi de trabajo
bloqdt CMD16 dimencion de bloq de datos
y recien despues de esto utiliza cualquier otro comando que quieras, esta secuencia me sirvio hasta una tarjeta de 2GB en modo SPI a 4 hilos DI-DO-CLK-CS

qui una imagen de la secuencia para SD y SDHC
 

Adjuntos

  • IMG_1.jpg
    IMG_1.jpg
    53.1 KB · Visitas: 81
Última edición:
bueno, despues de un gran esfuerzo logre que la tarjeta inicialise, pero todavia no logro que me responda al cmd24 para escribirla alguien tiene alguna funcion implementada en c para eso? muchas gracias
 
la forma para escribir es enviar el comando esperar la respuesta que tarda unos 6 byte luego enviar FE y el bloque de datos de acuerdo al tamaño que fijaste con CMD16.
 
bien, esto es lo que hice, envie el cmd24 despues de enviar el cmd16, me responde con 0x00, envio 0xfe mas los 512 bytes de ahi espero la respuesta (0x05) pero esta nunca llega, que sugieren?
 
#include <16f84a.h>
#fuses HS,NOWDT
#use delay(clock=10M)
#use spi(master,di=pin_a0,do=pin_a1,clk=pin_a2,bits=8)
#use rs232(xmit=pin_b0,rcv=pin_b1)

int1 cmd(int8 byte1,int32 arg,int8 crc,int8 resp){
int8 i;
int16 j=0xffff;
spi_xfer(byte1);
spi_xfer(make8(arg,3));
spi_xfer(make8(arg,2));
spi_xfer(make8(arg,1));
spi_xfer(make8(arg,0));
spi_xfer(crc);
while(i!=resp){
i=spi_xfer(0xff);
j--;
if(j==0) return 0;
}
return 1;
}

int1 sd_init(){
int8 i;
output_high(pin_a3);
for(i=0;i<10;i++){
spi_xfer(0xff);
}
output_low(pin_a3);
if(cmd(0x40,0,0x95,0x01)==0){
return 0;
}
if(cmd(0x41,0,0xff,0)==0){
return 0;
}
if(cmd(0x50,0xff,0xff,0)==0){
return 0;
}
return 1;
}


int1 sd_escribe(int32 dir){
if(cmd(0x58,dir,0xff,0x00)==0){
return 0;
}
return 1;
}


void main(){
int16 i, j=0x000f;
int32 direccion=0;
if(sd_init()==0){
printf("no se puedo inicializar tarjeta/n");
}
else{
printf("tarjeta inicializada /n/r");
}
output_high(pin_a3);
delay_ms(100);
output_low(pin_a3);
if(sd_escribe(direccion)==0){
printf("no se pudo escribir /n/r");
}
else{
spi_xfer(0xfe);
for(i=0;i<256;i++){
spi_xfer('e');
}
spi_xfer(0xff);
spi_xfer(0xff);
while(i!=0x05){
i=spi_xfer(0xff);
j--;
if(j==0) printf("error al escribir en direccion %Lu /n",direccion);
}
direccion++;
}
}

ese es mi codigo, el que estoy usando actualmente, el problema que tengo es que nunca llega la respuesta 0x05 despues de enviar los 512 bytes alguna sugerencia?
 
Última edición:
eldo si mal no veo en tu programa solo veo que envias 255 byte no 512 o caso contrario podrias ser mas explicativo con tu programa y no lo peges ahi lo buelves muy largo adjuntalo como un txt.

else{
spi_xfer(0xfe);
for(i=0;i<256;i++){ --- solo veo que envia 255 byte
spi_xfer('e');
}
 
Si, es que setee en el cmd16 como 256 bytes los que fi¡orman un bloque de todos modos si aun seteandolo como 512 buytes no funciona y disculpa por lo del codigo no me di cuenta de adjuntarlo se me paso..
 
Última edición por un moderador:
saludos a todos ustedes bueno yo estoy empezando a programar en C de CCS pero para esto ya he estado buscando mucha informacion y poco a poco voy comprendiendo
Eldo queria preguntarte hacia donde diriges tu CS de la memoria a PIN_a3 ?

gracias de antemano
 
hola consulta de antemano mis amigos foreros ¿alguien ha bajado los ejemplos de paloky , jaiser , kike entre otros y ha corrido bien los archivos *.c?
lo que pasa es que yo los baje sin embargo corren en proteus 7.5 pero cuando voy a analizar el codigo en *.c con el programa PIC C Compiler (pcw.exe) me sale errores al momento de compilar espero que alguien lo haya bajado y lo este usando para que me oriente un poco acerca de en donde estoy fallando
PDt: todo lo estoy haciendo de manera virtual , no tendra alguien un codigo facilito de entender ??? gracias salu2
 
Última edición:
oye voy a haceer un proyecto q para nada va a usar el pc, requiere mucha memoria y pensé en las 32 GB de la sd, solo necesito 8 pero bueno.
mirando encontré tú aporte y quería preguntarte, q tanto has avanzado, y ps la idea mia es no trabajar con pic sino con fpgas, pero te voy a pedir un favor, me podrías rotar los pcbs con pic y tu codigo, o almenos los esquematicos, pa montar tu ejemplo y adecuarlo a fpgas, no me conecto mucho asi que si te quedan dudas de lo que te solicito, es unicamente el pcb ya sea en eagle o la foto de los pines gracias

Ola amigo, a mi me interesa lo del socket, dame por fa info relativa a el para comprarlo

amigo, me podrias pasar los esquematicos y el firmware, te lo agradeceria mucho
 
Última edición:
hola amigos, gracias por sus aportes y comentarios, les cuento que tengo un problema, he logrado grabar datos en la SD pero cuando pasa un cierto tiempo, unos 20 segundos o más falla la grabación, ingreso la memoria al pc y me pide formatearla
a alguno de uds le ha sucedido
Gracias
 
hl resisaste tu codigo posiblemente en algun punto hay un error q origine q se baya a escribir en el sector0 lo cual borra la parte principal de la sd y este pierde el formato revisa tu temporisadores y la cuenta de tus secores a escribir
 
Atrás
Arriba