TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Suky en 02 de Octubre de 2009, 15:22:22

Título: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 02 de Octubre de 2009, 15:22:22
Creo/modifico este hilo para comenzar de forma ordenada la presentación de la librería para manejo de memoria SD Card a nivel hardware adjuntada en microSD por puerto SPI del micro 18f4550  (http://www.todopic.com.ar/foros/index.php?topic=28403.0) . Presentándola y dando un pequeño resumen de lo que se trata, dado que he recibido varios MP con preguntas similares que podremos tratar en este hilo.




Introducción
En muchas aplicaciones de sistemas embebidos es necesario almacenar grandes cantidades de datos en donde las memorias seriales EEPROM son insuficientes, además de que no son portables y leerlas en una computadora requieren de un hardware adicional. En este caso el uso de las memorias flash (SD/MMC) nos brinda una gran ventaja, otorgándonos gran capacidad de almacenamiento, una interface física/eléctrica sencilla y gran disponibilidad en el mercado a costos reducidos.
Estas memorias poseen dos maneras de comunicación, la estándar denominado BUS SD que utiliza 4 líneas paralelas para la comunicación (1 Nible de ancho de bus) y comunicación serial SPI. Es esta última forma de comunicación la razón por la cual es sencillo utilizarlo en sistemas embebidos, donde la mayoría de los microcontroladores disponen de interface SPI.
Pin-out memorias SD/MMC.
(http://img686.imageshack.us/img686/6779/pinout.jpg)

Hardware mínimo para su utilización.

(http://img19.imageshack.us/img19/4205/esquematico.png)

Librería a nivel hardware.
Esta librería esta creada a partir de las especificaciones de las memorias SD de Scandisk (http://www.cs.ucr.edu/~amitra/sdcard/ProdManualSDCardv1.9.pdf). Con la ésta se puede inicializar la memoria en modo SPI, escribir/leer sectores de la misma (512 Bytes), leer los registros CSD y CID.
Envío de comandos y respuestas.
Los comandos tienen un tamaño fijo de 6 bytes, donde el formato es el siguiente:
(http://img7.imageshack.us/img7/3383/commandosformato.jpg)
Comandos y argumentos utilizados:
(http://img685.imageshack.us/img685/5504/comandosdisponibles.jpg)
Vemos que al utilizar estos comandos solo vamos a recibir respuesta del tipo R1 y R1b:
(http://img19.imageshack.us/img19/6905/respuestar1.jpg)

RB1 es idéntica a R1, solo que luego de recibir la respuesta hay que esperar condición de memoria desocupada en donde la línea SDO de la memoria se lleva a nivel de 0 lógico.
(http://img69.imageshack.us/img69/4753/commandos.jpg)
Función que envía comando y espera respuesta:
Código: C
  1. /** \brief Envia comando a memoria SD.-
  2.    
  3.    \param cmd: Comando a enviar.-
  4.    \param arg: Argumento del comando.-
  5.    \return res: Respuesta al comando.-
  6.    \return  0 a ocurrido algún error, 1 todo ok.-
  7. */
  8. int1 SDCard_send_command(int cmd, int32 arg,int& res){
  9.  
  10.    int Trama[6]; // Comando, Argumento y CRC
  11.    int i,ResTmp;
  12.    // Construimos el paquete a enviar.-
  13.    Trama[0] = cmd | 0x40;
  14.    Trama[1] = make8(arg, 3); // (arg>>24);
  15.    Trama[2] = make8(arg, 2); // (arg>>16);
  16.    Trama[3] = make8(arg, 1); // (arg>>8);
  17.    Trama[4] = make8(arg, 0);// arg;
  18.  
  19.    if(cmd==0){
  20.       Trama[5]=0x95;
  21.    }else{  
  22.       Trama[5]=0xFF;
  23.    }
  24.    // Enviamos clock para sincronizar envio.
  25.    for( i=0;i<16;i++) spi_xfer(SDCard,0xFF);
  26.    // Transfiere el paquete.-
  27.    spi_xfer(SDCard, Trama[0]);
  28.    spi_xfer(SDCard, Trama[1]);
  29.    spi_xfer(SDCard, Trama[2]);
  30.    spi_xfer(SDCard, Trama[3]);
  31.    spi_xfer(SDCard, Trama[4]);
  32.    spi_xfer(SDCard, Trama[5]);
  33.      
  34.    //  Se espera respuesta R1
  35.    i=0;
  36.    do{
  37.       ResTmp=spi_xfer(SDCard,0xFF);
  38.       i++;
  39.    }while((ResTmp&0x80)!=0 && i<200);// mientras no corresponda con 0xxxxxxx.-
  40.    if(i>=200){SDDeselect();return(0);}
  41.    res=ResTmp;  
  42.    return(1);
  43. }

Inicialización en modo SPI:
Al iniciar la memoria se establece en modo SD. Para entrar en modo SPI se debe enviar el comando CMD0 con el pin CS a 0V, si la memoria reconoce que petición de cambio de protocolo responde con la respuesta R1.
Luego de haber fijado el protocolo SPI procedemos a encender la memoria y configurar algunos parámetros de trabajo, como largo del bloque para lectura y escritura, fijar modo CRC, etc.


NOTA: Por aquí una versión actualizada para SD Card HC : http://www.todopic.com.ar/foros/index.php?topic=27786.msg300924#msg300924

Código: C
  1. /** \brief Inicialización de SD Card
  2.  
  3.    \param Ninguno
  4.    \return 1 si se ha iniciado correctamente, 0 caso contrario.
  5. */
  6. int1 SDCard_init(void){
  7. int i,Respuesta;
  8.    
  9.    SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_16|SPI_H_TO_L|SPI_XMIT_L_TO_H );
  10.  
  11.    output_high(SD_CS);
  12.    delay_ms(20);
  13.    for(i=0;i<20;i++) spi_xfer(SDCard,0xFF);   // Para sincronización.
  14.    output_low(SD_CS);
  15.    delay_ms(20);
  16.    i=0;
  17.    do{
  18.       if(SDCard_send_command(CMD0,0x00,Respuesta)==0){
  19.          return(0);        // Si se recibe 0 error por timeout.-
  20.       }else{i++;}  
  21.    }while(((Respuesta&0x01)==0x00) && i<200);
  22.    if(i>=200){return(0);} // Timeout esperando desactivación de SD Card.
  23.    // Pasamos a esperar condición de SD Card activa.
  24.    // Si R1=0x01, SD Card en estado desactivado.
  25.       i=0;
  26.    do{
  27.       if(SDCard_send_command(CMD1,0x00,Respuesta)==0){
  28.          return(0);     // Si se recibe 0 error por timeout.-
  29.       }else{i++;}
  30.    }while(((Respuesta&0x01)==0x01) && (i<100)); // Mientras se reciba R1=0x01
  31.    if(i>=100){return(0);} // Timeout esperando activación de SD Card.
  32.    
  33.    // Se fija largo del bloque lectura/escritura.
  34.    if(SDCard_send_command(CMD16,BLOCK_SIZE,Respuesta)==0){
  35.       return(0);
  36.    }else if(Respuesta!=0){
  37.       return(0);
  38.    }
  39.    // Se desactiva CRC.
  40.    if(SDCard_send_command(CMD59,0,Respuesta)==0){
  41.       return(0);
  42.    }else if(Respuesta!=0){
  43.       return(0);
  44.    }
  45.    SDDeselect();
  46.    return(1);
  47. }



Post modificado para evitar crear uno nuevo con el mismo tema.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 08 de Enero de 2010, 21:29:37
Operaciones de escritura y lectura.

Las operaciones de lectura y escritura se realizan enviando el comando correspondiente junto a la dirección del primer byte del bloque con el largo indicado anteriormente (Comando CMD16). El largo del bloque puede ser desde 1 hasta 512, y no esta permitido realizar operaciones en dos sectores a la vez, ósea que si el largo de bloque fijado en CMD16 es 512 la dirección para realizar lectura o escritura debe ser la del byte inicial del sector.
(http://img686.imageshack.us/img686/350/modossoportados.jpg)

Realizando escritura de un sector.
Para realizar escritura de un único bloque debemos enviar el comando CMD24 indicando la dirección del bloque en el argumento de la función. La memoria al reconocer el comando envía la respuesta R1, donde puede indicar si hay algún error. Si todo es correcto el PIC debe enviar un token (0xFE) y luego los 512 datos del bloque más 2 bytes de CRC. Luego de enviado estos datos debemos quedar a la espera de una respuesta de la memoria indicando si los datos se han recibido correctamente o ha ocurrido un error, además de condición de desocupado.
Protocolo:
(http://img46.imageshack.us/img46/8063/escritura.jpg)
Respuesta:
(http://img686.imageshack.us/img686/5487/respuestaescritura.jpg)


Código: C
  1. /** \brief Realiza escritura de un bloque.-
  2.    
  3.    \param Address: Direccion del sector.-
  4.    \param Buffer: Buffer a escribir en memoria.-
  5.    \return  0 a ocurrido algún error, 1 todo ok.-
  6. */
  7. int1 SDCard_write_block(int32 Address,int *Buffer){
  8. int Respuesta,ResTmp;
  9. int16 i;
  10.  
  11.    SDSelect();
  12.    // Se envia comando para escribir bloque de bytes.-
  13.    if(SDCard_send_command(CMD24,Address,Respuesta)==0){
  14.       return(0);
  15.    }else if(Respuesta!=0){
  16.       return(0);
  17.    }
  18.    // Enviamos Token.
  19.    spi_xfer(SDCard,0xFE);
  20.    // Enviamos data.-
  21.    for(i=0;i<BLOCK_SIZE;i++){
  22.       spi_xfer(SDCard,*Buffer++);
  23.    }
  24.    // Ignoramos CRC.-
  25.    spi_xfer(SDCard,0xFF);
  26.    spi_xfer(SDCard,0xFF);
  27.    // Esperamos respuesta.-
  28.    i=0;
  29.    do{
  30.       ResTmp=spi_xfer(SDCard,0xFF);
  31.       i++;
  32.    }while(ResTmp==0xFF && i<100);// Mientras sea 0xFF.-
  33.    if(i==100){SDDeselect();return(0);}
  34.    if((ResTmp&0x1F)!=0x05){ // Si no se recibe ***00101.-
  35.       SDDeselect();
  36.       return(0);
  37.    }
  38.    // Esperamos a que baje la linea, indicando escritura completa.-
  39.    while(spi_xfer(SDCard,0xFF)==0);
  40.    SDDeselect();
  41.    return(1);  
  42. }

Realizando lectura de un sector.

Para realizar una lectura debemos enviar el comando CMD17 indicando en el argumento la dirección del bloque. Luego se espera la respuesta R1 desde la memoria, si todo es correcto se pasa a recibir el token y luego los datos, la cantidad es establecida por el largo del bloque. (CMD16)

(http://img697.imageshack.us/img697/8643/lectura.jpg)

Código: C
  1. /** \brief Realiza lectura de un bloque.-
  2.    
  3.    \param Address: Direccion del sector.-
  4.    \return Buffer: Buffer donde se almacena lectura de memoria.-
  5.    \return  0 a  ocurrido algún error, 1 todo ok.-
  6. */
  7. int1 SDCard_read_block(int32 Address,int *Buffer){
  8. int Respuesta, TokenTmp;
  9. int16 i;
  10.    // Se envia comando para leer bloque de bytes.-
  11.       SDSelect();
  12.    if(SDCard_send_command(CMD17,Address,Respuesta)==0){
  13.       return(0);
  14.    }else if(Respuesta!=0){
  15.       return(0);
  16.    }  
  17.    // Pasamos a esperar Token.
  18.    i=0;
  19.    do{
  20.       TokenTmp=spi_xfer(SDCard,0xFF);
  21.       i++;
  22.    }while(TokenTmp==0xFF && i<100);// Mientras sea 0xFF.-
  23.    if(i==100){SDDeselect();return(0);}
  24.    if((TokenTmp&0xE0)==0){ // Si se recibe 000xxxxx y no 0xFE.-
  25.       SDDeselect();
  26.       return(0);
  27.    }
  28.       // Todo ok, recibimos data.-
  29.    for(i=0;i<BLOCK_SIZE;i++){
  30.       *Buffer++=spi_xfer(SDCard,0xFF);
  31.    }
  32.    // Ignoramos CRC.-
  33.    spi_xfer(SDCard,0xFF);
  34.    spi_xfer(SDCard,0xFF);
  35.    
  36.    SDDeselect();
  37.    return(1);  
  38. }

Registros CSD y CID
La librería también tiene funciones dedicadas a la lectura de los registros CSD y CID. En el manual de producto de las memorias SD Card de Scandisk a partir de la página 37 se indica los parámetros que devuelven estos registros.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 08 de Enero de 2010, 21:30:53
Se adjunta librería para comunicación con memoria a nivel hard, código para probar librería y simulación en proteus. Por aquí  (http://www.mediafire.com/file/yeyrjy2jtky/cardimage.bin) pueden bajar una imagen para realizar algunas pruebas.
Ejecutando el ejemplo de prueba obtendrán el siguiente debug mediante RS232:

(http://img7.imageshack.us/img7/4334/debugsc.jpg)

También utilizando el soft WinHex pueden abrir la imagen y ver que los datos se han grabado correctamente:

(http://img19.imageshack.us/img19/813/debugwinhex.jpg)


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 08 de Enero de 2010, 22:13:29
Hola Profesor Suky:

Impresionante, leeí el hilo y ya se aclararon mucha dudas  :D, no mentiras dudas son las que tengo, Suky muchas gracias por compartir tu conocimientos con los novatos y lo mejor de forma desinterezada, yo también he estado trabajando sin descanso desde ya 15 días con las memoria sd, leyendo sacando resumenes etc. Y gracias a tu ayuda he podido programar ya 4 funciones de la memoria que son (reiniciar, inicializar, tamaño del bucle, y la lectura que la acabe de programar), voy a estar pendiente y trabajando duro si es posible las 24 horas del día haber si entre todos desmañaramos a la memoria sd.

Bueno, acá pongo un granito de arena es un resumen que lo he modificado (cortodó, pegado) algunas cosas espero que les sirva a todo los que quieren empezar con está targeta.

Nota: Al menos tomaste la idea de Comenzado con la memoria xxxx :D :D :D 
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 08 de Enero de 2010, 23:22:09
Nota: Al menos tomaste la idea de Comenzado con la memoria xxxx :D :D :D 

Seee!  :D :D

Hoy haciendo el resumen y re-leyendo el manual de especificaciones me di cuenta que había entendido algo mal  :oops: Se pueden escribir bloques de 1 a 512 bytes siempre y cuando se trabaje en una sola página o sector de la memoria. Aunque trabajar cambiando constantemente el tamaño del bloque de datos puede ser un poco engorroso.  :?


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 08 de Enero de 2010, 23:54:38

Suky sigo dandome golpes en la cabeza con la memoria  :5]. Revisando lo que leí el post, y de acuerdo con mi rutina de inicio el decir el comando CMD0 me di cuenta que tenia un error segun mi rutina.

Cuando retorna un 1 -------- Error
Cuando retorna un 0 -------- Todo bien

Pero siempre que llamo la rutina me aparece un "1 error" :5]

he revisado y no encuentro el error no se que pueda pasar. Acá pongo las rutinas

Citar
int init_mmc()
  {
   
    OUTPUT_HIGH(PIN_C2);
    SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_SS_DISABLED);
    for(i=0; i<10; i++)
      {
        SPI_WRITE(0XFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    OUTPUT_LOW(PIN_C2);             // Activo la targeta
    SPI_WRITE(0X40);
    SPI_WRITE(0X00);
    SPI_WRITE(0X00);
    SPI_WRITE(0X00);
    SPI_WRITE(0X00);
    SPI_WRITE(0X95);                // Comando CMDO datos a enviar
    if(mmc_respuesta(0x01)==1)
     {
       return 1;                    // Error en memoria por que se supero el tiempo
     }
    OUTPUT_HIGH(PIN_C2);
    return 0;                     // Todo bien
  }


La rutina de la función mmc_respuesta(xxx)

Citar
int mmc_respuesta(unsigned char respuesta)
  {
    unsigned long espera = 0xFFFF;
    while(SPI_READ(0xFF) != respuesta && --espera > 0);
    if(espera==0) return 1;
    else return 0;
  }

He revisado y rectificado y no se que pasá, hechale una miraita y comentas si voy bien o definitavamente o a cambiarme de profesión :D :D :D.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 09 de Enero de 2010, 20:12:53
Hola Suky.

Te tengo una consultica :mrgreen: y es la siguiente:

y es en código que pusiste para la escritura de un bloque de 512 bytes

Citar
if((ResTmp&0x1F)!=0x05){


Porque realizas la and lógica con 0x1f no comprendo como logras el 5 con esta operación :shock: :shock:.

Y la otra no sé si te la sepas he buscado y no encuentro nada.

Cual es la diferencia entre SPI_READ(XXXX) y la función SPI_READ()

Saludos.
 
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 09 de Enero de 2010, 21:20:29

Suky sigo dandome golpes en la cabeza con la memoria  :5]. Revisando lo que leí el post, y de acuerdo con mi rutina de inicio el decir el comando CMD0 me di cuenta que tenia un error segun mi rutina.

Cuando retorna un 1 -------- Error
Cuando retorna un 0 -------- Todo bien

Pero siempre que llamo la rutina me aparece un "1 error" :5]

he revisado y no encuentro el error no se que pueda pasar. Acá pongo las rutinas

Citar
int init_mmc()
  {
   
    OUTPUT_HIGH(PIN_C2);
    SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_SS_DISABLED);
    for(i=0; i<10; i++)
      {
        SPI_WRITE(0XFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    OUTPUT_LOW(PIN_C2);             // Activo la tarjeta
    SPI_WRITE(0X40);
    SPI_WRITE(0X00);
    SPI_WRITE(0X00);
    SPI_WRITE(0X00);
    SPI_WRITE(0X00);
    SPI_WRITE(0X95);                // Comando CMDO datos a enviar
    if(mmc_respuesta(0x01)==1)
     {
       return 1;                    // Error en memoria por que se supero el tiempo
     }
    OUTPUT_HIGH(PIN_C2);
    return 0;                     // Todo bien
  }


La rutina de la función mmc_respuesta(xxx)

Citar
int mmc_respuesta(unsigned char respuesta)
  {
    unsigned long espera = 0xFFFF;
    while(SPI_READ(0xFF) != respuesta && --espera > 0);
    if(espera==0) return 1;
    else return 0;
  }

He revisado y rectificado y no se que pasá, hechale una miraita y comentas si voy bien o definitavamente o a cambiarme de profesión :D :D :D.

Saludos.

Prueba modificando la configuración del SPI a :

Código: C
  1. SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_16|SPI_H_TO_L|SPI_XMIT_L_TO_H );

Luego agrega un par de ciclos de reloj antes de enviar el comando:

Código: C
  1. for(i=0; i<10; i++) SPI_WRITE(0XFF);
  2.     OUTPUT_LOW(PIN_C2);             // Activo la tarjeta
  3.     for(i=0; i<10; i++) SPI_WRITE(0XFF);

Creo que con eso se soluciona el problema  :?


Hola Suky.

Te tengo una consultica :mrgreen: y es la siguiente:

y es en código que pusiste para la escritura de un bloque de 512 bytes

Citar
if((ResTmp&0x1F)!=0x05){


Porque realizas la and lógica con 0x1f no comprendo como logras el 5 con esta operación :shock: :shock:.

Y la otra no sé si te la sepas he buscado y no encuentro nada.

Cual es la diferencia entre SPI_READ(XXXX) y la función SPI_READ()

Saludos.
 

Lo que hago con ResTmp&0x1F es aplicar una mascara para solo dejar los bits 0..4 de la variable ResTmp y después comparar si es 0x05 u otro.

Luego, SPI_READ(0xFF)  queda a la espera de un byte desde un dispositivo (Envia clock), pero además carga el valor dentro del paréntesis en SDO. Fíjate que la memoria necesita que SDO sea 1 cuando está en reposo.


Saludos!


Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 10 de Enero de 2010, 14:01:15
Hola Suky.

Citar
Lo que hago con ResTmp&0x1F es aplicar una mascara para solo dejar los bits 0..4 de la variable ResTmp y después comparar si es 0x05 u otro.
.

En resumidas estas haciendo lo siguiente (xxxxxxxx)&(00011111)=(000xxxxx) para poder compararlo con (00000101)=(0x05)=5 en decimal, que en este caso es la repuesta de la memoria al los datos guardados, es decir que si se guardaron correctamente.

Citar
Luego, SPI_READ(0xFF)  queda a la espera de un byte desde un dispositivo (Envia clock), pero además carga el valor dentro del paréntesis en SDO. Fíjate que la memoria necesita que SDO sea 1 cuando está en reposo.
.

Y con está instrucción estoy garantizando que siempre se estes enviando datos a la memoria por el registro SSPBUF, para que la memoria este áctiva.

Suky estuve revisando tu post en ucontrol, estuve haciendo algunos cálculos simple y me resulto una inquietud por que pones un oscilador de 48MHz para conseguir un frecuencia del clock (slk) de 750KHz "no es una frecuencia muy alta". :?

Citar
Prueba modificando la configuración del SPI a :


Código
GeSHi (c):SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_16|SPI_H_TO_L|SPI_XMIT_L_TO_H );
Luego agrega un par de ciclos de reloj antes de enviar el comando:


Código
GeSHi (c):    for(i=0; i<10; i++) SPI_WRITE(0XFF);    OUTPUT_LOW(PIN_C2);             // Activo la tarjeta    for(i=0; i<10; i++) SPI_WRITE(0XFF);
Creo que con eso se soluciona el problema 

Muchas gracias por los tips ya me pongo a probarlos, pero creo donde puede haber un problema y es en la siguiente línea.

Código: [Seleccionar]
  while(SPI_READ(0xFF) != respuesta && --espera > 0);

Nota la condición --espera > 0 hay un postdecremento, es decir, se decrementa sin hacer el ciclo lo cual cuando no esta en ciclo se está decrementando, por lo tanto creo que la instrución debé ser así:

Citar
  while(SPI_READ(0xFF) != respuesta && espera-- > 0);
 

Creo que esto puede ayudar. De todas formas ya se nota el trabajo cada día aprendo nuevas cosas acerca de esté monacho y cada vez se vuelve más complicado (resultan nuevas dudas), pero con trabajo, diciplina y esfuerzo se logra todo. Saludos. ;-)
 
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 10 de Enero de 2010, 19:14:48
Suky estuve revisando tu post en ucontrol, estuve haciendo algunos cálculos simple y me resulto una inquietud por que pones un oscilador de 48MHz para conseguir un frecuencia del clock (slk) de 750KHz "no es una frecuencia muy alta". :?

La frecuencia es 48MHz/16, ósea 3 MHz, pero se puede usar /4, para usar 12MHz que funciona correctamente.

Hay que hacer --espera==0, por utilizar un unsigned char, no me percate de eso   :mrgreen: Así trabajaría de la siguiente manera, leemos un byte por SPI, es igual a respuesta? No, decrementamos cuenta, es cuenta igual a 0? Si, salimos, ....


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 10 de Enero de 2010, 20:31:46
Hola Suky

mmmm. Estoy confundido :oops:. Según mi función:

Citar
int mmc_respuesta(unsigned char respuesta)
  {
    unsigned long espera = 0xFFFF;
    while(SPI_READ(0xFF) != respuesta && --espera > 0);
    if(espera==0) return 1;
    else return 0;
  }

Citar
Hay que hacer --espera==0, por utilizar un unsigned char, no me percate de eso    Así trabajaría de la siguiente manera, leemos un byte por SPI, es igual a respuesta? No, decrementamos cuenta, es cuenta igual a 0? Si, salimos, ....

Según la rutina la que es de tipo unsigned char es respuesta que es el parámetro que se carga en la función cuando se va ha llamar desde cualqiuier parte del programa mientras espera es de tipo unsigned long entonce no veo porque se debe utiliza --espera. Suky acá creo que es el problema de mi programa.

Casi se me olvida, revisando tu post de Ucontro nuevamente :mrgreen:, hay un arreglo llamado Buffer [512]="xxxxxxxx"
esté arreglo tan "grande" pone problemas en mi compilador (que sólo funciona con 12fxx y 16fxxxx) y creo que porque 512 bytes supera la memoria RAM del micro (16F877) que es como el más grandesito que puedo simular :( . Es un mensaje constructivo por si alguién ha tenido problemas.

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 11 de Enero de 2010, 00:12:59
Discúlpame a mi que metí la pata  :oops: No me concentre!  :oops: Se debe colocar --espera>0 o --espera!=0, (Como lo tenias) así espera mientras sea distinto de 0. Fíjate que al comenzar cargas espera con 0xFF, entonces la rutina haría lo siguiente: Lee un byte por SPI, si no es la respuesta pasa a decrementar espera, osea 0xFFFE, como es mayor a cero sigue dentro del while.


Con respecto al Buffer, en los pic de la familia 16F no lo vas a poder implementar. Podes utilizar buffer de 128 datos, y trabajarlos de forma correcta. Con esto me refiero a tener precaución en la dirección inicial a escribir para no trabajar en 2 sectores a la vez que según manual de características no esta permitido. Yo no he trabajado con escritura parcial de sectores así habría que hacer la prueba  :mrgreen:

Saludos!

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 11 de Enero de 2010, 13:01:58
Hola Suky.

Continua las pruebas :mrgreen:.

he modificado una cosita, haber si estas deacuerdo. La siguiente líneas son equivalentes a estás otras:

Citar
int mmc_respuesta(unsigned char respuesta)
  {
    while(SPI_READ(0xFF) != respuesta && --espera > 0);
  }

Equivalente a:

Citar
while(SPI_READ(0XFF) != respuesta && espera> 0)
     {
       espera= espera - 1;
     }

Ya estoy dudando de lo poco que se de C :D :D :D, esta memoria ya no me deja ni dormir  :D :D :D, pero hay vamos.

Con estas otras líneas se arregla el problema, será que el compilador no acepta --espera.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 11 de Enero de 2010, 17:55:10
Suky, muy bueno el post, lo único que tengo para comentar es que ese tipo de timeouts son muy dependientes de la velocidad a la que corre el micro y del compilador. No tenes ningún timer desocupado ?

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 11 de Enero de 2010, 19:17:37
Joder maestro, te dejo solo unos días y la que lías!!!!! :D :D :D :D

Ahora en serio, a ver si puedo retomarlo ya que ahora estoy muy liado con otro proyecto más rentable económicamente hablando (ya que voy a ganar algo de dinero porque con la sd....)

Una vez más, gracias por tu ayuda!!!

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 11 de Enero de 2010, 19:50:05
Suky, muy bueno el post, lo único que tengo para comentar es que ese tipo de timeouts son muy dependientes de la velocidad a la que corre el micro y del compilador. No tenes ningún timer desocupado ?

Saludos !

Si es muy cierto, pero bueno, si alguien lo necesita que lo implemente  :mrgreen: Se coloca una base, después cada uno tiene que estudiar el tema y puede hacer mucho mas eficiente todo el código  ;-)

Joder maestro, te dejo solo unos días y la que lías!!!!! :D :D :D :D

Ahora en serio, a ver si puedo retomarlo ya que ahora estoy muy liado con otro proyecto más rentable económicamente hablando (ya que voy a ganar algo de dinero porque con la sd....)

Una vez más, gracias por tu ayuda!!!



Disculpas por no revisar el tema de porque no te funcionó en hard real la librería en C18, en la simulación me funcionó! Haber si me hago un tiempito  ;-)


Citar
while(SPI_READ(0XFF) != respuesta && espera> 0)
     {
       espera= espera - 1;
     }

Ya estoy dudando de lo poco que se de C :D :D :D, esta memoria ya no me deja ni dormir  :D :D :D, pero hay vamos.

Con estas otras líneas se arregla el problema, será que el compilador no acepta --espera.


 :? No entiendo naa! Si es lo mismo!  :rolleyes:


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 11 de Enero de 2010, 19:57:31
Discúlpame tú a mi por no haber seguido con ello!!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 11 de Enero de 2010, 20:04:30
Hola Suky.

Citar
 No entiendo naa! Si es lo mismo!  

Es que modifique lo siguiente:

Citar
int mmc_respuesta(unsigned char respuesta)
   {
    unsigned long espera = 0xFFFF;
    while(SPI_READ(0xFF) != respuesta && --espera > 0);
    if(espera==0) return 1;
    else return 0;
  }
  }

Por lo siguiente:

Citar
int mmc_respuesta(unsigned char respuesta)
  {
    unsigned long espera = 0xFFFF;
    while(SPI_READ(0xFF) != respuesta && espera > 0)
      {
          espera = espera - 1;
      }
    if(espera==0) return 1;
    else return 0;
  }
Así me funciona haciendo lo mismo pero de diferente forma creo que el compilador que tengo no acepta bien  --espera > 0 debe poner problemas. Creo que ese era el problema porque la una funciona bien y la otra mal pero deberian hacer lo mismo, no se si estoy equivocado pero muchas gracias por la atención.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 12 de Enero de 2010, 15:55:39
Saludos

Todavia trabajando con la memoria sd tratando de ponerla al pelo, pero no he podido ponerla a funcionar bien, el leido el artículo del compañero Suky una y tras vez buscando el posible error (aunque he encontrado ya varios) , todavia sigo buscando en mis rutinas y nada no se que pueda pasar :shock:.

El programa debe hacer lo siguiente:

Al inicio la memoria debe inicializar en modo SPI para cual tengo un rutina que creo ya funciona.

y es la siguiente:

Código: [Seleccionar]
int init_mmc()
  {
    SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_XMIT_L_TO_H);
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    OUTPUT_LOW(PIN_C2);             // Activo la targeta
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0XFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar
    if(mmc_respuesta(0x01)==1)
      {
        return 1;                    // Error en memoria por que se supero el tiempo
      }
    OUTPUT_HIGH(PIN_C2);
    return 0;
  }

Dentro de esta rutina hay otra rutina que se llama mmc_respuesta(espera) que tiene como parámetro la variable espera y unsigned char (0 hasta 255 sin signo), lo que hace esta rutina es verificar la respuesta de la memoria ante un comando (llamese CMD0, CMD16 etc) es decir, espera el R1 y lo compara con la respuesta adecuada. Esta rutina es general para todas.
Y es la siguiente: Con alguna modificaciones que he hecho.

Código: [Seleccionar]
int mmc_respuesta(unsigned char respuesta)
  {
    unsigned long espera = 0xFFFF;
    while(SPI_READ(0xFF) != respuesta && espera> 0)
     {
       espera= espera - 1;
     }
    if(espera==0)
     {
      return 1;                  // se ha superado el tiempo
     }
    else
     {
      return 0;
     }
  }

La que sigue se llama inicializacion_mmc() y lo que hace esta rutina es inicializar la memoria para quedar lista para escritura y lectura de un bloque de 512 bytes, en esta rutina se envian los comandos CMD1, y CMD16 la configuración de CMD16 se hace de la siguiente forma se envia el comando (0x50, 0x00, 0x00, 0x02, 0x00, 0xFF) en el 4 byte se pone 0x02 para configura el bloque a 512 bytes que es equivalente en hex 0x200 y siempre en multiplos de este número. Lo siguiente es el código.

Código: [Seleccionar]
int inicializacion_mmc()
  {
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0xFF);
      }
    OUTPUT_LOW(PIN_C2);
      {
        SPI_WRITE(0xFF);
      } 
    i = 0; 
    do
      {     
        SPI_WRITE(0x41);         // Envia comando hasta que de la respuesta y hasta que se cumpla el tiempo
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0xFF);            // Secuencia del comando CMD1
        i= i + 1;
      }
    while(i<250 && mmc_respuesta(0x00)==1);
    if(i==250)
      {
        return 1;                // si se supera el tiempo de respuesta no se ha inicializado bien la targeta
      }
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<16; i++)          // Alguno cloks para estabilizar la comunicación
      {
        SPI_WRITE(0xFF);
      }
    OUTPUT_LOW(PIN_C2);
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0XFF);
      } 
    SPI_WRITE(0x50);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);              // Comando CMD16 para configurarlo de 512 bytes
    if(mmc_respuesta(0x00)==1)
      {
        return 1;                // se ha inicializado incorrectamente
      }
        OUTPUT_HIGH(PIN_C2);
        return 0;                // se ha inicializado correctamente
  }
 

La siguiente rutina escribe un bloque de 512 bytes segun las especificaciones de la targeta. En esta rutina escribo en el bloque número 2 el valor de 0x17 que es el envio en el bucle de 512 bytes y espero la respuesta de la memoria que debe ser 0x05, para lograr este valor leeo la respuesta de la memoria y hago una mascara con 0x0F para sólo tener en cuenta los primero 4 bits, pero ocurre algo que no se que pueda ser siemple la operación de la mascara  es decir
Código: [Seleccionar]
(resp&0x0f=!0x05)siempe está operación lógica me da 0x01 y no se porque lo he revisado una y otra vez no se pueda pasar :shock:.

El código es el siguiente de la rutina que escribe un bloque de 512 bytes en la memoria sd.

Código: [Seleccionar]
int mmc_escribir_bloque()
  {
    resp = 0;
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0xFF);               // Unos cuantos ciclos del reloj
      }
    OUTPUT_LOW(PIN_C2); 
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0xFF);         // Espero a que se estabilice la memoria
      }
    SPI_WRITE(0x58);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);          // Comando CMD24 pero escribé en el segundo bloque 0x200
    if((mmc_respuesta(0x00))==0x01)         // Espero la respuesta RB1
      {
        return 1;              // no respondio correctamente la memoria
      }
    SPI_WRITE(0xFE);          // Envio el token de inicio
    for(i=0; i<512; i++)
      {
        SPI_WRITE(0x17);         // Escribó 512 % que en hex es 0x25
      }
    SPI_WRITE(0xFF);
    SPI_WRITE(0xFF);             // espero ha que se estabilice o envio 2 CRC
    i=0;
    do
      {
        resp = SPI_READ(0xFF);
        i=i+1;
      }
    while(i!=200 && resp==0xFF);
    if(i==200)                                   // Se ha superado el tiempo
      {
        return 1;
      }
    if((resp&0x0F)!=0x05)
      {
        return 1;                            // No se escribio correctamente el bloque de 512 bytes dirente de 00101
      }
    OUTPUT_HIGH(PIN_C2);
    return 0;
  }


y por ultimo pongo la rutina principal que lo único que hace es decir si hubo error o todo bien a la hora de la respuesta de la memoria frente a un comando, es decir, por ejemplo responde si estuvo bien la escritura o si hubo un error, lo mismo es para la demás rutinas. Hago una aclaración cuando la rutina retorna "1" hubo un error y cuando retorna un "0".

Acá el código del main.

Código: [Seleccionar]
void main()
  {
    int lectura;
    set_tris_c(0x93);
    disable_interrupts(global);
    retorno = init_mmc();
    if(retorno==0x01)
      {
        printf("Error en memoria");
      }
    else
      {
        retorno = inicializacion_mmc();
        if(retorno==0x01)
          {
            printf("error");
          }
        else
          {
            retorno=mmc_escribir_bloque();
            if(retorno==0x01)
              {
                printf("No se pudo escribir el bloque\r");
              }
            else
              {
                printf("Escritura realizada");
              }
          }
      }
 while(;)
}

No se si ire por mal camino o tendré mal plateado el programa.

Bueno compañeros espero que me puedan ayudar ya que no he encontrado el posible error no se si estoy inicilizando mal la memoria, oh hay algún problema de programación o lógico o de configuración o de hardware etc.

Agradesco al compañero Suky ya que me ha asesorado y me ha aclarado muchas dudas con mucha paciencia, y gracias a él he podido avanzar con problemas pero lo he hecho.  ;-)

Acá dejo un artículo que encontre es de un dispositivo o mejor dicho un electrocardiograma muy interesante la parte matemática (por si alguién se le mide :mrgreen:) pero lo que me interesa es que en este proyecto también utilizaron una memoria mmc para almacenar los datos del sensor y lo que más me llamo la atención es que está programada en el esamblador. :shock:

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 12 de Enero de 2010, 19:37:22
mmm... Podrías ver que respuesta estas recibiendo (que es distinta a 0x05) para ver si ayuda a encontrar el inconveniente. En el código no veo el problema, parece estar correcto  :? Igual hay que agregar, al final de realizar escritura y haber recibido el 0x05, el testeo de estado de la memoria para saber cuando se desocupo. Igual esto es dependiente de la aplicación.

En proteus podes colocar un SPI debugger para ver los datos enviados y las respuesta recibida.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 12 de Enero de 2010, 20:31:16
Hola Suky

Para darme cuenta como esta respondiendo la memoria he definido unos bytes de la siguiente forma que son los siguientes:

Código: [Seleccionar]
#byte resp = 0x20
#byte and = 0x21
#byte retorno = 0x22

el byte resp contiene la respuesta de la memoria frente a la escritura es decir deberia tener 0x05 pero siempre tiene 0x01 y no se porque :?

ahora el byte and es el resultado de la operación lógica resp&0x0f. Está operación deberia dar 0x05 pero da 0x01 y tampoco he podido encontrar la causa.

y finalmente el byte retorno contiene el valor del return es decir, cuando esta bien (0) y cuando está mal (1).

Con respecto a debug de proteus nunca lo he podido manejar  :oops: siempre me pone super lenta la simulación (no se si sera normal) pero las conexiones deben ser triviales. acá adjunto el esqumático que estoy utilizando.

Suky nuevamente muchas gracias por responder y sigo trabajando haber si la pongo a andar al fin.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 14 de Enero de 2010, 18:24:39
Hola.

Bueno continuo con la pruebas no medoy por vencido pero no se que pasa.

en esta imagen pongo el circuito que estoy utlizando para simularlo en el proteus

(http://img251.imageshack.us/img251/4412/spi2.jpg)

En la siguiente gràfica utilizo el debug SPI pero despuès de leer la ayuda lo pude maneja, en esta gràfica se puede observar como responde al comando CMD0 pero no responde al comando CMD1

no se porque la respuesta es simplemente un ? :?

acà la figura

(http://img697.imageshack.us/img697/4535/prueba12.jpg)

En esta figura ya utilizo el cmando de escritura de 512 bloque se puede observar como el micro está mandando lo acertado pero la memoria no responde.

Acà la figura igual que el caso anterior la memoria responde con ?

(http://img62.imageshack.us/img62/5964/prueba22w.jpg)

y `por ultimo la respuesta frente a la cadena de 512 bytes enviados por el micro, yo espero que la respuesta sea 0x05 pero no la respuesta es ?, no se definitivamente que pasa, pero seguiere intentando voy a cambiar la imagen que se carga en la memoria a ver si es eso.

(http://img251.imageshack.us/img251/7280/prueba32.jpg)

Igualmente agradesco la ayuda prestada y recivo cualquier tipo de sujerencia :mrgreen: mientras tanto a seguir probando

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 14 de Enero de 2010, 22:01:58
Hola Chenao! mmm... Si la memoria no responde al comando CMD1 entonces la escritura y lectura de sectores no van a funcionar. Prueba colocando en una misma función el envío del CMD0 y CMD1, para no "apagar" la memoria entre los 2 comandos, osea habilitar memoria (CS=0), enviar comando CMD0 y CMD1, y después deshabilitar si se quiere.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 15 de Enero de 2010, 12:50:20
Hola Suky.

Suky si tienes razón el comando CMD1 es primordial, pero creo que es problema del simulador voy a intentar colacar la imagen que utilisaste en el proteus a ver como funciona, no sin antes seguir tu consejo profesional  ;-).

Cada día que sigo cacharriando más con esta memoria me engomo mucho más pero con trabajo todo se logra, ya al menos he tenido resultados no los esperados pero dentro de poco la pongo a funcionar al pelo, nuevamente Suky muchas gracias por tu paciencia y por tus consejos y seguire publicando mis experiencias con estás memorias para que así los foreros tengan más ayuda  :P.

Saludos y seguiremos en contacto.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 15 de Enero de 2010, 13:03:56
El cambio de imagen a la memoria no va a cambiar el modo de funcionar (Como esta programado en proteus) de ella, seguramente es necesario como inicialización enviar estos dos comandos sin desactivar la memoria en el proceso.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 15 de Enero de 2010, 13:09:14
Hola.

Citar
El cambio de imagen a la memoria no va a cambiar el modo de funcionar (Como esta programado en proteus) de ella, seguramente es necesario como inicialización enviar estos dos comandos sin desactivar la memoria en el proceso.

Listo profe así va a hacer  :D :D :D. Pero creo que ese es el problema no habia pensado en eso antes  8).

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 16 de Enero de 2010, 18:44:21
Saludos.

Continuan la pruebas pero esta vez con buenas noticias después de tanto experimentar (simular) por fin he podido inicializar, escribir y leer un bloque de 512 bytes  :-/ :-/ :-/, acá los resultados.

En esta imagén podemos como ver la memoria responde acertadamente al los comandos CMD0 y CMD1, además también responde acertadamente al comando CMD17, acá la figura

(http://img194.imageshack.us/img194/1917/hecho1.jpg)

Bonito no :mrgreen:. En la siguiente gráfica vemos como el PIC manda la secuencia de escritura y como la memoria responde acertadamente, además se ve como el pic manda la secuencia 0xfe y dos 0xff y después manda el dato a almacenar en este caso es (0x17), acá la figura.

(http://img194.imageshack.us/img194/1517/hecho2v.jpg)

Y la ultima figura que muestra la respuesta que se escribió bien y además el comando de lectura y como empieza a recibir el micro los datos, acá la figura.

(http://img7.imageshack.us/img7/876/hecho3e.jpg)

Bueno cual era el problema, si el profe Suky tenia toda la razón habia que en cuenta enviar el comando CMD0, CMD1 y el comando CMD17 a la misma vez.

Acá la rutina de inicilización

Código: [Seleccionar]
int init_mmc()
  {
    SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_XMIT_L_TO_H);
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    OUTPUT_LOW(PIN_C2);             // Activo la targeta
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar
    if(mmc_respuesta(0x01)==1)
      {
        return 1;                    // Error en memoria por que se supero el tiempo
      }
    do
      {
        SPI_WRITE(0x41);         // Envia comando hasta que de la respuesta y hasta que se cumpla el tiempo
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0xFF);            // Secuencia del comando CMD1
        i= i + 1;
      }
    while((i<250) && (mmc_respuesta(0x00)==0x01));
    if(i>=250)
      {
        return 1;                // si se supera el tiempo de respuesta no se ha inicializado bien la targeta
      }
    OUTPUT_LOW(PIN_C2);
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0xFF);
      }
    SPI_WRITE(0x50);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);              // Comando CMD16 para configurarlo de 512 bytes
    if((mmc_respuesta(0x00))==0x01)
      {
        return 1;                // se ha inicializado incorrectamente
      }
        OUTPUT_HIGH(PIN_C2);
        return 0;                // se ha inicializado correctamente
  }

Bueno el trabajo no para aquí se sigue trabajando con la memoria pienso montarla, es decir diseñar una pcb haber como anda, además de programar otras funciones entre ellas la de borrar la memoria etc. Acá pongo la primera pregunta he visto en el foro que hay unos socalos o conectores mi pregunta le sirven el socalo para una mmc a una sd? por que pienso desarmar unos que tengo acá de un convertidor viejo malo que me encontré en la herramienta de mi hermano.

Ya para despedirme agradesco enormemente al compañero Suky por colaborarme con tanta paciencia y darme consejos, pero hay una buena noticia sigo con el proyecto a ver si programo más comando y además también si hago mis funciones para el manejo de la fat. No se si te incomoda que te siga haciendo consultas :mrgreen:. Nuevamente gracias Suky ;-).

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 16 de Enero de 2010, 18:50:17
 :-/ :-/ :-/ Grande! Felicitaciones! Y no hay problema, si puedo contesto  ;-) Respecto a los socalos, los de SD Card sirven para las MMC, pero los socalos para las MMC no sirven para las SD Card.  :(


Saludos, y a seguir trabajando  :mrgreen:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 16 de Enero de 2010, 19:02:44

Gracias profe por la fecitación se hace lo que se puede :D :D :D.

Que cosa lo del socalo a buscar donde puedo conseguirme uno haber si me hecho con cautin a la mano y con mano en el teclado para superar tu proyecto :mrgreen:.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 16 de Enero de 2010, 19:06:19

Gracias profe por la fecitación se hace lo que se puede :D :D :D.

Que cosa lo del socalo a buscar donde puedo conseguirme uno haber si me hecho con cautin a la mano y con mano en el teclado para superar tu proyecto :mrgreen:.

Saludos.

 :D :D :D Guarda que mi proyecto no esta terminado!  :D :D

Respecto a los conectores, por ahí estas paginas te dan una idea:

http://www.instructables.com/id/Cheap-DIY-SD-card-breadboard-socket/

http://uanr.com/sdfloppy/

Y Tyco (http://www.tycoelectronics.com/default.aspx) puede mandarte un sample.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 17 de Enero de 2010, 15:49:38
Citar
    Guarda que mi proyecto no esta terminado!   

 :D :D :D. Se me complico el objetivo  :D :D :D.

Hola Suky sigo acá trabajando con la memoria gracias por los links ya mismo me pongo a trabajar con lo del socalo, pero mientras llega la muestra sigo con la memoria. Revisando nuevamente la teoria hay unos comando que son los siguientes.

CMD32, CMD33,CMD34. Que son para borrar un bloque ya escrito en la memoria según entendí :mrgreen: y haciendo algo de aritmética para conocer lo que debe enviar el micro llegue a lo siguiente.

CMD32 = 0X60,0X00,0X00,0X00,0X00,0X95
CMD33 = 0X61,0X00,0X00,0X00,0X00,0X95
CMD34 = 0X62,0X00,0X00,0X00,0X00,0X95

1 . Acá va mi primera pregunta lo mismo los 4 bytes es para de 0x00 son para referenciar que bloque se desea borrar.
2. Con estás memorias no hay forma de sobrescribir un sector de 512 bytes sin nesecidad de borrar primero el bloque ya escrito.

3. No hay un comando para borrar toda la memoria de una vez sin necesidad de irse por cada sector.

Saludos. 
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 17 de Enero de 2010, 21:01:18
mmm... Un comando es para definir la dirección del primer bloque, otro para definir la dirección del último bloque, y la restante es para borrar los sectores comprendidos entre los bloques definidos con los comandos anteriores.
Para borrar toda la memoria defines el primer sector con dirección 0x00, y el último dependerá del tamaño de la memoria.

Respecto a la pregunta numero 2, en las pruebas que desarrollaste, necesitaste borrar el sector para escribirlo?  :mrgreen:

Saludos!

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 18 de Enero de 2010, 17:47:41

Hola Suky que pena por no responder ligero, pero ya estoy que comienzo semestre de nuevo y estoy terminando de cuadrar el horario de clase dejame contarte que tengo un semestre lleno de básicos las siguientes son las materias de este semestre

1 Matemáticas V
2 Dinámica
3 Resistencia de Materiales
4 Ingeniería Económica
5 Taller de Ajuste
6 Electromagnétismo II

Nada de electrónica :oops:, pero bueno así son todas las materias de básicos, además hoy empiezo el curso de inglés de 6:00 pm a 10:00 Pm por 15 días.

En conclusión tengo un semestre bastante apasionante  :D :D :D.

Listo a lo que vinimos por acá tengo un memoria sd de 16 Mbytes y haciendo una conversionsita ligera llego a que

16Mbytes = 16777216 bytes

Pasando esto a potencias de 2 concluyo que 16777216 bytes = 2^24 y pasando a binario es equivalente a:

00000001 00000000 00000000 00000000 b = x(01000000)

De acá concluyo que la primera posición de la memoria de 16 Mbytes es = x00000000
Y la última es = x01000000

Creo que está bien no se si habrá algún problema con el cálculo del la última dirección de la memoria de 16 Mbytes.

Citar
Respecto a la pregunta numero 2, en las pruebas que desarrollaste, necesitaste borrar el sector para escribirlo? 

Voy a probar a ver como funciona y cual es la conclusión ;-).

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 18 de Enero de 2010, 19:04:40
Uff! Que semestre!!! Yo ya pasé por eso esfuerzos mentales :rolleyes:  :D :D

Respecto a la memoria, coincidimos en el numero de bytes, pero cada sector tiene 512 bytes, entonces el ultimo sector sería 16777216-512=0xFFFE00.

Igual podes descargar el programa WinHEX y verificar lo que estamos calculando.

Saludos!


PD: No es necesario borrar un sector antes de escribirlo  ;-)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 20 de Enero de 2010, 12:36:53

Citar
Uff! Que semestre!!! Yo ya pasé por eso esfuerzos mentales   

 :D :D. Si que lo exprimen a uno.

Citar
Respecto a la memoria, coincidimos en el numero de bytes, pero cada sector tiene 512 bytes, entonces el ultimo sector sería 16777216-512=0xFFFE00.

Haaaaa. Si tienes toda la razón no tuve en cuenta que el último era el penúltimo bloque pero bueno.

Bueno continuan las pruebas estás es para mirar si un bloque se puede reescribir estos fueron los resultados:

En la siguiente gráfica podemos como el micro escribe el dato 0xB3.

(http://img693.imageshack.us/img693/5895/escribir1.jpg)

En está gráfica vemos como leé los datos.

(http://img684.imageshack.us/img684/4776/escribir2.jpg)

En está gráfica vemos como el micro manda un bloque de 512 bytes con el dato 0x99 en el mismo programa.

(http://img641.imageshack.us/img641/4660/escribir3.jpg)

Y en la última gráfica leé los 512 bytes con el dato 0x99

(http://img684.imageshack.us/img684/121/escribir4.jpg)

En conclusión no se necesita borrar un bloque para poder escribirlo es decir, el bloque es rescribible. Suky que pena por contestar tan tarde pero he estado un poco ocupado cuadrando el horario del semestre pero sigo trabajando con mi memoria, ya me pongo en la tarea de programar la función erase(). ;-)

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 20 de Enero de 2010, 15:56:07

Saludos. Sigo con la pruebas ahora con la función mmc_erase() la idea es la siguiente cada vez que se inicilice la memoria también seá formateada, estuve mirando el datasheet y el artículo de compañero Suky y realice la siguiente rutina

Código: [Seleccionar]
int mmc_erase()
  {
    OUTPUT_HIGH(PIN_C2);
    for (i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);
      }
    OUTPUT_LOW(PIN_C2);                // Activo la targeta
    for (i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);               // Algunos clocks.
      }
    SPI_WRITE(0x60);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);
    if(mmc_respuesta(0x01)== 0x01)     // No respondio acertadamente la memoria
      {
        return 1;
      }
    SPI_WRITE(0x61);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);
    SPI_WRITE(0XFE);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);
    if(mmc_respuesta(0x01)==0x01)
      {
        return 1;                    // No respondio la memoria y se vencio el tiempo
      }
    SPI_WRITE(0x66);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);
    if(mmc_respuesta(0x01)== 0x01)
      {
        return 1;
      }
    while(SPI_READ(0xFF) == 0); 
    OUTPUT_HIGH(PIN_C2);
    return 0;                       // Borro acertadamente toda la memori       
  }

La memoria que estoy simulando es de 16Mbytes, bueno hasta acá todo va bien pero me resulta un interrogante cuando la simulo y le pongo el debug del SPI la memoria me responde con 0x04 que según el R1 indica comando inválido he revisado el cálculo del comando y no se que pueda pasar (Todo el cálculo esta bien eso creo porque soy algo despitado :mrgreen:) :oops:. Bueno seguire intentando haber si termino con la memoria y sigo con la de la FAT.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 20 de Enero de 2010, 18:06:27
 :?  Será que el dispositivo de proteus es una MMC y no tienen esos comandos?  :roll:


Pare realizar el formateo de una memoria independientemente del tamaño se podría leer el registro CID, que creo que un parámetro da el tamaño de la memoria.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 20 de Enero de 2010, 18:20:08

mmm... Eso es lo que estoy mirando en un datasheet de una memoria MMC Samsung, acá he encontrado que si tienes los comandos para borrar pero en dicho caso tienen dirección distinta ed decir, uno es el CMD35, CMD36 y CMD38 respectivamente, Pero mando el comando con las nuevas direcciones y sigue respondiendo 0x04, La verdad no se si el simulador proteus simula estos comandos "creeria que si" pero seguire investigando cual puede ser el problema o otro podria ser la imagén la verdad no se si habra problema con el simulador.

Citar
Pare realizar el formateo de una memoria independientemente del tamaño se podría leer el registro CID, que creo que un parámetro da el tamaño de la memoria.

Es muy buena idea mejor dicho Suky te la conoces coma la palma de mano :D :D :D.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 21 de Enero de 2010, 11:39:30

Hola Suky. Acá sigo con lo de la memoria pero estoy investigando reuniendo información para haber logro simularla en el proteus antes de montarla. Bueno he conseguido un datasheet de una MMC y he encontrado algo.

Lo primero el tamaño de la memoria se encuentra en el registro CSD acá pongo una tabla para que lo observes.

(http://img192.imageshack.us/img192/1299/diagrama1l.jpg)

Y lo segundo acá una tabla de los comandos de erase para una MMC, son muy distintos a los de la SD.

(http://img260.imageshack.us/img260/5632/diagrama2.jpg) .

Bueno eso era lo que queria comentar solamente falta lo del simulador.

Saludos y a seguir trabajando. :mrgreen:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 21 de Enero de 2010, 14:07:05

Hola Nuevamente. Sigo con lo de la memoria y acabo de realizar la rutina del comando CSD hay vamos :-/ :-/ :-/ 8).

Bueno acá los resultados:

En esta figura observamos una memoria de 32 Mbytes en está memoria los que contienen el parámetro de capacidad son el los bytes 10 y 11 acá la gráfica.

(http://img192.imageshack.us/img192/6874/csd1.jpg)

Bueno en está otra simulación la memoria fue de 16 Mbytes los bytes 10 y 11 cambian porque el tamaño de la memoria también cambian. En la siguiente figura los resultados.

(http://img192.imageshack.us/img192/9428/csd2.jpg)

Esté método resulta muy util a la hora de formatear toda la memoria ya que sabemos con los bytes 10 y 11 tenemos el tamaño de la memoria así podemos formatear cualquier memoria conociendo esté método. De nuevo gracias al compañero Suky por el dato del CRC aunque se lo tenia bien guardadito :D :D :D.

Saludos y seguimos adelante
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 21 de Enero de 2010, 15:41:49

Esté método resulta muy util a la hora de formatear toda la memoria ya que sabemos con los bytes 10 y 11 tenemos el tamaño de la memoria así podemos formatear cualquier memoria conociendo esté método. De nuevo gracias al compañero Suky por el dato del CRC aunque se lo tenia bien guardadito :D :D :D.

Saludos y seguimos adelante

 :D :D Hay que leer y leer! Uno solo entrega la punta del ovillo  ;-)


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 22 de Enero de 2010, 12:41:50

Hola Suky. Si hay que leer bastante pero el inglés técnico me enrreda bastante pero bueno se hace lo puede.

Dejame contarte que por hora no voy a molestar más con la memoria sd si no hasta que la monte (creo que por ahy el 3 de febrero empiezo a cacharriale al hardware), si no que voy a empezar con lo de la FAT16 creo que es la parte más complicada pero hay tiempo y buena disposición para hacerlo. Será que con el micro 16F877 si me aguante lo de la FAT16 porque tengo mis dudas al manejar la SD y la FAT me consuman toda la ROM del micro y ahy si paila.

Bueno compañero muchismas gracias por la ayuda prestada, sin tú ayuda el manejo de la SD hubiera sido un fracaso (al menos eso creo porque está memoria tiene sus marañas). De nuevo seguimos en contacto, contando nuestras experiencias con la SD ;-), aunque de pronto me demore algo en responder pero el proyectico no lo abandono.

Saludos y seguimos adelante.

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 22 de Enero de 2010, 13:50:32
mmm... Con un 877 no llegas a ningún lado, te va a consumir toda la RAM/ROM y no vas a poder hacer nada. Te conviene usar un 18F que programado en CCS da lo mismo.

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 29 de Enero de 2010, 06:56:00
Vuelvo a la carga!!

He revisado el esquema que has colgado, ¿te funciona sin poner un driver en el SDO? A mí no me reconoce nada.


He metido tu programa en CCS y con la mmc funciona sin problemas pero con las sd hace cosas raras. Estos son los errores que me han salido:
Código: [Seleccionar]
Iniciando SD Card
Error
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Error! No se ha podido leer

Cambian al resetar el sistema y volver a inicializarlo.

Yo creo que tengo alguna chorrada en el pcb pero por más que lo revise está bien (salvo la diferencia comentada)

A ver si conseguimos echarlo a andar!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 29 de Enero de 2010, 09:22:45
He revisado el esquema que has colgado, ¿te funciona sin poner un driver en el SDO? A mí no me reconoce nada.

Sip, exactamente así como está. Yo estuve utilizando una memoria SD Card Scandisk de 512MB.


Con respecto al error que pueda ocurrir con la SD Card podrías activar el debug_rs232 para nos de más información de donde pueda estar fallando.

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 29 de Enero de 2010, 09:52:34
aquí lo tienes

Código: [Seleccionar]
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD9 (Lectura de CSD)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Escribimos sector 0x200

--> Se envia CMD24 (Escritura de bloque)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Error en escritura
Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD1 (Se activa SD Card)

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX:  Respuesta recibida:1
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)
ÿIniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD1 (Se activa SD Card)

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD16 (Se fija largo del Bloque para escritura/lectura : 512)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD10 (Lectura de CID)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD9 (Lectura de CSD)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Escribimos sector 0x200

--> Se envia CMD24 (Escritura de bloque)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Se envia Token (0xFE)
Se envia Bloque de datos
Respuesta de recepción del bloque: 0x0  (***00101)
Error en escritura

Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD10 (Lectura de CID)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0

--> Se envia CMD9 (Lectura de CSD)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Escribimos sector 0x200

--> Se envia CMD24 (Escritura de bloque)
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:0
Se envia Token (0xFE)
Se envia Bloque de datos
Respuesta de recepción del bloque: 0x0  (***00101)
Error en escritura
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Valores Leidos:

00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,01,
14,00,04,03,60,E9,33,00,00,00,CD,F4,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,55,AA,
Se lee el sector de la memoria 512:
Valores Leidos:

4C,69,62,72,65,72,69,61,20,63,6F,6E,74,72,6F,6C,20,4D,65,6D,6F,72,69,61,20,53,44
,20,62,79,20,53,
75,6B,79,2E,00,04,06,50,26,00,41,32,20,2E,E3,86,8C,44,C9,55,B4,02,25,D0,2C,53,82
,61,12,70,43,36,
3C,00,0D,3C,03,02,E9,06,94,77,28,B9,06,37,00,54,20,0C,E1,A3,4E,A0,06,D8,94,7B,00
,26,2B,00,00,00,
00,00,14,00,00,FE,FF,54,58,36,00,D1,2E,90,0C,C1,1A,32,D4,03,54,25,10,22,10,11,50
,32,9D,47,B8,A8,
28,4F,B8,9C,40,9D,E6,26,10,00,3D,65,98,32,13,65,11,4A,14,A2,09,73,81,3A,07,B7,01
,4A,10,34,2A,C0,
08,01,25,91,68,21,D4,6B,10,44,14,68,61,6F,0E,26,28,C1,06,A1,53,01,52,20,40,00,4B
,CD,08,41,2B,10,
18,53,20,F1,08,12,05,48,90,B0,42,20,88,A0,81,E9,83,00,77,4D,92,B0,43,AC,40,A1,10
,05,F8,1A,C8,45,
87,04,20,49,38,CE,00,70,0E,80,20,80,EA,80,1D,B0,25,1A,84,4B,14,11,8E,A0,A4,C0,71
,00,0C,68,A1,48,
8C,A7,0C,01,54,4A,32,79,9B,2C,00,49,94,5D,6A,A8,D3,25,D4,E6,F7,04,03,55,20,2D,5B
,93,ED,AB,16,56,
85,04,42,87,10,45,0A,84,9D,70,04,22,F2,08,FC,48,05,A2,24,EC,1A,51,45,9D,42,A1,08
,55,D9,A0,24,E4,
FB,58,03,97,A0,81,57,43,04,E5,74,0E,70,78,0A,18,13,F0,30,48,88,86,31,15,DA,B0,03
,48,D3,58,C2,06,
25,AC,1E,2D,76,02,09,A6,91,3A,0D,54,C3,2C,8B,00,2C,48,4A,6C,24,F0,C1,53,A4,C9,29
,FD,CA,40,D4,84,
19,EE,A8,98,8D,2C,C2,8B,29,85,84,39,09,92,00,C8,4E,04,31,C7,7B,07,03,2C,71,60,00
,CD,61,1F,10,52,
81,00,45,47,6A,9C,5A,70,96,00,99,DD,05,82,0C,1D,C6,23,14,54,5B,24,43,11,0F,3E,30
,7E,86,09,A4,75,
61,69,02,B3,00,40,05,03,82,9E,00,14,2C,09,59,00,01,00,D8,00,74,C0,20,34,D0,00,D0
,34,20,C0,74,FF,
01,00,20,00,18,74,20,EE,FF,01,00,03,00,25,88,72,46,2E,1D,43,46,59,90,6C,14,48,24
,10,00,11,11,11,
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Valores Leidos:

00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,01,
14,00,04,03,60,E9,33,00,00,00,CD,F4,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,55,AA,
Se lee el sector de la memoria 512:
Valores Leidos:

4C,69,62,72,65,72,69,61,20,63,6F,6E,74,72,6F,6C,20,4D,65,6D,6F,72,69,61,20,53,44
,20,62,79,20,53,
75,6B,79,2E,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,A3,4E,A0,06,D8,94,7B,00
,F1,72,25,A1,48,
B4,47,30,E3,04,F0,20,50,58,36,00,D1,2E,90,0C,C1,1A,32,92,03,54,25,18,26,10,11,40
,32,9D,47,DA,A8,
28,4F,B8,9C,C0,9D,E6,06,10,00,3D,65,98,32,13,65,11,4A,14,A2,09,73,81,3A,07,B5,01
,4A,10,34,2A,D0,
08,05,25,91,68,21,D4,6B,10,04,10,68,63,6D,0E,26,28,C1,06,A1,53,11,42,20,40,00,4B
,CC,00,41,2F,10,
18,53,20,71,88,1A,05,48,90,B0,40,20,08,A0,81,CD,87,00,77,4C,92,BA,43,AC,40,A1,10
,05,E9,1A,CC,45,
87,04,22,49,38,CE,00,70,0E,80,20,00,EA,80,1D,B0,25,1A,80,4B,14,19,9E,A0,A4,C0,71
,23,04,68,A1,48,
8C,A7,2C,01,54,4A,32,79,93,2C,00,4B,94,59,6A,A8,93,25,D4,E6,F7,06,03,57,20,2D,4B
,93,ED,AB,10,56,
85,04,42,87,10,45,0A,84,99,70,04,22,F2,08,7D,48,05,86,24,EC,1A,51,45,95,42,A1,08
,55,D9,A0,24,E4,
FB,58,03,9F,A0,81,57,43,04,E5,74,0E,70,78,0A,18,13,E0,30,48,88,86,31,15,9A,B0,03
,08,D3,58,82,06,
27,AC,1E,2D,76,02,09,A6,90,3A,0D,54,C3,0C,8B,00,24,48,5A,6C,34,F0,C1,53,24,C9,29
,FD,DA,40,D4,84,
19,EE,A8,98,8D,64,C2,AB,29,84,84,39,09,92,00,E8,4E,04,31,C7,7B,17,03,2C,71,60,04
,CC,61,1F,10,5A,
81,00,45,45,6A,9C,5A,70,96,00,99,DD,05,82,0C,1D,C6,22,14,54,5B,26,43,11,0F,3E,30
,7E,84,08,A4,66,
41,69,02,B3,00,44,05,A3,82,9E,97,14,2C,09,79,03,88,E1,98,28,74,C2,20,34,D0,00,40
,01,42,EE,20,74,
08,D1,28,D2,43,30,44,A3,09,2C,00,03,08,25,88,72,42,2E,1D,43,46,59,90,6C,10,48,24
,00,00,00,00,00,
Iniciando SD Card
Error
Iniciando SD Card
Error
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Error! No se ha podido leer
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Error! No se ha podido leer
Iniciando SD Card
Error
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Error! No se ha podido leer
Iniciando SD Card
Error
Iniciando SD Card
Error
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Error! No se ha podido leer
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Error! No se ha podido leer
Iniciando SD Card
Error
Iniciando SD Card
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

Lectura del CSD:

Se realiza escritura de la memoria en 512:

Se lee el sector de la memoria 0:
Error! No se ha podido leer
Iniciando SD Card

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1

--> Se envia CMD1 (Se activa SD Card)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0

--> Se envia CMD16 (Se fija largo del Bloque para escritura/lectura : 512)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0

--> Se envia CMD59 (Desactivación de CRC)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0
Se ha iniciado correctamente la memoria!!!

Lectura del CID:

--> Se envia CMD10 (Lectura de CID)
Repeticiones para respuesta de CmdXX: 3; Respuesta recibida:0
Toquen recibido: 0xFE

Manufacturer ID: 03
OEM/Application ID: SD
Product Name: SD016
Product Revision: 31
Serial Number: 3E28163F
Manufacturer Date Code: 002B
CRC-7 Checksum: 75

Lectura del CSD:

--> Se envia CMD9 (Lectura de CSD)
Repeticiones para respuesta de CmdXX: 3; Respuesta recibida:0
Toquen recibido: 0xFE

CSD_STRUCTURE: 00
TAAC: 26
NSAC: 00
TRAN_SPEED: 32
CCC: 01F5
READ_BL_LEN: 09
READ_BL_PARTIAL: 01
WRITE_BLK_MISALIGN: 00
READ_BLK_MISALIGN: 00
DSR_IMP: 00
C_SIZE: 83
VDD_R_CURR_MIN: 05
VDD_R_CURR_MAX: 04
VDD_W_CURR_MIN: 05
VDD_W_CURR_MAX: 05
C_SIZE_MULT: 03
ERASE_BLK_EN: 01
SECTOR_SIZE: 1F
WP_GRP_SIZE: 7F
WP_GRP_ENABLE: 01
R2W_FACTOR: 04
WRITE_BL_LEN: 09
WRITE_BL_PARTIAL: 00
FILE_FORMAT_GRP: 00
COPY: 01
PERM_WRITE_PROTECT: 00
TMP_WRITE_PROTECT: 00
FILE_FORMAT: 00
CRC: 9F

Se realiza escritura de la memoria en 512:

--> Se envia CMD24 (Escritura de bloque)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0
Se envia Token (0xFE)
Se envia Bloque de datos
Respuesta de recepción del bloque: 0xE5  (***00101)
Escritura Terminada

Se lee el sector de la memoria 0:

--> Se envia CMD17 (Lectura de bloque)
Repeticiones para respuesta de CmdXX: 3; Respuesta recibida:0
Toquen recibido: 0xFE
Terminada la lectura
Valores Leidos:

33,C0,8E,D0,BC,00,7C,FB,50,07,50,1F,FC,BE,1B,7C,BF,1B,06,50,57,B9,E5,01,F3,A4,CB
,BD,BE,07,B1,04,
38,6E,00,7C,09,75,13,83,C5,10,E2,F4,CD,18,8B,F5,83,C6,10,49,74,19,38,2C,74,F6,A0
,B5,07,B4,07,8B,
F0,AC,3C,00,74,FC,BB,07,00,B4,0E,CD,10,EB,F2,88,4E,10,E8,46,00,73,2A,FE,46,10,80
,7E,04,0B,74,0B,
80,7E,04,0C,74,05,A0,B6,07,75,D2,80,46,02,06,83,46,08,06,83,56,0A,00,E8,21,00,73
,05,A0,B6,07,EB,
BC,81,3E,FE,7D,55,AA,74,0B,80,7E,10,00,74,C8,A0,B7,07,EB,A9,8B,FC,1E,57,8B,F5,CB
,BF,05,00,8A,56,
00,B4,08,CD,13,72,23,8A,C1,24,3F,98,8A,DE,8A,FC,43,F7,E3,8B,D1,86,D6,B1,06,D2,EE
,42,F7,E2,39,56,
0A,77,23,72,05,39,46,08,73,1C,EB,1A,90,BB,00,7C,8B,4E,02,8B,56,00,CD,13,73,51,4F
,74,4E,32,E4,8A,
56,00,CD,13,EB,E4,8A,56,00,60,BB,AA,55,B4,41,CD,13,72,36,81,FB,55,AA,75,30,F6,C1
,01,74,2B,61,60,
6A,00,6A,00,FF,76,0A,FF,76,08,6A,00,68,00,7C,6A,01,6A,10,B4,42,8B,F4,CD,13,61,61
,73,0E,4F,74,0B,
32,E4,8A,56,00,CD,13,EB,D6,61,F9,C3,49,6E,76,61,6C,69,64,20,70,61,72,74,69,74,69
,6F,6E,20,74,61,
62,6C,65,00,45,72,72,6F,72,20,6C,6F,61,64,69,6E,67,20,6F,70,65,72,61,74,69,6E,67
,20,73,79,73,74,
65,6D,00,4D,69,73,73,69,6E,67,20,6F,70,65,72,61,74,69,6E,67,20,73,79,73,74,65,6D
,00,00,00,00,00,
8B,F4,8A,56,24,CD,13,61,61,72,0B,40,75,01,42,03,5E,0B,49,75,06,F8,C3,41,BB,00,00
,60,66,6A,00,EB,
B0,4E,54,4C,44,52,20,20,20,20,20,20,0D,0A,52,65,6D,6F,76,65,20,64,69,73,D4,EE,21
,00,72,20,00,01,
01,00,01,FE,3F,00,3F,00,00,00,41,70,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
,00,00,00,55,AA,
Se lee el sector de la memoria 512:

--> Se envia CMD17 (Lectura de bloque)
Repeticiones para respuesta de CmdXX: 3; Respuesta recibida:0
Toquen recibido: 0xFE
Terminada la lectura
Valores Leidos:

4C,69,62,72,65,72,69,61,20,63,6F,6E,74,72,6F,6C,20,4D,65,6D,6F,72,69,61,20,53,44
,20,62,79,20,53,
75,6B,79,2E,00,00,06,50,26,00,41,32,20,2E,E1,C6,8C,44,C9,51,B4,02,25,D0,2C,51,AA
,61,12,71,43,36,
3D,00,0D,3C,03,06,E9,06,94,6F,28,99,06,1F,00,54,60,0C,E1,A3,5E,A0,06,D8,94,7B,00
,F4,72,21,A9,48,
B4,06,30,E3,04,F8,20,50,58,36,00,D1,2E,90,0C,C1,0A,32,D2,07,54,25,18,26,10,11,50
,32,95,47,FA,A8,
28,4F,B8,9C,C0,9D,E6,26,10,00,3D,65,98,32,13,65,11,4A,14,A2,09,73,81,3E,07,B7,01
,4A,10,34,2A,C0,
08,01,25,91,6A,21,D4,6B,10,44,14,68,61,6D,0E,26,28,C1,06,A1,53,01,42,20,40,00,4B
,CD,00,41,2E,10,
18,53,20,F1,08,1A,05,48,90,B0,40,20,88,80,81,C9,83,00,76,4C,92,B2,43,AC,40,A1,10
,05,F8,1A,C8,45,
87,04,22,49,38,CE,00,70,0E,80,20,00,EA,80,1D,B0,A5,1A,80,4B,14,11,9E,A0,A4,C0,71
,23,04,68,A1,48,
8C,A7,0C,01,54,4A,32,F9,BB,2C,00,49,94,59,6E,A8,D3,25,D4,E6,F7,06,03,55,20,2D,5B
,93,ED,AB,12,56,
05,04,42,87,10,45,0A,84,99,7A,04,22,72,08,7D,68,05,A6,24,EC,1A,51,45,9D,42,A1,48
,55,D9,A0,24,E4,
FB,58,03,9F,A0,81,57,43,04,E5,74,0E,70,7C,0A,19,03,F0,30,48,08,86,31,15,DA,B0,03
,08,D3,58,82,06,
25,AC,1E,2D,76,02,09,A6,10,3A,0D,54,C3,2C,8B,00,24,48,4A,6C,24,F0,C1,53,24,C9,29
,FD,DA,40,94,84,
19,EE,E8,98,8F,2C,C2,8B,29,85,84,39,09,92,00,E8,4E,04,31,C7,7B,17,03,AC,71,60,00
,CC,61,1F,10,5A,
81,00,45,47,6A,9C,5A,70,96,00,99,DD,15,82,0C,9D,C6,22,14,54,5B,26,43,10,0F,3E,30
,7E,86,08,A4,64,
41,69,02,B3,00,40,05,A3,82,9E,97,1C,2C,09,79,07,88,E1,D8,A8,74,C2,00,34,D0,00,40
,01,C2,EE,20,74,
18,D1,20,D2,43,30,40,22,01,2C,10,03,08,25,88,72,42,2E,1D,43,46,59,10,6C,10,49,24
,11,11,11,31,31,
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 29 de Enero de 2010, 11:14:25
Ups! Podrías pasarlo en limpio  :mrgreen: Porque veo que hay de todo, hasta una inicialización correcta pero no se si es la mmc o SD  :?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 29 de Enero de 2010, 11:25:29
todo esto es de la sd!!!

Lo que he hecho es reprogramar el pic con el debbug activo y encender el sistema con la sd dentro
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 29 de Enero de 2010, 13:11:30
Es que pasa algo raro, es como que se está iniciando y ocurre un reset. Agrega una demora y ve que sea estable  :?

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 07 de Febrero de 2010, 16:23:23

Saludos, ya he conseguido todos lo materiales exepto uno (socalo) y voy a monta en forma de prototipo haber como anda, he contado con algo de suerte porque un profesor me regalo el micro, la memoria (SanDisk)  para realizar el experimento, pero me regalo una usd y es la siguiente

(http://img99.imageshack.us/img99/2991/sd2r.jpg)

En esta figura se ve que tiene 8 terminales pero además, biene con un conector o una expecie de socalo que es el siguiente:

(http://img16.imageshack.us/img16/30/sd1s.jpg)

Este contiene 9 pines y no se porque uno tiene 8 terminales y el otro contiene 9 terminales. Eso por una parte, por otra parte. Será que al socalo de la segunda figura le puedo soldar unos cablesitos para poder conectarlos a la protoboard, que me recomiendan, y para finalizar la micro_sd le sirve el mismo datasheet que para la sd normalita porque si no habria que configurar un parde cosita.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: alex1987 en 12 de Febrero de 2010, 15:04:48
Hola soy nuevo en el foro y tengo un trabajo que desarrollar, se trata de una datalogger, implementado con un microcontrolador y almacenando los datos en una memoria sd, he leido los comentarios, he visto y descargado los archivos del profesor suky, pero cuando lo intento simular en proteus no corre adecuadamente, he intentado hacer unas modificaciones con las cuales avance un poco mas pero aun asi no he logrado la gran cosa, ojala pudieran hecharme la mano, adjunto la imagen  de donde termina la simulacion
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 08 de Marzo de 2010, 06:28:30
Es que pasa algo raro, es como que se está iniciando y ocurre un reset. Agrega una demora y ve que sea estable  :?

Saludos!
Lo siento suky, no lo he podido probar hasta ahora.... ¿Dónde tengo que poner el retardo? ¿entre inicializaciones?

He hecho otra placa, la antigua estaba montada en una placa de prototipos. Esta la he hecho bien XD, a ver si era algún falso contacto o algo. Pero no, sigue igual...

Con las mmc sin problemas pero con las sd falla... ¿Puede ser algo de la configuración del bus de la sd? Por lo que tengo entendido, tienes que configurar el bus de la sd como spi que si no trabaja con su bus de 3 líneas de datos.

Otra vez tengo tiempo para meterme con ello, a ver si ahora lo consigo!!

Una vez más, muchas gracias!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 08 de Marzo de 2010, 13:30:46
Hola Slalen! Habría que hacer algo así para la iniciación y ver el debugger:


Código: C
  1. delay_ms(1000);    
  2.      for(i=0;i<10;i++){
  3.           printf("Intento inicializacion >>>:\r\n")
  4.           if(SDCard_init()==1) break;
  5.           delay_ms(500);
  6.     }

Así intenta 10 veces la inicialización y vemos que sucede  :rolleyes:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 08 de Marzo de 2010, 17:47:19
ok, mañana no puedo probarlo porque me voy a un seminario de los uc de st.

Pasado te digo algo más ;-)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 10 de Marzo de 2010, 06:17:34
los resultados:
Código: [Seleccionar]
--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1

--> Se envia CMD1 (Se activa SD Card)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0

--> Se envia CMD16 (Se fija largo del Bloque para escritura/lectura : 512)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0

--> Se envia CMD59 (Desactivación de CRC)
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0
no entiendo nada, parece que depende del día que tenga....
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 10 de Marzo de 2010, 09:08:42
jejeje! Pero por lo que muestras se ha iniciado correctamente  ;-)

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 10 de Marzo de 2010, 09:45:02
Pues visto que el pcb está bien, a ver si mañana me meto con el c18, que hoy no me van a dejar :(
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 18 de Marzo de 2010, 17:40:10
Bueno. Yo vengo de costado mal con esto.

Hace rato modifique y amplie una libreria para FAT32(https://code.google.com/p/nanofat-lib/) para que aceptase tambien FAT16 y otras cositas, por lo que ahora es una libreria DUAL. Siempre lo hice en el simulador, pero como siempre a la hora de ir a los bifes...Nada. El hardware no responde. Me da error de inicializacion.

Entonces decidi cambiarme a esta libreria tuya Suky, porque hay mas retroalimentacion y comentarios, al menos hasta que la memoria arranque.

Estoy usando el mismo esquema que vos planteas, solo que en un 18F4550. La memoria que estoy usando es una microSD SanDisk(que supongo que sera tu "ScanDisk" :z) ) de 2G, con un adaptador a SD para poder conectarla. Ya la he formateado en FAT16 con bloques de 32k,64k y tamaño predeterminado(no me permite seleccionar 512 bytes lamentablemente) pero sigue sin funcionar. Tambien he intentado formatearla como FAT32 con 512 bytes por sector pero tampoco responde.

En la simulacion la inicializacion funciona quitando la deshabilitacion del CRC...en el hard real no pasa nada. Ya cambie los valores de los divisores de tensiones(1k y 1.5k) a otros(10k y 27k) pero sigue sin responder.

Config:

Estoy usando un PIC18F4550 @48Mhz(cristal de 20Mhz);
En protoboard;
SDI,SDO y SCL por hardware. RC0 para CS.

La verdad es que no se que necesito. Tal vez solo ser leido, porque no se ni que probar ya...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 18 de Marzo de 2010, 18:08:37
Hola Bruno, disculpa que me meta, cuando te referis a error de inicialización a que te referis específicamente ? No incio la comunicación con la memoria, no detecto el formato, algún error de lectura ?
Te comento mi xps, capaz que te sirve de algo, cuando desarrolle MicroLogger lo que mas me costo fue la comunicación con la tarjeta, la parte del File System no me dio demasiado trabajo pero sometiendo todo a pruebas intensivas ( grabar / leer de a megas ) todo se volvia inestable. Las funciones de bajo nivel de lectura/escritura de bloques de la tarjeta fallaban de manera misteriosa. Después de mucho laburo las cosas que puede descubir y emparchar ( considero que fue un parche porque nunca entendí bien que pasaba )


Una vez que retoque estas cosas, para probar estabilidad hice test sobre las funciones de bajo nivel exclusivamente, ejemplos escribir/leer 10000 veces un sector y que nunca falle, Escribir/leer aleatoriamente sectores y comparar los resultados.

Espero te sirva de algo.

http://www.todopic.com.ar/foros/index.php?topic=23459.0

Saludos !



Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 18 de Marzo de 2010, 18:18:39
Hola Richi! eh! como vas a pedir disculpas por meterte? Si para eso es un foro esto, no? :)

Cuando diigo "error en la inicializacion" es que ni siquiera logro configurar inicialmente la memoria, por lo que todo apuntaria hacia un error en el hardware mas que en el soft(porque ambas librerias probadas han sido testeadas y les funcionaron a otras personas). Sin embargo no doy con la tecla. Las conexiones no son tan complejas. utilizo una fuente de PC para alimentar al PIC con 5V y 3.3V para alimentar a la memoria. Tengo un LED puesto que enciende y apaga si todo falla o parpadea 3 veces si se inicializo correctamente. No tengo lamentablemente ningun debug por RS232 porque mi notebook no tiene esa entrada.

No se por donde tengo que seguir, porque no se ya que modificar.

Cambiar la memoria?
Cambiar de PIC?
Cambiar de plegaria?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 18 de Marzo de 2010, 18:35:45
Que macana !, es dificil diagnosticar problemas cuando no se cuenta con todo el material ( osciloscopio, debugger, etc ) Yo lo que haria seria seguir el arbol de funciones de ejecución y escribir una función que haga parpadear el LED tantas veces como el numero de error. De esa manera vas a saber en que lugar del código se plancha.

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 18 de Marzo de 2010, 22:22:13
Hola Richi! eh! como vas a pedir disculpas por meterte? Si para eso es un foro esto, no? :)
Exactamente1  :lol:

mmm... Como dice Richi lo más dificil es establecer la comunicación con la memoria y como los pasos a seguir son sencillos uno no sabe para donde correr cuando falla. En el momento que comencé con esto fui variando las velocidades de SPI, le fui agregando clock de sincronización, des-habilitar la memoria en cada comando, no des-habilitarla, ect... Es una lucha!  :?

Y como dice nuevamente Richi, utiliza los led para saber hasta que punto hay comunicación o en realidad nunca la hay  :z)

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 19 de Marzo de 2010, 18:58:26
Bueno, gracias por las sugerencias. La semana que viene le entro con todo...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: MGLSOFT en 19 de Marzo de 2010, 19:00:30
Yo tengo el debugger spi de Microchip, si lo precisas te lo presto, Bruno.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 19 de Marzo de 2010, 19:18:26
Gracias Marcos! Espero que no sea necesario ;)

El problema va a ser que tambien deberia aprender a usar el debugger, no? :D :D
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: MGLSOFT en 19 de Marzo de 2010, 22:39:47
Yes, Yes !!! :D :D
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 20 de Marzo de 2010, 12:29:08
Saludos

Hola BrunoF te comento que ya llevo varios días cacharriando con la memoria y he encontrado errores muy parecidos a los que comenta el compañero RICHI777, la forma de descubrirlo fue el método que me sujuirio el compañero Suky cuando estaba en la etapa de simulación, y es ir probando función por función y así fue como detecte miles de errores  :D :D :D. La otra recomendación es hacer uno mismo las rutinas siguiendo alguna ayuda y así se va desmañarando la complicada memoria SD. Te hago una pregunta ¿Que marca de memoria estás utilizando?.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 20 de Marzo de 2010, 13:51:49
Hola Chenao. Estoy usando una microSD marca SanDisk de 1Giga.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 23 de Marzo de 2010, 04:47:33
Bueno. Estuve haciendo mas pruebas. Intentando debuggear el codigo.

El 95% de las veces, falla en la primera parte de la inicialización. Es decir acá:

Código: [Seleccionar]
do{
     if(SDCard_send_command(CMD0,0x00,Respuesta)==0){
        return(0);        // Si se recibe 0 error por timeout.-

y el 5% restante avanza un poquito:

Código: [Seleccionar]
do{
     if(SDCard_send_command(CMD0,0x00,Respuesta)==0){
        return(0);        // Si se recibe 0 error por timeout.-
     }else{i++;} 
  }while(((Respuesta&0x01)==0x00) && i<200);
  if(i>=200){return(0);} // Timeout esperando desactivación de SD Card.

Tengo hechos 3 divisores de tension conformados cada par por una resistencia de 1k en serie con cada linea y de alli 1.5k a GND.
Estoy alimentado la memoria con 3.3V directamente de la fuente, mientras que al uC lo alimento con 5V. Estoy trabajando @48Mhz. Pr obe el SPI en varios modos. Con divisor por 4 y por 16. Hacen lo mismo.

Yo me inclino hacia un error de hardware, pero vamos...que no es tan complejo, eh? Son 6 resistencias solamente... :5] :5]
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 23 de Marzo de 2010, 08:15:56
Yo me inclino hacia un error de hardware, pero vamos...que no es tan complejo, eh? Son 6 resistencias solamente... :5] :5]

Si podes armarte una plaquita sería mejor, capaz sea el proto que te juega una mala pasada  :?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 23 de Marzo de 2010, 11:22:25
Hola Bruno, un paso importante donde se para. Podrias postear el código de la función SDCard_send_command para ver como esta implementado el corte por timeout ?

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 23 de Marzo de 2010, 16:42:18
Yo me inclino hacia un error de hardware, pero vamos...que no es tan complejo, eh? Son 6 resistencias solamente... :5] :5]

Si podes armarte una plaquita sería mejor, capaz sea el proto que te juega una mala pasada  :?

Tengo una placa armada, pero como no me funciono ahi me pase al proto.

Hola Bruno, un paso importante donde se para. Podrias postear el código de la función SDCard_send_command para ver como esta implementado el corte por timeout ?

Saludos !


Hola RICHI. La libreria esta intacta como su autor(Suky) la ha hecho. Aca la dejo:

Código: C#
  1. /** \brief Envia comando a memoria SD.-
  2.    
  3.    \param cmd: Comando a enviar.-
  4.    \param arg: Argumento del comando.-
  5.    \return res: Respuesta al comando.-
  6.    \return  0 a ocurrido algún error, 1 todo ok.-
  7. */
  8. int1 SDCard_send_command(int cmd, int32 arg,int& res){
  9.  
  10.    int Trama[6]; // Comando, Argumento y CRC
  11.    int i,ResTmp;
  12.    // Construimos el paquete a enviar.-
  13.    Trama[0] = cmd | 0x40;
  14.    Trama[1] = make8(arg, 3);
  15.    Trama[2] = make8(arg, 2);
  16.    Trama[3] = make8(arg, 1);
  17.    Trama[4] = make8(arg, 0);
  18.  
  19.    if(cmd==0){
  20.       Trama[5]=0x95;
  21.    }else{  
  22.       Trama[5]=0xFF;
  23.    }
  24.    
  25.    for( i=0;i<16;i++) spi_xfer(SDCard,0xFF);
  26.    // Transfiere el paquete.-
  27.    spi_xfer(SDCard, Trama[0]);
  28.    spi_xfer(SDCard, Trama[1]);
  29.    spi_xfer(SDCard, Trama[2]);
  30.    spi_xfer(SDCard, Trama[3]);
  31.    spi_xfer(SDCard, Trama[4]);
  32.    spi_xfer(SDCard, Trama[5]);
  33.      
  34.    // // Se espera respuesta R1
  35.    i=0;
  36.    do{
  37.       ResTmp=spi_xfer(SDCard,0xFF);
  38.       i++;
  39.    }while((ResTmp&0x80)!=0 && i<200);// mientras no corresponda con 0xxxxxxx.-
  40.    if(i>=200){SDDeselect();return(0);}
  41.    res=ResTmp;  
  42.    #if RS232_DEBUG
  43.       printf("Repeticiones para respuesta de CmdXX: %u; Respuesta recibida:%u\r\n",i,Res);
  44.    #endif
  45.    return(1);
  46. }

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 23 de Marzo de 2010, 16:50:20
Yo probaria cambiando el valor 200 a un valor mucho mas grande para ver si viene por ahi. El tiempo que tarda el controlador interno de la tarjeta en inicializar todo no es nada despreciable.

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 24 de Marzo de 2010, 15:43:32
Saludos BrunoF, yo inicialmente la probé con una SD normalita que tenia un celular viejo y funciona bien, la implemente con un 16f877. Con la microsd en esas me encuentro, porque no intentas simularla en el proteus haber como sale, utilizando el debug SPI. La parte que más me saco canas fue la inicialización de la memoria lo solucione mandando los 3 comandos al mismo tiempo (resetear, inicializar y la configuración de la trama de escritura/leer), y fuí probando rutina por rutina hasta que me funciono. Espero que te halla servido los comentarios y seguire atento haber si se soluciona el problema.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 24 de Marzo de 2010, 20:50:10
Hola muchachos.

Bueno. Aca estoy anclado a ver si logro hacer "algo".

Cambie el valor RICHI, como aconsejaste a 5000 pero sigue igual. No hay manera.

He estado estudiando el datasheet de las memorias SanDisk(uso una memoria SanDisk microSD de 512MB).

En la simulacion parecia que inicializaba bien. Ahora puse el SPI debugger y hay algo que no cierra en los datos enviados. Cuando envia CMD0 por ejemplo, que es el primer comando tengo entendido: se envia segun datasheet y lo que vi del codigo de Suky confirmandolo: 0x40 0x00 0x00 0x00 0x00 0x95.

Cuando envio eso, y miro el SPI  debugger del ISIS, aparece otra cosa: 0xA0 0x00 0x00 0x00 0x00 0x02.

Imagen:

(http://img715.imageshack.us/img715/429/spidebug.png)

link a imagen: http://img715.imageshack.us/img715/429/spidebug.png

Intente ver si era un problema del SPI debugger, pero ya he toqueteado todo y sigue valiendo eso. El resto de los comandos tampoco encajan con lo que deberian ser...

Seguire investigando...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 24 de Marzo de 2010, 21:31:49
Creo que lo logré.... :-/ :-/ :-/ :-/

Ahora, no se bien cual fue la diferencia. Peeero se noto porque tambien en el SPI debugger empezaron a salir bien los valores. Voy a intentar grabar algo ahora a ver si puedo implementar el ejemplo de Suky...!!

CREO que se soluciono al sacar #USE SPI(FORCE_HW)

Gracias a todos!!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 24 de Marzo de 2010, 21:38:57
CREO que se soluciono al sacar #USE SPI(FORCE_HW)

Que extraño  :? Esperemos comience a funcionar en el hard   :-)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 24 de Marzo de 2010, 21:48:08
Sisi! Si lo probé en el hard y la inicialización al menos arranca. Ahora voy a intentar hacer algo un poco más avanzado! :D Gracias x la librería...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 24 de Marzo de 2010, 21:53:51
Bien entonces!  :-/ Queremos ver ese cartel funcionando  ;-)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 25 de Marzo de 2010, 17:44:18
Bueno, duró poco la diversión!

Iba todo excelente. En el hard se inicializaba la microSD correctamente con tu libreria Suky y con la que pensaba utilizar finalmente. Luego solo cambie las lineas de debugueo en ambas librerias(en lugar de poner "se inicializo la memoria" cambie los comentarios a los que ustedes imprimian por RS232(estoy debugueando por USB con un soft que hice)). No volvio a inicializar mas. En ninguna de las dos. Tambien cambia el comportamiento con los distintos formatos. Si formateo en ExFAT(512 bytes per sector) no me inicializaba ni siquiera cuando andaba bien.

Por otro lado nunca logre leer un bloque. Solo recibia 0xFF y debuguee el error: que resulto ser 0x01(lo que en la hoja de datos dice que seria: ERROR(digamos que no se la jugaron mucho, eh?)).

Debido a las vueltas de la vida, a mi desgracia de perder mi ICSP de mi GTP USB+ y especialmente a mi gran torpeza, anoche queme el ultimo 18F4550 que tenía al colocarlo justo al reves de lo que debia ser en el zocalo.

Hasta la proxima semana no creo que avance mucho. Ojala mis esfuerzos y reniegues le sirvan a otros al menos para orientarse.

Por lo pronto, yo hago la fácil y le echo la culpa de todo al PICC. :) :) :)



Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 25 de Marzo de 2010, 18:24:26
uuu, que problema  :( Este PICC  :P Y aparte la mala suerte de quemar el micro  :x No ha sido tu semana Bruno  :undecided:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: MGLSOFT en 25 de Marzo de 2010, 22:52:50
Bueno, duró poco la diversión!

Iba todo excelente. En el hard se inicializaba la microSD correctamente con tu libreria Suky y con la que pensaba utilizar finalmente. Luego solo cambie las lineas de debugueo en ambas librerias(en lugar de poner "se inicializo la memoria" cambie los comentarios a los que ustedes imprimian por RS232(estoy debugueando por USB con un soft que hice)). No volvio a inicializar mas. En ninguna de las dos. Tambien cambia el comportamiento con los distintos formatos. Si formateo en ExFAT(512 bytes per sector) no me inicializaba ni siquiera cuando andaba bien.

Por otro lado nunca logre leer un bloque. Solo recibia 0xFF y debuguee el error: que resulto ser 0x01(lo que en la hoja de datos dice que seria: ERROR(digamos que no se la jugaron mucho, eh?)).

Debido a las vueltas de la vida, a mi desgracia de perder mi ICSP de mi GTP USB+ y especialmente a mi gran torpeza, anoche queme el ultimo 18F4550 que tenía al colocarlo justo al reves de lo que debia ser en el zocalo.

Hasta la proxima semana no creo que avance mucho. Ojala mis esfuerzos y reniegues le sirvan a otros al menos para orientarse.

Por lo pronto, yo hago la fácil y le echo la culpa de todo al PICC. :) :) :)





Precisas un PIC18F4550??
Avisame y te lo envio!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 25 de Marzo de 2010, 23:22:42
Si, la verdad que la vengo peleando mal con las microSD... :)

Gracias Marcos! No te hagas drama que mañana mismo estoy encargando varios a Bs As.

Un abrazo. La semana que viene les cuento....
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 11 de Mayo de 2010, 13:13:34
Bueno...Otra vez al ataque con esto. Y otra vez estancado.

Creo que he dado con el problema. No me resultaría raro que fuese el CCS una vez más.

En la simulación funciona perfecto. En el hardware real, el programa queda completamente "colgado" en la función de inicialización.
Increíble porque se supone que no debería ser así.

Agregando un LED para poder apreciar lo que hace, pude deducir lo siguiente. En cualquier rutina de inicializacion de la SD, cuando se hace spi_write() el programa queda colgado.

Mirando el código asm que genera el primer spi_write(255) observo que es lo siguiente:

MOVF    SSPBUF,W
MOVLW 0xFF
MOVWF SSSPBUF,F
BTFSS   SSPSTAT,BF
BRA       0x0004B0   ;digamos que seria BRA $ - 2(recordar que en los 18F cada instruccion ocupa 2 posiciones de memoria ROM)

Y el PIC no sale jamás de eso. Lo que significa que la bandera SSPSTAT,BF jamás se setea. Todo parece indicar que es un problema del compilador al configurar el módulo SPI. Intenté varias configuraciones ya, pero sigue igual. También he vuelto a la versión 4.038 del CCS pero el problema persiste.

Alguna sugerencia o idea?

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 11 de Mayo de 2010, 13:23:45
P.D.

Estoy usando el 18F4550 en lugar del 18F2550 que todos usan, pero no me parece que sea significativa la diferencia. Obviamente reacomode los pines correspondientes.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 11 de Mayo de 2010, 15:01:37
Hola Bruno, para no depender tanto de las funciones del compilador ( que por lo que leo aca tiene muchisimas versiones y no son justamente por que le sumaron caracteristicas nuevas ) porque no las implementas vos directamente, el manejo del SPI es bastante sencillo.

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 12 de Mayo de 2010, 11:48:07
Te comento que realice un nuevo hardware con la adecuación de los niveles de tensión mediante buffer 74hc125, trabajando el interface SPI a 10 MHz sin ningun problema. El único cambio que hice fue en las esperas por alguna respuesta (while(i<100)) lo subi a 2000, y pude iniciar SD Card, microSD Kingston y SanDisck de 512Mb, 1 Gb y 2 Gb sin problemas!  :-/


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 12 de Mayo de 2010, 12:26:14
Hola Suky, osea que reemplazaste los divisores de tensión por una conversor de niveles ?

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 12 de Mayo de 2010, 20:16:53
Hola Richi. Voy a ver si hago eso que mencionas. Sino voy a ver si consigo un 18F2550 y uso un hex que funcione compilado por algun creador de la libreria porque me esta volviendo loco esto.

Suky, te comento que actualmente estoy haciendo trabajar al micro en 3.3V @ 20Mhz para eliminar ese problema. El micro funciona normal, pero del SPI ni muuu dice.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 13 de Mayo de 2010, 15:47:18
Hola Suky, osea que reemplazaste los divisores de tensión por una conversor de niveles ?

Saludos !

Exactamente.

Suky, te comento que actualmente estoy haciendo trabajar al micro en 3.3V @ 20Mhz para eliminar ese problema. El micro funciona normal, pero del SPI ni muuu dice.

Ese CCS  :5]
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: martincasalis en 15 de Mayo de 2010, 00:14:27
Amigo Suky, mis felicitaciones por toda la info compartida. Esto es un claro ejemplo del uso de un foro donde se ayuda con todo lo que dispnemos (es en alusion al otro hilo amigo) Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 15 de Mayo de 2010, 10:56:18
Amigo Suky, mis felicitaciones por toda la info compartida.
Muchas gracias!  ;-)

Esto es un claro ejemplo del uso de un foro donde se ayuda con todo lo que dispnemos (es en alusion al otro hilo amigo) Saludos.

Aja! 5 mensajes y ya estamos haciendo cuestionamientos!  :rayito: :z) Mejor comencemos a compartir  ;-)


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: nahumof en 08 de Julio de 2010, 14:33:48
hola suky gracias por todo lo aqui compartido y a todos en general por sus aportes. :-/
yo me pase de una memoria eeprom en chip spi a esta SD por capacidad de almacenamiento y analizando tu driver estaba viendo esto que no entendi para que???
Código: [Seleccionar]
   // Se fija largo del bloque lectura/escitura.
   if(SDCard_send_command(CMD16,BLOCK_SIZE,Respuesta)==0){
      return(0);
   }else if(Respuesta!=0){
      return(0);
   }
si entiendo que se tiene que fijar el tamaño del bloque pero por que los 2 regresan un return(0);

y lo segundo que me intriga es por que utilizas spi_xfer y ese tipo de comandos si ccs ya no los recomienda...algun motivo en particular que nos oculta ccs. :?

gracias
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 09 de Julio de 2010, 15:05:45
Los 2 no retornan a 0, solo si la SDCard_send_command retorna cero (0) o sí la respuesta es distinta de cero (0), en caso contrario continua con el programa.

En su momento utilicé xfer para identificar el bus SPI por si se utilizaba más de 1.

Por aquí  (http://www.ucontrol.com.ar/forosmf/programacion-en-c/sd-card-libreria-fat16-libreria-a-nivel-hardware-(ccs-c18-c30-ect-)/msg32276/?topicseen#msg32276) hay una versión actualizada que no depende del compilador.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 23 de Julio de 2010, 09:08:53
Suky, qué cristal has usado en las librerías??

He cambiado el pic del ejemplo a un 18f2550 y las líneas a las suyas y no tengo respuesta de la memoria  :5]
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 23 de Julio de 2010, 10:22:35
Hola perdon que me meta. Para mi existe un grado intermedio entre las E2PROMs y dispositivos de almacenamiento masivo como son las MMC/SD/CF con respecto a la capacidad y son las NOR SPI. Te paso algunos links de fabricantes por si te interesan.

NOR
http://numonyx.com/en-US/MemoryProducts/NORserial/Pages/M25P.aspx

PCM
http://numonyx.com/en-US/MemoryProducts/PCM/Pages/P5Q.aspx

Estas ultimas recien se estan empezando a comerncializar y son un buen sustituto a las tradicionales NOR/NAND en bajas capacidades.

Saludos !

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 23 de Julio de 2010, 10:38:13
Suky, qué cristal has usado en las librerías??

He cambiado el pic del ejemplo a un 18f2550 y las líneas a las suyas y no tengo respuesta de la memoria  :5]

Si que no tienes suerte  :( Los he puesto a 48 MHz en los 18Fx550 y a 40 MHz los 18Fx620.

Por aquí (http://www.infopic.comlu.com/joomla/index.php?option=com_content&view=article&id=61&Itemid=90) tienes una librería actualizada que la puedes utilizar en C18 o CCS.

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 23 de Julio de 2010, 19:44:45

Hola Suky.

No paras de trabaja, que te traes entre manos que no paras y no paras de cacharrear. El proyecto de la sd lo tengo olvidado ya tengo todo los elementos y ya he soldado una tarjetica pero todavía no hago las pruebas. hace un mes un profesor de la facultad me regalo un 18f4550 y todavía no lo miro apenas termine de trabajar (usual en período de vaciones) sigo adelante con la sd.

Saludos y espero alcansarte algun día :D.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 26 de Julio de 2010, 04:15:39
gracias suky!

voy a probarlo :? :? :?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 26 de Julio de 2010, 07:06:38
Seguimos con las mismas....

He visto 2 cosas, si activas el debugg en c18 te da error por los if, que no tienes puesto ifdef.

Y lo otro, ejecutando paso a paso, veo que al iniciar la tarjeta cuando termina el InitSPI salta al inicio de la función de iniciar la tarjeta. Y nunca llega a enviar el printf("\r\n--> Se inicia sincronizacion\r\n");

Las sd y mmc son mi unicornio, definitivamente....
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BrunoF en 26 de Julio de 2010, 11:53:20
Las sd y mmc son mi unicornio, definitivamente....

También los fueron en mi caso. Tuve que retirarme  para reagruparme nuevamente varias veces antes de poder hacerlas arrancar. En mi caso específico fue más que nada la memoria  SanDisk que no funcionaba. Te recomiendo que empieces con una Kingston si tenés.

Por otro lado, si cambiaste de PIC, fijate que los pines fisicos del SPI cambian. Asegurate que todo en el hard y soft esté modificado como corresponda.



Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 26 de Julio de 2010, 12:05:12
Gracias Bruno,

kingstom no tengo, pero si es por eso busco y rebusco hasta encontrar una!!


Lo de los Pines del SPI no es, por desgracia....
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 27 de Julio de 2010, 08:27:19
Los he puesto a 48 MHz en los 18Fx550 y a 40 MHz los 18Fx620.

Suky, ¿has cambiado la configuración de algo para los 48mhz? Estoy usando un 18f2550  y he puesto los fuses para que trabaje a 48MHz. Lo que no sé es si la configuración que tienes hecha en el ejemplo de 40MHz vale o la tengo que cambiar.

Un saludo!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 27 de Julio de 2010, 11:31:44
Avances  :-/ :-/


HE probado el código que me pasaste hace tiempo de CCS y funcionan todas las tarjetas, tanto las MMC como las SD. Estas últimas eran las que no conseguí hacer funcionar Y NO HE HECHO NADA!!!!

Creo que era culpa de una soldadura fría, por eso funcionaba alguna que otra vez....

Ahora, ¿porqué no lo consigo con la fat?

Me voy a poner con ccs y ya miraré el c18...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 27 de Julio de 2010, 11:33:01
por cierto suky una gran web!!!!

me has aclarado las dudas que me quedaban en este tema....

Voy a agregar un enlace de la mía a la tuya (si no te importa)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 27 de Julio de 2010, 12:05:38
Los he puesto a 48 MHz en los 18Fx550 y a 40 MHz los 18Fx620.

Suky, ¿has cambiado la configuración de algo para los 48mhz? Estoy usando un 18f2550  y he puesto los fuses para que trabaje a 48MHz. Lo que no sé es si la configuración que tienes hecha en el ejemplo de 40MHz vale o la tengo que cambiar.

Un saludo!!

No se debería hacer ningún cambio, o por lo menos yo no lo he hecho.

Avances  :-/ :-/


HE probado el código que me pasaste hace tiempo de CCS y funcionan todas las tarjetas, tanto las MMC como las SD. Estas últimas eran las que no conseguí hacer funcionar Y NO HE HECHO NADA!!!!

Creo que era culpa de una soldadura fría, por eso funcionaba alguna que otra vez....

Ahora, ¿porqué no lo consigo con la fat?

Me voy a poner con ccs y ya miraré el c18...

Excelente!  :-/ Me gustaría que compares con la ultima versión, agregué más demora en la espera de una respuesta por parte de la memoria, o sea do{}while(i<200) quedo como do{}while(i<2000).

por cierto suky una gran web!!!!

me has aclarado las dudas que me quedaban en este tema....

Voy a agregar un enlace de la mía a la tuya (si no te importa)

Claro que no hay problemas, y yo hago lo mismo!  :mrgreen:


Saludos!

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 27 de Julio de 2010, 12:33:57
pues he visto que con el de las fat me manda por el 232   printf("\r\n--> Se inicia sincronizacion\r\n"); y ya no me envía          printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n\r\n"); como si se resetease y tengo el wdt desactivado....
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 29 de Julio de 2010, 19:20:19
pues he visto que con el de las fat me manda por el 232   printf("\r\n--> Se inicia sincronizacion\r\n"); y ya no me envía          printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n\r\n"); como si se resetease y tengo el wdt desactivado....


:undecided: Se resetea, o sale de la rutina pero no hay otro printf que indique ha sucedido eso? Es raro que iniciandose con el otro código falle en este  :?

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 30 de Julio de 2010, 03:17:26
Envía printf("\r\n--> Se inicia sincronizacion\r\n"); y se reinicia la rutina SDCard_init

Es algo muy extraño
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: msegredo en 30 de Julio de 2010, 07:59:12
Te comento que realice un nuevo hardware con la adecuación de los niveles de tensión mediante buffer 74hc125, trabajando el interface SPI a 10 MHz sin ningun problema. El único cambio que hice fue en las esperas por alguna respuesta (while(i<100)) lo subi a 2000, y pude iniciar SD Card, microSD Kingston y SanDisck de 512Mb, 1 Gb y 2 Gb sin problemas!  :-/


Saludos!

Podes subir el circuito? muchas gracias. A partir de que velocidad sería necesario? Gracias una vez mas
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 30 de Julio de 2010, 08:13:50
Suky, te puedo decir exáctamente lo que hace

Código: [Seleccionar]
  #if RS232_DEBUG
         printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n\r\n");
   #endif

   i=0;
   do{
      if(SDCard_send_command(CMD0,0x00,&Respuesta)==0){
         return(0);        // Si se recibe 0 error por timeout.-
      }else{i++;}   
   }while((Respuesta.b0==0x00) && i<2000);
   if(i>=2000){return(0);} // Timeout esperando desactivación de SD Card.

salta en el return(0);

msegredo lo tienes aqui (http://www.ucontrol.com.ar/forosmf/programacion-en-c/sd-card-libreria-fat16-libreria-a-nivel-hardware-%28ccs-c18-c30-ect-%29/msg32276/?topicseen#msg32276)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: msegredo en 30 de Julio de 2010, 23:53:27
Suky, te puedo decir exáctamente lo que hace

Código: [Seleccionar]
  #if RS232_DEBUG
         printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n\r\n");
   #endif

   i=0;
   do{
      if(SDCard_send_command(CMD0,0x00,&Respuesta)==0){
         return(0);        // Si se recibe 0 error por timeout.-
      }else{i++;}   
   }while((Respuesta.b0==0x00) && i<2000);
   if(i>=2000){return(0);} // Timeout esperando desactivación de SD Card.

salta en el return(0);

msegredo lo tienes aqui (http://www.ucontrol.com.ar/forosmf/programacion-en-c/sd-card-libreria-fat16-libreria-a-nivel-hardware-%28ccs-c18-c30-ect-%29/msg32276/?topicseen#msg32276)

muchas gracias Slalen, entonces se utilizan 2  74HC125, uno para los niveles 3.3 y otro para dejar los niveles en 5. Comunicación par un lado y para el otro.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 31 de Julio de 2010, 12:29:15
Suky, te puedo decir exáctamente lo que hace

Código: [Seleccionar]
  #if RS232_DEBUG
         printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n\r\n");
   #endif

   i=0;
   do{
      if(SDCard_send_command(CMD0,0x00,&Respuesta)==0){
         return(0);        // Si se recibe 0 error por timeout.-
      }else{i++;}   
   }while((Respuesta.b0==0x00) && i<2000);
   if(i>=2000){return(0);} // Timeout esperando desactivación de SD Card.

salta en el return(0);

msegredo lo tienes aqui (http://www.ucontrol.com.ar/forosmf/programacion-en-c/sd-card-libreria-fat16-libreria-a-nivel-hardware-%28ccs-c18-c30-ect-%29/msg32276/?topicseen#msg32276)


Entonces no se recibe la respuesta adecuada, o sea la memoria no pasa al estado IDLE según se testea, pero porque!  :( Partiendo del código que ya funciona puedes ir agregando algunas funciones de FAT, por ejemplo unicamente la de Init_FAT, para detectar el posible inconveniente   :undecided:


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 02 de Agosto de 2010, 02:35:36
Pero yo creo que no afectan las demás funciones!!

Me falla aquí:
Código: [Seleccionar]
BOOL SDCard_init(void){

   UINT8_VAL Respuesta;
   UINT16 i;
   
   TRIS_SD_CS=0;
   SD_CS=1;
   
   // Configuración del Módulo SPI.-
   InitSPI();
   
  #if RS232_DEBUG 
      printf("\r\n--> Se inicia sincronizacion\r\n");
   #endif   
   SD_CS=1;
   Delay_ms20();
   for(i=0;i<20;i++) WriteMedia(0xFF);   // Para sincronización.
   SD_CS=0;
   Delay_ms20();
   #if RS232_DEBUG
         printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n\r\n");
   #endif

   i=0;
   do{
      if(SDCard_send_command(CMD0,0x00,&Respuesta)==0){
         return(0);        // Si se recibe 0 error por timeout.-
      }else{i++;}   
   }while((Respuesta.b0==0x00) && i<2000);

He ido modificando los intentos para dejarlos igual que en el otro código. Ahora mismo está exacto, pero no va....
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 02 de Agosto de 2010, 11:13:07
Como dice Bruno, hay que ver si hay señal en los pines SPI de la memoria y el PIC, y sin son correctos, porque en la programación no se me ocurre que tocar  :?


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 03 de Agosto de 2010, 02:43:00
Tengo señal en el clock, en el chip select y en las líneas cardetect y writeprotect, pero no tengo ni en sdi ni sdo.

¿Pero de éstas líneas no se encarga el picc?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 03 de Agosto de 2010, 14:10:46
O sea que al realizar un spi_write se genera la señal de clock pero no hay señal en SDO? El compilador se encarga de configurar el módulo SPI, pero si hay algún tipo de error (bug de la versión) no vamos a tener los resultados deseados.  :?


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 04 de Agosto de 2010, 02:21:08
Suky, ¿qué versión usas tú?

Yo estoy con la 4.105

Si es eso, con C18 debería tirar.... o voy a probar
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 04 de Agosto de 2010, 05:56:38
Pues con c18 me hace lo mismo.... esto no lo entiendo!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 04 de Agosto de 2010, 10:57:11
 :oops: Me vas a querer asesinar! Pensé que en la configuración de las librerías que deje en la página tenia Fosc/16 (Lo tenia presente de dejarlo así  :? ) para que en la configuración del SPI no se supere los 10 MHz máximos que según datasheet soporta  :oops: Pasa a Fosc/16 o SPI_FOSC_16, o también puedes configurar el microcontrolador a menor velocidad.

Disculpas  :oops:  Saludos!

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 04 de Agosto de 2010, 11:18:12
:oops: Me vas a querer asesinar! Pensé que en la configuración de las librerías que deje en la página tenia Fosc/16 (Lo tenia presente de dejarlo así  :? ) para que en la configuración del SPI no se supere los 10 MHz máximos que según datasheet soporta  :oops: Pasa a Fosc/16 o SPI_FOSC_16, o también puedes configurar el microcontrolador a menor velocidad.

Disculpas  :oops:  Saludos!



jajajaajaajjajajaja si sólo es eso no te mato  :mrgreen: :mrgreen: :mrgreen:

mañana lo pruebo y te cuento.

muchas gracias suky!!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 05 de Agosto de 2010, 03:50:45
Suky no es eso, ya lo había cambiado y no te había dicho nada  :oops: :oops: :oops:

Tanto en CCS como en C18 no envía nada.

He modificado el programa que me funciona y le he incluido la librería fat y me va.

Y también he modificado el que no me funciona cambiando las funciones de inicialización, envío de bloques... por las del programa que me funciona Y NO VA!!!!!!!!!!!!!

subo los dos para que le eches un vistazo. De todas formas seguiré buscando donde la estoy cagando...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 05 de Agosto de 2010, 10:46:28
En el que funciona tenes cosas mal  :mrgreen:
Hay muchos:
Código: C
  1. }while((.........) && (i<100));
  2.    if(i>=2000){return(0);} // Timeout

En donde por más que la respuesta no sea adecuada sigue adelante con la rutina (i<100 y i>=2000)  :? Entonces la rutina se ejecuta pero capaz que nunca se inicia la memoria  :undecided:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 06 de Agosto de 2010, 02:22:27
ya lo tenía corregido  :oops: :oops:

No me di cuenta de que era el anterior....
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 11 de Agosto de 2010, 04:44:17
Suky, la función de abrir un archivo, tienes que poner la carpeta, a mi sólo me los abre si pones la dirección de la carpeta y no el nombre. Pero mirando dentro de la función, llamas a la búsqueda.

o sea si pongo esto:
Código: [Seleccionar]
strcpy(&NombreCorto[0],"CARPET~1");
            strcpy(&NombreLargo[0],"Carpeta de PIC");
            UbicacionFolder=FAT_CreateDirectory(&NombreLargo[0],&NombreCorto[0],DirectorioRaiz);
           
            strcpy(&NombreCorto[0],"ARCHIV~1.txt");
            strcpy(&NombreLargo[0],"Archivo con PIC.txt");
            FAT_CreateFile(&NombreLargo[0],&NombreCorto[0],UbicacionFolder,&Texto[0]);
            FAT_OpenAddFile(&NombreCorto[0],UbicacionFolder,&Texto[0]);   

FAT_OpenFile(&NombreCorto[0],UbicacionFolder);
Me lo abre.

Pero si pongo esto:

Código: [Seleccionar]
strcpy(&NombreCorto[0],"CARPET~1");
            strcpy(&NombreLargo[0],"Carpeta de PIC");
            UbicacionFolder=FAT_CreateDirectory(&NombreLargo[0],&NombreCorto[0],DirectorioRaiz);
           
            strcpy(&NombreCorto[0],"ARCHIV~1.txt");
            strcpy(&NombreLargo[0],"Archivo con PIC.txt");
            FAT_CreateFile(&NombreLargo[0],&NombreCorto[0],UbicacionFolder,&Texto[0]);
            FAT_OpenAddFile(&NombreCorto[0],UbicacionFolder,&Texto[0]);   

strcpy(&NombreCorto[0],"PIC.txt");
FAT_OpenFile(&NombreCorto[0],DirectorioRaiz);
No me hace ni caso!!

Tengo algo mal??

No podré mirar nada hasta septiembre, que me voy de vacaciones!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 11 de Agosto de 2010, 10:54:06
Lo que primero haces es crear una carpeta, y te devuelve la dirección donde fue creada (UbicacionFolder). Dentro de esa carpeta tu creas un archivo, porque le indicas que lo guarde en la ubciación de la carpeta creada: FAT_CreateFile(&NombreLargo[0],&NombreCorto[0],UbicacionFolder,&Texto[0]);

Por eso cuando tu quieres abrir el archivo y colocas: FAT_OpenFile(&NombreCorto[0],DirectorioRaiz); no lo abre dado que busca en el directorio raíz, y no en la carpeta donde fue creado.




Saludos y Felices Vacaciones!!  :-/
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: PICPOWER en 15 de Noviembre de 2010, 07:33:35
Saludos foreros de todopic.

Disculpen, pero no logro entender del todo los problemas que tienen. Pareciera que algunos tienen problemas en la SD y otros en la FAT.

Les comento que por fin pude echar a andar mi tarjeta SD en modo SPI. Lo hice con las librerías de Suky y de chenao. Pero al final tenían un error, al menos las que encontré. El error no fue nada fácil de detectar, de hecho, sólo lo pude ver con la hoja de especificaciones de protocolo de SD v1.0 y mi logger digital. Con el logger observé todas las respuesta de la SD, pues parece que difieren a los tiempos de respuesta de Proteus. Al final con pequeños cambios lo logré. Pero bueno, sigo sin entender si ustedes ya tienen una librería al 100 para las SD por SPI. Y es que buscando por el foro no encontré nada. Y de lo que encontraba no inicializaba o hacía malas escrituras... o a veces escribía y a veces no ( tiempos de respuesta ). En fin, si a alguien le sirve, le puedo compartir mi librería.

Por cierto, me urgía tener esa librería porque estoy levantando una Base de Datos con ella y un PIC18F4620 ( fue de lo único que dio el ancho). Con todo y métodos de búsqueda :D .

Saludos desde México.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Slalen en 15 de Noviembre de 2010, 09:03:41
Hombre Picpower, si la puedes subir mucho mejor XD

Mis problemas son de respuesta de la SD
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 15 de Noviembre de 2010, 11:53:26
Hola PicoPower, felicitaciones !!!, seria muy interesante que detalles los problemas que encontraste.

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 15 de Noviembre de 2010, 12:15:18
Exacto! Sería muy interesante que des detalles de los problemas y soluciones. Así se puede mejorar lo ya expuesto, que por lo menos a nosotros, nos funciona bien  :mrgreen:


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 15 de Noviembre de 2010, 12:20:15
Hola, como comentario, me parece mas interesante detallar que comandos y respuestas corregiste sin hacer tanto hincapié en la plataforma o lenguaje ya que implemente acceso a FAT pero en un micro FreeScale y tuve algunos problemas en el acceso a la memoria que fueron enmascarados pero nunca pude encontrar el porque del mismo ya que no cuento con herramientas sofisticadas como parece que vos tenes.

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: samshiel_pic en 28 de Noviembre de 2010, 09:36:25
Hola chicos estoy montando el esquematico basico( esquemaA) y tengo una duda: ¿donde va conectado el pin CS al pic? Es que estan todas las otras salidas (SDI, SDO, SCK) pero no se donde va conectado CS.

(http://www.micros-designs.com.ar/wp-content/uploads/2010/09/esquematicoA.png)

Gracias.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 28 de Noviembre de 2010, 10:22:40
El pin CS, como cualquier otro dispositivo SPI, es controlado por cualquier pin I/O del microcontrolador.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: samshiel_pic en 28 de Noviembre de 2010, 11:48:45
Gracias Suky ya lo conecté a RC0. Pero tengo otra pregunta ya que no he caido antes yo estoy haciendo la prueba con un pic que trabaja a 3,3v. Si esto es asi no tengo por que utilizar las resistencias, ¿tendria que conectar las salidas directas desde la tarjeta mmc hasta el pic sin dichas resistencias?

gracias.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 28 de Noviembre de 2010, 13:10:32
Gracias Suky ya lo conecté a RC0. Pero tengo otra pregunta ya que no he caido antes yo estoy haciendo la prueba con un pic que trabaja a 3,3v. Si esto es asi no tengo por que utilizar las resistencias, ¿tendria que conectar las salidas directas desde la tarjeta mmc hasta el pic sin dichas resistencias?

gracias.


Exactamente, el uso de las resistencias o buffer es para adecuar los niveles de tensión.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: samshiel_pic en 06 de Diciembre de 2010, 13:37:42
Hola chicos llevo bastante tiempo intentando inicializar la MMC y no lo consigo. Tengo una duda y es la siguiente:


Lo digo por esto(de UCONTROL Suky  ;-)):
Citar
Re: Manejo de Memoria SD con CCS-Librería nivel Hardware + FAT16.-
« Respuesta #74 : Enero 22, 2010, 08:26:49 »   

Hola a todos, estamos haciendo un sistema de adquisicion de datos y consiste presisamente en almacenarlos en una SD, estube chequeando sus programas y no se por que no me funciona. El cristal que estoy utilizando es de 12 Mhz y modifico la division del PLL del SPI para que en lugar de que la divida por 16 la divide por 4, tiene algo que ver eso? es que no pude conseguir un cristal de 48 MHz, o tengo que realizar alguna otra modificación?


Re: Manejo de Memoria SD con CCS-Librería nivel Hardware + FAT16.-
« Respuesta #75 : Enero 22, 2010, 10:34:29 »   

  Podes colocarle cualquier cristal externo hasta 20MHz, luego tienes que configurar el PLL para que trabaje a 48MHz. Revisa por aquí al respecto.

Luego para cambiarle a división por 4 en la velocidad SPI deberías implementar otra forma la adaptación de tensiones, mmm... no se si funcionará adecuadamente con los resistores.

Un saludo.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 06 de Diciembre de 2010, 13:43:33
Si usas el PLL debes leer las especificaciones de cual es la máxima velocidad del Clock SPI posible, ronda entre los 10 MHz, me parece  :? Igual, prueba inicializando a una velocidad bien baja, y luego aumenta la velocidad. Es cosa de ir probando  :undecided:


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: fededecba en 12 de Febrero de 2011, 17:55:22
Hola Suki  y a todos,
estoy utilizando la libreria recientemente bajada desde la pág, y no pude hacer funcionar mi SD en el PCB que hice.

El tema es que estoy tratando de debuguear para ver en que estoy fallando y me salta un error durante la compilación (MPLAB+CCS):

En la línea 74 del archivo SDCardSPI.c dice

Código: [Seleccionar]
printf("Repeticiones para respuesta de CmdXX: %u; Respuesta recibida:%u\r\n",i,ResTmp.Val);
Y en la compilación me tira el error
Código: [Seleccionar]
*** Error 114 "D:\Temp\Fede\LIB_SD_FAT16\SDCardSPI.c" Line 74(91,94): Printf format type is invalid  ::

Revisando un poco, la definición de la función es correcta, ya que ResTmp.Val es UINT8...

Alguien me podría dar una mano con esto ? Gracias de antemano

Por cierto, en que estado de desarrollo esta esta librería ? Es 100% funcional ?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 12 de Febrero de 2011, 18:10:23
Ya ni me acuerdo, pero i no era de 16-bits? si es el caso tienes que colocar lu.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: fededecba en 12 de Febrero de 2011, 18:13:01
Ya ni me acuerdo, pero i no era de 16-bits? si es el caso tienes que colocar lu.


Saludos!

Jaj, tenías razon ! Gracias, yo me habia encerrado la cabeza con ResTmp.Val...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Vicerall en 21 de Febrero de 2011, 12:55:14
SUKY GRACIAS POR COMPARTIR LA LIBRERIA ES UN GRAN APORTE A LA COMUNIDAD.

MI CONSULTA ES LA SIGUIENTE.

INTENTE CAMBIAR EL TAMAÑO DEL BLOQUE 512 A LA MITAD 256. DONDE DEFINES ESTE.
PERO EL ASUNTO ES QUE AL DESIGNARLE ESTE NUEVO TAMAÑO LA FUNCION SDCard_write_block(), NO RESPONDE BIEN.

HAY UNA PARTE DEL CODIGO QUE NO PUEDO ENCONTRAR PARA HACER LA MODIFICACION QUIZAS ESA SEA LA FALLA.
Código: [Seleccionar]
int inicializacion_mmc()
  {
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0xFF);
      }
    OUTPUT_LOW(PIN_C2);
      {
        SPI_WRITE(0xFF);
      } 
    i = 0; 
    do
      {     
        SPI_WRITE(0x41);         // Envia comando hasta que de la respuesta y hasta que se cumpla el tiempo
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0xFF);            // Secuencia del comando CMD1
        i= i + 1;
      }
    while(i<250 && mmc_respuesta(0x00)==1);
    if(i==250)
      {
        return 1;                // si se supera el tiempo de respuesta no se ha inicializado bien la targeta
      }
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<16; i++)          // Alguno cloks para estabilizar la comunicación
      {
        SPI_WRITE(0xFF);
      }
    OUTPUT_LOW(PIN_C2);
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0XFF);
      } 
    SPI_WRITE(0x50);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);// AQUI SE DEFINE 0X200 O 512<-------------------- [b]AQUI[/b]
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);              // Comando CMD16 para configurarlo de 512 bytes
    if(mmc_respuesta(0x00)==1)
      {
        return 1;                // se ha inicializado incorrectamente
      }
        OUTPUT_HIGH(PIN_C2);
        return 0;                // se ha inicializado correctamente
  }

ESTOY USANDO LA ULTIMA VERSION DE LA LIBRERIA EN CCS, SOLAMENTE LA LIBRERIAS SD, NO ESTOY OCUPANDO EL FAT16, YA QUE NO ME ERA NECESARIO PARA LA IMPLEMENTACION.

DE ANTEMANO AGRADEZCO LA RESPUESTA
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 21 de Febrero de 2011, 12:58:31
Primero que nada dale una leída a la reglas del foro, no se debe escribir todo en mayuscula.  ;-)

Para la operación de escritura, el único largo de bloque válido es 512, si se coloca cualquier otro valor causará un error de escritura.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: javierexe22 en 06 de Mayo de 2011, 14:06:29
Hola amigos, quiero empezar a experimentar con las Memorias SD usando la librería que desarrollo suky, pero me surge un problema de hardware, resulta que quiero usar una placa entrenadora con un 18F4550, y en la misma ya tengo conectado el pin RC7/RX/DT/SDO a un dispositivo, por lo tanto no tengo acceso a SDO. Dado que el CCS proporciona control software del SPI y de la USART. Creen puedo definir o asignarle otro pin a SDO sin tener problemas mayores?
Tengo entendido que el modulo se podría configurar usando: #Use_SPI(DI=PIN_B0, DO=PIN_C5, CLK=PIN_B1,BITS=8)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 06 de Mayo de 2011, 14:36:40
En ese caso no utilizas el módulo MSSP del microcontrolador, sino que la comunicación se realiza por software. No creo que genere ningún problema, pero se reduce notablemente la velocidad en la comunicación SPI.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: javierexe22 en 06 de Mayo de 2011, 16:14:55
En ese caso no utilizas el módulo MSSP del microcontrolador, sino que la comunicación se realiza por software. No creo que genere ningún problema, pero se reduce notablemente la velocidad en la comunicación SPI.


Saludos!

Ufa... bueno, tendré que probar para ver si se ajusta a mis necesidades. Gracias por la pronta respuesta, muy buen trabajo el que realizaste.

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Agustina en 02 de Agosto de 2011, 12:05:20
Hola Sucky, la verdad que muy bueno tu aporte.

Te ago una consulta. Esoty probando con una memoria SD duracell de 4GB (SDHC). Probe con tu libreria y con la de CCS y ninguna me funciona.

Esta conectada al puerto SPI por hardware, todo a 3.3.

El pic que uso es un 18F2680 a 20mhz.

si tienes alguna sugerencia sera bienvenida!

gracias!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 02 de Agosto de 2011, 12:08:13
Las SDHC soportan SPI ? Me parece que no, como máximo siempre se trabajó con memorias hasta 2Gb



Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Modulay en 03 de Agosto de 2011, 10:18:26
Lo soportan, pero tienen requerimientos distintos en la inicialización.
Es decir, se inicializan de forma ligeramente diferente a como se hace con las tarjetas de baja capacidad.
Otra cosa que no se es si CCS implementa dicha posiblidad.
Este diagrama puede ser de ayuda:

Diagrama SD/MMC (http://elm-chan.org/docs/mmc/sdinit.png)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 03 de Agosto de 2011, 13:12:05
Lo soportan, pero tienen requerimientos distintos en la inicialización.
Es decir, se inicializan de forma ligeramente diferente a como se hace con las tarjetas de baja capacidad.
Otra cosa que no se es si CCS implementa dicha posiblidad.
Este diagrama puede ser de ayuda:

Diagrama SD/MMC (http://elm-chan.org/docs/mmc/sdinit.png)

El enlace me re-dirige a yahoo.com.ar  :shock:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 03 de Agosto de 2011, 13:26:49
A mi también, copie el enlace a otra solapa y funciono. Es un diagrama de flujo de como deberia ser la inicialización para detectar todos los tipos de tarjetas.

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Modulay en 03 de Agosto de 2011, 13:59:27
A ver si así se puede ver de forma directa

(http://elm-chan.org/docs/mmc/sdinit.png)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Modulay en 03 de Agosto de 2011, 14:09:45
vaya, al principio se veía la imagen incrustada y ahora no.
Que cosa más rara.
Adjunto la imagen
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 03 de Agosto de 2011, 14:13:15
A mi también, copie el enlace a otra solapa y funciono. Es un diagrama de flujo de como deberia ser la inicialización para detectar todos los tipos de tarjetas.

Saludos !
A! Si ya se de que se trata, creo que la librería de Microchip lo implementa. O en la del mbed, en algún lado la vi  :mrgreen:


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Modulay en 03 de Agosto de 2011, 14:16:30
La de Microchip efectivamente soporta también las tarjetas HC
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 24 de Septiembre de 2011, 23:34:28
Buenas! Actualice la librería para que pueda inicializar memorias HC  ;-) Información: SD Specifications  2.00 (https://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf)

Código: C
  1. /** \file SDCardSPI.h
  2.    \version: 1.0
  3.    
  4.    \brief Este fichero contiene definiciones de libreria para manejo de memoria SD a nivel hardware.
  5.    
  6.    \author Suky.
  7.    \web www.micros-designs.com.ar
  8.    \date 19/06/10
  9.    
  10. ///////////////////////////////////////////////////////////////////////////
  11. ////                                                                   ////
  12. ////                                                                   ////
  13. ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
  14. //// Este código puede ser usado, modificado y distribuido libremente  ////
  15. //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
  16. ////                                                                   ////
  17. ////                                                                   ////
  18. ///////////////////////////////////////////////////////////////////////////
  19.  
  20. *- Version Log --------------------------------------------------------------_*
  21.  *   Fecha       Autor                Comentarios                             *
  22.  *----------------------------------------------------------------------------*
  23.  * 25/10/09      Suky     Original (Rev 1.0) CCS                              *
  24.  * 01/05/10      Suky     Se agrega mas espera en respuesta a un comando      *    
  25.  * 19/06/10      Suky     Se agrega archivo GenericTypeDefs.h, HardwareSPI y..*
  26.  *                        ..se modifican funciones para hacer compatible la.. *
  27.  *                        ..libreria con otros compiladores. Probado en C18.- *  
  28.  * 24/09/11              Suky     Se agrega soporte memorias HC v1.x y v2.x           *
  29.  *----------------------------------------------------------------------------*
  30. */
  31. #ifndef __SDCardSPI_H
  32. #define __SDCardSPI_H
  33. #if defined(__PCH__)
  34.         #include "HardwareSPI.c"
  35. #else
  36.         #include "HardwareSPI.h"
  37. #endif
  38.  
  39. #include "GenericTypeDefs.h"
  40.  
  41. // Realiza debugger mediante RS232.-
  42. #define SDCARD_DEBUG
  43.  
  44. #if defined(SDCARD_DEBUG)
  45.         #if defined(__18CXX) || defined (__C30__) || defined (__PIC32MX__)
  46.                 #include <usart.h>
  47.                 #include <stdio.h>
  48.         #endif
  49. #endif
  50.  
  51. // Definción de comandos
  52. #define CMD0 0       // Resetea la SD Card.-
  53. #define CMD1 1       // Activa proceso de inicialización de SD Card.
  54. #define CMD8 8
  55. #define CMD9 9       // Lectura registro CSD.-
  56. #define CMD10 10     // Lectura registro CID.-
  57. #define CMD16 16     // Selecciona largo del bloque para lectura/escritura (1 a 512)
  58. #define CMD17 17     // Lectura de un único bloque.
  59. #define CMD24 24     // Escritura de un único bloque.
  60. #define CMD41 41
  61. #define CMD55 55
  62. #define CMD58 58
  63. #define CMD59 59     // Enciende/Apaga CRC.
  64. #define CMD32 32     // Setea dirección  del primer bloque a borrar.-
  65. #define CDM33 33     // Setea dirección del último bloque en un continuo rango a borrar.-
  66. #define CMD38 38     // Borra todos los sectores entre las direcciónes establecidas.-
  67.  
  68. #define BLOCK_SIZE 512 // Tamaño del bloque de lectura/escritura.
  69.  
  70. /** \brief Inicialización de SD Card
  71.  
  72.    \param Ninguno
  73.    \return 1 si se ha iniciado correctamente, 0 caso contrario.
  74. */
  75. BOOL SDCard_init(void);
  76. /** \brief Realiza lectura de un bloque.-
  77.    
  78.    \param Address: Direccion del sector.-
  79.    \return Buffer: Buffer donde se almacena lectura de memoria.-
  80.    \return  0 a  ocurrido algún error, 1 todo ok.-
  81. */
  82. BOOL SDCard_read_block(UINT32 Address,UINT8 *Buffer);
  83. /** \brief Realiza escritura de un bloque.-
  84.    
  85.    \param Address: Direccion del sector.-
  86.    \param Buffer: Buffer a escribir en memoria.-
  87.    \return  0 a ocurrido algún error, 1 todo ok.-
  88. */
  89. BOOL SDCard_write_block(UINT32 Address,UINT8 *Buffer);
  90.  
  91. /** \brief Realiza lectura del registro CSD.-
  92.    
  93.    \param Ninguno
  94.    \return  0 a ocurrido algún error, 1 todo ok.-
  95. */
  96. BOOL SDCard_read_CSD(void);
  97. /** \brief Realiza lectura del registro CID.-
  98.    
  99.    \param Ninguno
  100.    \return  0 a ocurrido algún error, 1 todo ok.-
  101. */
  102. BOOL SDCard_read_CID(void);
  103. #endif

Código: C
  1. /** \file SDCardSPI.c
  2.    \version: 1.0
  3.    
  4.    \brief Este fichero contiene definiciones de libreria para manejo de memoria SD a nivel hardware.
  5.    
  6.    \author Suky.
  7.    \web www.micros-designs.com.ar
  8.    \date 19/06/10
  9.    
  10. ///////////////////////////////////////////////////////////////////////////
  11. ////                                                                   ////
  12. ////                                                                   ////
  13. ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
  14. //// Este código puede ser usado, modificado y distribuido libremente  ////
  15. //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
  16. ////                                                                   ////
  17. ////                                                                   ////
  18. ///////////////////////////////////////////////////////////////////////////
  19.  
  20. *- Version Log --------------------------------------------------------------_*
  21.  *   Fecha       Autor                Comentarios                             *
  22.  *----------------------------------------------------------------------------*
  23.  * 25/10/09      Suky     Original (Rev 1.0) CCS                              *
  24.  * 01/05/10      Suky     Se agrega mas espera en respuesta a un comando      *    
  25.  * 19/06/10      Suky     Se agrega archivo GenericTypeDefs.h, HardwareSPI y..*
  26.  *                        ..se modifican funciones para hacer compatible la.. *
  27.  *                        ..libreria con otros compiladores. Probado en C18.- *  
  28.  * 24/09/11              Suky     Se agrega soporte memorias HC v1.x y v2.x           *
  29.  *----------------------------------------------------------------------------*
  30. */
  31. #include "SDCardSPI.h"
  32.  
  33. #define SDCARD_TIMEOUT                  5000
  34. #define SDCARD_MODO_NORMAL              0x10
  35. #define SDCARD_MODO_HC                  0x20
  36. typedef struct{
  37.         union{
  38.                 UINT8   Val;
  39.                 struct{
  40.             unsigned IdleState:1;      
  41.             unsigned EraseReset:1;        
  42.             unsigned IllegalCmd:1;        
  43.             unsigned CrcErr:1;            
  44.             unsigned EraseSeqErr:1;      
  45.             unsigned AddressErr:1;        
  46.             unsigned ParamErr:1;          
  47.             unsigned B7:1;                  
  48.         }bits;
  49.         }R1;
  50.         UINT32  Retorno;
  51. }SDCARD_RESPUESTA;
  52. UINT8 SDCARD_Modo;
  53. //*******************************************************************************
  54. void SDSelect(void){
  55.    SD_CS=0;
  56.    WriteMedia(0xFF);
  57. }
  58. //*******************************************************************************
  59. void SDDeselect(void){
  60.    WriteMedia(0xFF);
  61.    SD_CS=1;
  62. }
  63. //*******************************************************************************
  64. BOOL SDCard_send_command(UINT8 cmd,UINT32 arg,SDCARD_RESPUESTA *res){
  65.  
  66.    UINT8_VAL ResTmp;
  67.    UINT16 i;
  68.    UINT32_VAL Argumento;
  69.    
  70.    Argumento.Val=arg;
  71.    SD_CS=0;
  72.    for( i=0;i<16;i++) WriteMedia(0xFF);
  73.    WriteMedia(cmd|0x40);
  74.    WriteMedia(Argumento.MB);
  75.    WriteMedia(Argumento.UB);
  76.    WriteMedia(Argumento.HB);
  77.    WriteMedia(Argumento.LB);
  78.    if(cmd==0){
  79.       WriteMedia(0x95);
  80.    }else{  
  81.       WriteMedia(0xFF);
  82.    }
  83.    
  84.      
  85.    // Se espera respuesta R1
  86.    i=0;
  87.    do{
  88.       ResTmp.Val=ReadMedia();
  89.       i++;
  90.    }while((ResTmp.b7)!=0 && i<SDCARD_TIMEOUT);// mientras no corresponda con 0xxxxxxx.-
  91.    if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}
  92.    res->R1.Val=ResTmp.Val;
  93.    #if defined(SDCARD_DEBUG)
  94.       printf("Repeticiones para respuesta de CmdXX: %u; Respuesta recibida:%u\r\n",i,ResTmp.Val);
  95.    #endif
  96.    return(1);
  97. }
  98. //*******************************************************************************
  99. BOOL SDCard_send_command_R7(UINT8 cmd,UINT32 arg,UINT8 CRC,SDCARD_RESPUESTA *res){
  100.  
  101.    UINT8_VAL ResTmp;
  102.    UINT16 i;
  103.    UINT32_VAL Temp;
  104.    
  105.    Temp.Val=arg;
  106.    SD_CS=0;
  107.    for( i=0;i<16;i++) WriteMedia(0xFF);
  108.    WriteMedia(cmd|0x40);
  109.    WriteMedia(Temp.MB);
  110.    WriteMedia(Temp.UB);
  111.    WriteMedia(Temp.HB);
  112.    WriteMedia(Temp.LB);
  113.    WriteMedia(CRC);
  114.  
  115.      
  116.    // Se espera respuesta R1
  117.    i=0;
  118.    do{
  119.       ResTmp.Val=ReadMedia();
  120.       i++;
  121.    }while((ResTmp.b7)!=0 && i<SDCARD_TIMEOUT);// mientras no corresponda con 0xxxxxxx.-
  122.    if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}
  123.    Temp.MB=ReadMedia();
  124.    Temp.UB=ReadMedia();
  125.    Temp.HB=ReadMedia();
  126.    Temp.LB=ReadMedia();
  127.    
  128.    res->R1.Val=ResTmp.Val;
  129.    res->Retorno=Temp.Val;
  130.    #if defined(SDCARD_DEBUG)
  131.       printf("Repeticiones para respuesta de CmdXX: %u; Respuesta recibida:%u,0x%lX\r\n",i,ResTmp.Val,Temp.Val);
  132.    #endif
  133.    return(1);
  134. }
  135. //*******************************************************************************
  136. BOOL SDCard_init(void){
  137.  
  138.    SDCARD_RESPUESTA Respuesta;
  139.    UINT16 i;
  140.    
  141.    TRIS_SD_CS=0;
  142.    SD_CS=1;  
  143.    // Configuración del Módulo SPI.-
  144.    InitSPI(VELOCITY_SPI_LOW);
  145.    
  146.    #if defined(SDCARD_DEBUG)  
  147.       printf("\r\n--> Se inicia sincronizacion\r\n");
  148.    #endif  
  149.    Delay_ms20();
  150.    for(i=0;i<20;i++) WriteMedia(0xFF);   // Para sincronización.
  151.    SD_CS=0;
  152.    #if defined(SDCARD_DEBUG)
  153.            printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n\r\n");
  154.    #endif
  155.  
  156.    i=0;
  157.    do{
  158.       if(SDCard_send_command(CMD0,0x00,&Respuesta)==0){
  159.          return(0);        // Si se recibe 0 error por timeout.-
  160.       }else{i++;}  
  161.    }while((Respuesta.R1.bits.IdleState==0) && i<SDCARD_TIMEOUT);
  162.    if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);} // Timeout esperando desactivación de SD Card.
  163.       // *---------------------------------------------------------------------*
  164.         #if defined(SDCARD_DEBUG)
  165.                 printf("--> Se envia CMD8\r\n");
  166.         #endif
  167.         if(SDCard_send_command_R7(CMD8,0x000001AA,0x87,&Respuesta)==0){
  168.                 #if defined(SDCARD_DEBUG)
  169.                         printf("        > Error por timeout al enviar comando\r\n");
  170.                 #endif
  171.                 return(0);        // Si se recibe 0 error por timeout.-
  172.         }
  173.        
  174.         if(((Respuesta.Retorno&0xFFF)==0x1AA)&&(Respuesta.R1.bits.IllegalCmd==0)){
  175.                 // Pasamos a esperar condición de SD Card activa.
  176.                 // Si R1=0x01, SD Card en estado desactivado.
  177.                 #if defined(SDCARD_DEBUG)
  178.                         printf("--> Se envia CMD55/ACMD41 (Se activa SD Card)\r\n");
  179.                 #endif         
  180.                 i=0;
  181.                 do{                    
  182.                         if(SDCard_send_command(CMD55,0x00,&Respuesta)==0){
  183.                                 #if defined(SDCARD_DEBUG)
  184.                                         printf("        > Error por timeout al enviar comando\r\n");
  185.                                 #endif
  186.                                 return(0);
  187.                         }
  188.                         if(SDCard_send_command(CMD41,0x40000000,&Respuesta)==0){ // Argumento soporta HC...
  189.                                 #if defined(SDCARD_DEBUG)
  190.                                         printf("        > Error por timeout al enviar comando\r\n");
  191.                                 #endif
  192.                                 return(0);     // Si se recibe 0 error por timeout.-
  193.                         }else{
  194.                                 i++;
  195.                         }
  196.                 }while((Respuesta.R1.bits.IdleState==1) && (i<SDCARD_TIMEOUT)); // Mientras se reciba R1=0x01
  197.                 if(i>=SDCARD_TIMEOUT){
  198.                         SDDeselect();
  199.                         return(0);
  200.                 }
  201.                 #if defined(SDCARD_DEBUG)
  202.                         printf("--> Se envia CMD58\r\n");
  203.                 #endif
  204.                 if(SDCard_send_command_R7(CMD58,0x00,0xFF,&Respuesta)==0){
  205.                         #if defined(SDCARD_DEBUG)
  206.                                 printf("        > Error por timeout al enviar comando\r\n");
  207.                         #endif
  208.                         return(0);        // Si se recibe 0 error por timeout.-
  209.                 }
  210.                 if(((Respuesta.Retorno&0xC0000000)==0xC0000000)&&(Respuesta.R1.Val==0)){
  211.                         #if defined(SDCARD_DEBUG)
  212.                                 printf("        > SD Card modo HC\r\n");
  213.                         #endif
  214.                         SDCARD_Modo=SDCARD_MODO_HC;
  215.                 }else{ // ((Respuesta.Retorno&0xC0000000)==0x80000000)
  216.                         #if defined(SDCARD_DEBUG)
  217.                                 printf("        > SD Card modo normal\r\n");
  218.                         #endif
  219.                         SDCARD_Modo=SDCARD_MODO_NORMAL;
  220.                 }
  221.                
  222.         }else{ 
  223.            // Pasamos a esperar condición de SD Card activa.
  224.            // Si R1=0x01, SD Card en estado desactivado.
  225.            #if defined(SDCARD_DEBUG)
  226.               printf("\r\n--> Se envia CMD1 (Se activa SD Card)\r\n\r\n");
  227.            #endif
  228.            i=0;
  229.            do{
  230.               if(SDCard_send_command(CMD1,0x00,&Respuesta)==0){
  231.                  return(0);     // Si se recibe 0 error por timeout.-
  232.               }else{i++;}
  233.            }while((Respuesta.R1.bits.IdleState==1) && (i<SDCARD_TIMEOUT)); // Mientras se reciba R1=0x01
  234.            if(i>=SDCARD_TIMEOUT){
  235.                         SDDeselect();
  236.                         return(0);
  237.                 } // Timeout esperando activación de SD Card.
  238.                 #if defined(SDCARD_DEBUG)
  239.                         printf("        > SD Card modo normal\r\n");
  240.                 #endif
  241.                 SDCARD_Modo=SDCARD_MODO_NORMAL;
  242.         }
  243.  
  244.    #if defined(SDCARD_DEBUG)
  245.       printf("\r\n--> Se envia CMD16 (Se fija largo del Bloque para escritura/lectura : %u)\r\n",BLOCK_SIZE);
  246.    #endif
  247.    // Se fija largo del bloque lectura/escitura.
  248.    if(SDCard_send_command(CMD16,BLOCK_SIZE,&Respuesta)==0){
  249.       return(0);
  250.    }
  251.    if(Respuesta.R1.Val!=0){
  252.       return(0);
  253.    }
  254.  
  255.    #if defined(SDCARD_DEBUG)
  256.       printf("\r\n--> Se envia CMD59 (Desactivación de CRC)\r\n");
  257.    #endif
  258.    // Se desactiva CRC.
  259.    if(SDCard_send_command(CMD59,0,&Respuesta)==0){
  260.       return(0);
  261.    }
  262.    if(Respuesta.R1.Val!=0){
  263.       return(0);
  264.    }  
  265.    SDDeselect();
  266.    
  267.    InitSPI(VELOCITY_SPI_HIGH);
  268.    
  269.    return(1);
  270. }
  271. //*******************************************************************************
  272. BOOL SDCard_read_block(UINT32 Address,UINT8 *Buffer){
  273.        
  274.         SDCARD_RESPUESTA Respuesta;
  275.         UINT8 TokenTmp;
  276.         UINT16 i;
  277.        
  278.    // Se envia comando para leer bloque de bytes.-
  279.    #if defined(SDCARD_DEBUG)
  280.       printf("\r\n--> Se envia CMD17 (Lectura de bloque)\r\n");
  281.    #endif
  282.    SDSelect();
  283.    if(SDCard_send_command(CMD17,Address,&Respuesta)==0){
  284.       return(0);
  285.    }
  286.    if(Respuesta.R1.Val!=0){
  287.       return(0);
  288.    }  
  289.    // Pasamos a esperar Token.
  290.    i=0;
  291.    do{
  292.       TokenTmp=ReadMedia();
  293.       i++;
  294.    }while(TokenTmp==0xFF && i<SDCARD_TIMEOUT);// Mientras sea 0xFF.-
  295.    if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}
  296.    if((TokenTmp&0xE0)==0){ // Si se recibe 000xxxxx y no 0xFE.-
  297.       SDDeselect();
  298.       return(0);
  299.    }
  300.    #if defined(SDCARD_DEBUG)
  301.       printf("Toquen recibido: 0x%X\r\n",TokenTmp);
  302.    #endif
  303.    // Todo ok, recibimos data.-
  304.    for(i=0;i<BLOCK_SIZE;i++){
  305.       *Buffer++=ReadMedia();
  306.    }
  307.    // Ignoramos CRC.-
  308.    ReadMedia();
  309.    ReadMedia();
  310.    
  311.    SDDeselect();
  312.    #if defined(SDCARD_DEBUG)
  313.       printf("Terminada la lectura\r\n");
  314.    #endif
  315.    return(1);  
  316. }
  317.  
  318. //*******************************************************************************
  319. BOOL SDCard_write_block(UINT32 Address,UINT8 *Buffer){ 
  320.         SDCARD_RESPUESTA Respuesta;
  321.         UINT8 ResTmp;
  322.         UINT16 i;
  323.        
  324.    #if defined(SDCARD_DEBUG)
  325.       printf("\r\n--> Se envia CMD24 (Escritura de bloque)\r\n");
  326.    #endif
  327.    SDSelect();
  328.    // Se envia comando para escribir bloque de bytes.-
  329.    if(SDCard_send_command(CMD24,Address,&Respuesta)==0){
  330.       return(0);
  331.    }
  332.    if(Respuesta.R1.Val!=0){
  333.       return(0);
  334.    }
  335.    #if defined(SDCARD_DEBUG)
  336.       printf("Se envia Token (0xFE)\r\n");
  337.    #endif
  338.    // Enviamos Token.
  339.    WriteMedia(0xFE);
  340.    #if defined(SDCARD_DEBUG)
  341.       printf("Se envia Bloque de datos\r\n");
  342.    #endif
  343.    // Enviamos data.-
  344.    for(i=0;i<BLOCK_SIZE;i++){
  345.       WriteMedia(*Buffer++);
  346.    }
  347.    // Ignoramos CRC.-
  348.    WriteMedia(0xFF);
  349.    WriteMedia(0xFF);
  350.    // Esperamos respuesta.-
  351.    i=0;
  352.    do{
  353.       ResTmp=ReadMedia();
  354.       i++;
  355.    }while(ResTmp==0xFF && i<SDCARD_TIMEOUT);// Mientras sea 0xFF.-
  356.    if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}
  357.    #if defined(SDCARD_DEBUG)
  358.       printf("Respuesta de recepción del bloque: 0x%X  (***00101)\r\n",ResTmp);
  359.    #endif
  360.    if((ResTmp&0x1F)!=0x05){ // Si no se recibe ***00101.-
  361.       SDDeselect();
  362.       return(0);
  363.    }
  364.    // Esperamos a que baje la linea, indicando escritura completa.-
  365.    while(ReadMedia()==0);
  366.    #if defined(SDCARD_DEBUG)
  367.       printf("Escritura Terminada\r\n");
  368.    #endif
  369.    SDDeselect();
  370.    return(1);  
  371. }
  372. //*******************************************************************************
  373. BOOL SDCard_read_CSD(void){
  374.        
  375.    SDCARD_RESPUESTA Respuesta;
  376.    UINT8 TokenTmp, buf[16];  
  377.    UINT16 i;
  378.    
  379.    #if defined(SDCARD_DEBUG)
  380.       printf("\r\n--> Se envia CMD9 (Lectura de CSD)\r\n");
  381.    #endif
  382.    SDSelect();
  383.    if(SDCard_send_command(CMD9,0,&Respuesta)==0){
  384.       return(0);
  385.    }else if(Respuesta.R1.Val!=0){
  386.       return(0);
  387.    }
  388.    // Pasamos a esperar Token.
  389.    i=0;
  390.    do{
  391.       TokenTmp=ReadMedia();
  392.       i++;
  393.    }while(TokenTmp==0xFF && i<SDCARD_TIMEOUT);// Mientras sea 0xFF.-
  394.    if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}
  395.    if((TokenTmp&0xE0)==0){ // Si se recibe 000xxxxx y no 0xFE.-
  396.       SDDeselect();
  397.       return(0);
  398.    }
  399.    #if defined(SDCARD_DEBUG)
  400.       printf("Toquen recibido: 0x%X\r\n",TokenTmp);
  401.    #endif
  402.    // Todo ok, recibimos data.-
  403.    for(i=0;i<16;i++){
  404.       buf[i]=ReadMedia();
  405.    }
  406.    SDDeselect();
  407.    
  408.    #if defined(SDCARD_DEBUG)
  409.    printf("\r\nCSD_STRUCTURE: %X", (buf[0] & 0x0C) >> 2);
  410.    printf("\r\nTAAC: %X", buf[1]);
  411.    printf("\r\nNSAC: %X", buf[2]);
  412.    printf("\r\nTRAN_SPEED: %X", buf[3]);
  413.    printf("\r\nCCC: %lX", ((((unsigned char)(buf[4])<<8)+ buf[5]) & 0xFFF0) >> 4);
  414.    printf("\r\nREAD_BL_LEN: %X", buf[5] & 0x0F);  
  415.    printf("\r\nREAD_BL_PARTIAL: %X", (buf[6] & 0x80) >> 7);
  416.    printf("\r\nWRITE_BLK_MISALIGN: %X", (buf[6] & 0x40) >> 6);
  417.    printf("\r\nREAD_BLK_MISALIGN: %X", (buf[6] & 0x20) >> 5);
  418.    printf("\r\nDSR_IMP: %X", (buf[6] & 0x10) >> 4);
  419.    printf("\r\nC_SIZE: %lX", (((buf[6] & 0x03) << 10) | (buf[7] << 2) | ((buf[8] & 0xC0) >> 6)));
  420.    printf("\r\nVDD_R_CURR_MIN: %X", (buf[8] & 0x38) >> 3);
  421.    printf("\r\nVDD_R_CURR_MAX: %X", buf[8] & 0x07);
  422.    printf("\r\nVDD_W_CURR_MIN: %X", (buf[9] & 0xE0) >> 5);
  423.    printf("\r\nVDD_W_CURR_MAX: %X", (buf[9] & 0x1C) >> 2);
  424.    printf("\r\nC_SIZE_MULT: %X", ((buf[9] & 0x03) << 1) | ((buf[10] & 0x80) >> 7));
  425.    printf("\r\nERASE_BLK_EN: %X", (buf[10] & 0x40) >> 6);
  426.    printf("\r\nSECTOR_SIZE: %X", ((buf[10] & 0x3F) << 1) | ((buf[11] & 0x80) >> 7));
  427.    printf("\r\nWP_GRP_SIZE: %X", buf[11] & 0x7F);
  428.    printf("\r\nWP_GRP_ENABLE: %X", (buf[12] & 0x80) >> 7);
  429.    printf("\r\nR2W_FACTOR: %X", (buf[12] & 0x1C) >> 2);
  430.    printf("\r\nWRITE_BL_LEN: %X", ((buf[12] & 0x03) << 2) | ((buf[13] & 0xC0) >> 6));
  431.    printf("\r\nWRITE_BL_PARTIAL: %X", (buf[13] & 0x20) >> 5);
  432.    printf("\r\nFILE_FORMAT_GRP: %X", (buf[14] & 0x80) >> 7);
  433.    printf("\r\nCOPY: %X", (buf[14] & 0x40) >> 6);
  434.    printf("\r\nPERM_WRITE_PROTECT: %X", (buf[14] & 0x20) >> 5);
  435.    printf("\r\nTMP_WRITE_PROTECT: %X", (buf[14] & 0x10) >> 4);
  436.    printf("\r\nFILE_FORMAT: %X", (buf[14] & 0x0C) >> 2);
  437.    printf("\r\nCRC: %X\r\n", buf[15]);
  438.    #endif
  439.    return(1);
  440. }
  441. //*******************************************************************************
  442. BOOL SDCard_read_CID(void){
  443.        
  444.    SDCARD_RESPUESTA Respuesta;
  445.    UINT8 TokenTmp, buf[16];  
  446.    UINT16 i;
  447.    
  448.    #if defined(SDCARD_DEBUG)
  449.       printf("\r\n--> Se envia CMD10 (Lectura de CID)\r\n");
  450.    #endif
  451.    SDSelect();
  452.    if(SDCard_send_command(CMD10,0,&Respuesta)==0){
  453.       return(0);
  454.    }else if(Respuesta.R1.Val!=0){
  455.       return(0);
  456.    }
  457.    // Pasamos a esperar Token.
  458.    i=0;
  459.    do{
  460.       TokenTmp=ReadMedia();
  461.       i++;
  462.    }while(TokenTmp==0xFF && i<SDCARD_TIMEOUT);// Mientras sea 0xFF.-
  463.    if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}
  464.    if((TokenTmp&0xE0)==0){ // Si se recibe 000xxxxx y no 0xFE.-
  465.       SDDeselect();
  466.       return(0);
  467.    }
  468.    #if defined(SDCARD_DEBUG)
  469.       printf("Toquen recibido: 0x%X\r\n",TokenTmp);
  470.    #endif
  471.    // Todo ok, recibimos data.-
  472.    for(i=0;i<16;i++){
  473.       buf[i]=ReadMedia();
  474.    }
  475.    SDDeselect();
  476.    
  477.    #if defined(SDCARD_DEBUG)
  478.    printf("\r\nManufacturer ID: %X", buf[0]);
  479.    printf("\r\nOEM/Application ID: %c%c", buf[1], buf[2]);
  480.    printf("\r\nProduct Name: %c%c%c%c%c", buf[3], buf[4], buf[5], buf[6], buf[7]);
  481.    printf("\r\nProduct Revision: %X", buf[8]);
  482.    printf("\r\nSerial Number: %X%X%X%X", buf[9], buf[10], buf[11], buf[12]);
  483.    printf("\r\nManufacturer Date Code: %X%X", buf[13] & 0x0F, buf[14]);
  484.    printf("\r\nCRC-7 Checksum: %X\r\n", buf[15]);
  485.    #endif
  486.    return(1);
  487. }
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 24 de Septiembre de 2011, 23:37:00
El debug para una memoria HC de 8Gb:
Citar
--> Se inicia sincronizacion                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                   
--> Se envia CMD0 (Se desactiva SD Card)                                                                                                                                                                                                           
                                                                                                                                                                                                                                                   
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:127                                                                                                                                                                                     
--> Se envia CMD8                                                                                                                                                                                                                                   
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1,0x1AA                                                                                                                                                                                 
--> Se envia CMD55/ACMD41 (Se activa SD Card)                                                                                                                                                                                                       
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1                                                                                                                                                                                       
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1                                                                                                                                                                                       
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:1                                                                                                                                                                                       
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0                                                                                                                                                                                       
--> Se envia CMD58                                                                                                                                                                                                                                 
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0,0xC0FF8000                                                                                                                                                                           
        > SD Card modo HC                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                   
--> Se envia CMD16 (Se fija largo del Bloque para escritura/lectura : 512)                                                                                                                                                                         
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0                                                                                                                                                                                       
                                                                                                                                                                                                                                                   
--> Se envia CMD59 (Desactivaci n de CRC)                                                                                                                                                                                                           
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0                                                                                                                                                                                       
                                                                                                                                                                                                                                                   
--> Se envia CMD9 (Lectura de CSD)                                                                                                                                                                                                                 
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0                                                                                                                                                                                       
Toquen recibido: 0xFE                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                   
CSD_STRUCTURE: 0                                                                                                                                                                                                                                   
TAAC: E                                                                                                                                                                                                                                             
NSAC: 0                                                                                                                                                                                                                                             
TRAN_SPEED: 32                                                                                                                                                                                                                                     
CCC: 60010                                                                                                                                                                                                                                         
READ_BL_LEN: 9                                                                                                                                                                                                                                     
READ_BL_PARTIAL: 0                                                                                                                                                                                                                                 
WRITE_BLK_MISALIGN: 0                                                                                                                                                                                                                               
READ_BLK_MISALIGN: 0                                                                                                                                                                                                                               
DSR_IMP: 0                                                                                                                                                                                                                                         
C_SIZE: 10                                                                                                                                                                                                                                         
VDD_R_CURR_MIN: 7                                                                                                                                                                                                                                   
VDD_R_CURR_MAX: 3                                                                                                                                                                                                                                   
VDD_W_CURR_MIN: 2                                                                                                                                                                                                                                   
VDD_W_CURR_MAX: 3                                                                                                                                                                                                                                   
C_SIZE_MULT: 6                                                                                                                                                                                                                                     
ERASE_BLK_EN: 1                                                                                                                                                                                                                                     
SECTOR_SIZE: 7F                                                                                                                                                                                                                                     
WP_GRP_SIZE: 0                                                                                                                                                                                                                                     
WP_GRP_ENABLE: 0                                                                                                                                                                                                                                   
R2W_FACTOR: 2                                                                                                                                                                                                                                       
WRITE_BL_LEN: 9                                                                                                                                                                                                                                     
WRITE_BL_PARTIAL: 0                                                                                                                                                                                                                                 
FILE_FORMAT_GRP: 0                                                                                                                                                                                                                                 
COPY: 0                                                                                                                                                                                                                                             
PERM_WRITE_PROTECT: 0                                                                                                                                                                                                                               
TMP_WRITE_PROTECT: 0                                                                                                                                                                                                                               
FILE_FORMAT: 0                                                                                                                                                                                                                                     
CRC: 4B                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                   
--> Se envia CMD10 (Lectura de CID)                                                                                                                                                                                                                 
Repeticiones para respuesta de CmdXX: 2; Respuesta recibida:0                                                                                                                                                                                       
Toquen recibido: 0xFE                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                   
Manufacturer ID: 2                                                                                                                                                                                                                                 
OEM/Application ID: TM                                                                                                                                                                                                                             
Product Name: SA08G                                                                                                                                                                                                                                 
Product Revision: 6                                                                                                                                                                                                                                 
Serial Number: 226E644C                                                                                                                                                                                                                             
Manufacturer Date Code: 0AC                                                                                                                                                                                                                         
CRC-7 Checksum: C3


NOTA: La librería de Microchip, al detectar una memoria que posiblemente es V2.x envía el comando CMD1 o SEND_OP_COND. En mi caso, memoria 8gB Kingston, responde a eso como comando no valido (no se inicializa), así que lo reemplace por el par CMD55 y ACMD41  :) Revisar ese detalle al usarla  ;-)


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 25 de Septiembre de 2011, 00:12:12
Hola Suky se ve que estamos sintonizados, justamente estoy agregando algunas funciones a Micrologger, pero sigo sin soportar la tarjetas de alta capacidad porque no soporto FAT32 ;-)

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 25 de Septiembre de 2011, 00:26:24
 :mrgreen: La idea era, si hay tiempo, mejorar la librería de FAT y agregarle FAT32. También me sirvió para hacer funcionar la de Microchip, pero esta última consume bastantes recursos  :undecided:


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: mikepic en 26 de Septiembre de 2011, 04:05:54
Gracias como siempre por tus aportes, Suky.

Entiendo entonces que tu nueva librería sirve, tanto para SD como para SDHC?

Gracias
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: rroque en 06 de Octubre de 2011, 21:50:44
hola a la gentita del foro!!!!! ^^

Una consulta la ultima libreria que posteo suky, fue probada en ccs?¿

Saludos

;)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 06 de Octubre de 2011, 22:25:37
Yo por lo menos no la probé  :mrgreen: Te dio algún inconveniente?


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: rroque en 24 de Noviembre de 2011, 18:10:59
Sorry por la gran demora en responder, pero me salio una chamba y me dedique a lo otro, pero ahora si lo retomo ^^, abri tu programa en PCW CCS y lo compile sin ningun problema y corre normal en el proteus, pero una consulta con respecto al crystal, puedeo utilizar un oscilador TTL Half can de 20MHz eso funcionan a 3,3V pero el pic que utilizo es el 18f2550?¿?¿?¿ te pregunto esto dado que lo quiero probar en proto y no quiero quemar el pic, xq lo probe con 4MHz y el pic murio:(

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 24 de Noviembre de 2011, 19:24:03
Si, seguro, mientras realices las configuraciones adecuadas, ningún problema  ;-)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: rroque en 25 de Noviembre de 2011, 14:14:10
Bueno probe con ese oscilador de 20MHz y si funciona en cierta forma por que la salida serial veo esto:




******* Iniciando Memoria SD Card... *******

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

******* Leemos registro CID: *******

--> Se envia CMD10 (Lectura de CID)

******* Leemos registro CSD: *******

--> Se envia CMD9 (Lectura de CSD)

******* Escribimos sector 0x200 *******

--> Se envia CMD24 (Escritura de bloque)

******* Leemos sector 0x200 *******

--> Se envia CMD17 (Lectura de bloque)
   >> Datos leidos:

00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,
20,21,22,23,24,25,26,27,28,29,2A,2B,2C,2D,2E,2F,30,31,32,33,34,35,36,37,38,39,3A,3B,3C,3D,3E,3F,
40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D,5E,5F,
60,61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F,70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D,7E,7F,
80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8D,8E,8F,90,91,92,93,94,95,96,97,98,99,9A,9B,9C,9D,9E,9F,
A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,
C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,CA,CB,CC,CD,CE,CF,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DA,DB,DC,DD,DE,DF,
E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,EA,EB,EC,ED,EE,EF,F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,FA,FB,FC,FD,FE,FF,
00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,
20,21,22,23,24,25,26,27,28,29,2A,2B,2C,2D,2E,2F,30,31,32,33,34,35,36,37,38,39,3A,3B,3C,3D,3E,3F,
40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D,5E,5F,
60,61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F,70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D,7E,7F,
80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8D,8E,8F,90,91,92,93,94,95,96,97,98,99,9A,9B,9C,9D,9E,9F,
A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,
C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,CA,CB,CC,CD,CE,CF,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DA,DB,DC,DD,DE,DF,
E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,EA,EB,EC,ED,EE,EF,F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,FA,FB,FC,FD,FE,FF,


Pero me doy cuenta que solo es lo que el programa principal tiene para compiar, xq esto sale teniendo al memoria conectada y desconectada. Y no sale la parte del SDCard.... :(, ademas estoy utilizando el hardware que recomendaste con las resistencias de 18K y 33K. Sera tema de hardware por lo que no puedo la info tal como sale en el proteus?¿?¿

Todo esto lo probe en protoboard.....

Saludos!!!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 25 de Noviembre de 2011, 14:45:34
Para el divisor resistivo utiliza mejor resistencias de 1.5k y 3.3k, para altas frecuencias funciona mejor. Lo que sería bueno es que bajes la ultima versión, por aquí (http://www.ucontrol.com.ar/forosmf/programacion-en-c/sd-card-libreria-fat16-libreria-a-nivel-hardware-(ccs-c18-c30-ect-)/?action=dlattach;attach=11863)

Por aquí (http://www.ucontrol.com.ar/forosmf/programacion-en-c/sd-card-libreria-fat16-libreria-a-nivel-hardware-(ccs-c18-c30-ect-)/msg31535/#msg31535) tienes unos ejemplos de como usar FAT.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: tannke en 25 de Noviembre de 2011, 18:49:10
Para el divisor resistivo utiliza mejor resistencias de 1.5k y 3.3k, para altas frecuencias funciona mejor.

UUUUfff!!! Suky muchas gracias!!!

Llevo 1 semana peleando con un proyecto, un gravador de llamadas telefonicas a la sd, el tema sd lo hago con las librerias de mikroc y me gravaba el sonido casi perfecto, solo que cada X segundos perdía algunos sectores( se escuchaba un pequeñisimo corte), utilizo 2 buffers de 512 Bytes, y mientras lleno uno con los samples vuelco el otro a la sd. El tema estaba que la escritura en sd era mas lenta que la lectura de samples.
Prové de todo! Incluso con el pic andando a 48MHz seguia perdiendo sectores (Errores de escritura/lectura en sd ni uno)

Oye... fué poner esos valores de resistencias y ala....

Lo dicho, jejej muchas gracias y saludos  :mrgreen:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 25 de Noviembre de 2011, 21:58:18
De nada! A mi también me toco probar un par de valores, y con esos ha funcionado hasta con 12 MHz  ;-)


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: rroque en 26 de Noviembre de 2011, 10:45:05
Osea todas esas extensiones del FAT16 las agrego al programa inicial probandoSDCard?¿?¿?¿?¿?¿ o como lo tengo q probar?¿?¿ Consegui un cristal de 48MHz, voy a probar con esto a ver que pasa ......


Saludoss
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: rroque en 26 de Noviembre de 2011, 12:32:31
Suky, utilice la resistencias recomendadas (3.3k y 1.5k)y los valores del voltaje de este divisor son de 5voltios :O, no se supone q las memoria trabaja a 3.3v?¿?¿

Otra consulta, hehe acabo de adquirir el 74125N que utilizas en el hardware ideal, veo la resistencias conectadas a 3.3V, que valores son?¿?¿?¿

Saludos

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 26 de Noviembre de 2011, 14:01:04
Osea todas esas extensiones del FAT16 las agrego al programa inicial probandoSDCard?¿?¿?¿?¿?¿ o como lo tengo q probar?¿?¿ Consegui un cristal de 48MHz, voy a probar con esto a ver que pasa ......


Saludoss

En el enlace que te indique hay ejemplo, trata de estudiarlos  ;-) Primero se inicializa la memoria, luego se pasa a iniciar es sistema de archivos FAT, para determinar la estructura FAT que tiene la memoria, luego pasas a leer o escribir archivos.

Un cristal de 48MHz no sirve, un 18F acepta solo hasta 20 MHz, pero podes usar el PLL interno para llevar la frecuencia de trabajo a 48MHz.

Suky, utilice la resistencias recomendadas (3.3k y 1.5k)y los valores del voltaje de este divisor son de 5voltios :O, no se supone q las memoria trabaja a 3.3v?¿?¿

Otra consulta, hehe acabo de adquirir el 74125N que utilizas en el hardware ideal, veo la resistencias conectadas a 3.3V, que valores son?¿?¿?¿

Saludos

La primera afirmación es incoherente, si conectas el divisor resistivo a la salida del pin del microcontrolador con ~5 V, como puedes obtener 5 V ?  :shock:

Respecto a las resistencias pull-up, pueden ser de 10k.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: rroque en 26 de Noviembre de 2011, 14:49:41
Lo que hice fue darle energia al micro y medir justo esos puntos y salia esos voltajes :S, felizmente saque la memoria, esta bien que exista voltaje en esos puntos cuando el programa ya corra?¿?¿
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: rroque en 26 de Noviembre de 2011, 20:38:16
Implemente el hardware con el 74125n y al parecer esta bien xq coloque unos led en las patillas DI, DO,CS, CLK para comprobar si es que esta mandando data, pero aun asi en la salida serial sigue saliendo lo mismo:

******* Iniciando Memoria SD Card... *******

--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

******* Leemos registro CID: *******

--> Se envia CMD10 (Lectura de CID)

******* Leemos registro CSD: *******

--> Se envia CMD9 (Lectura de CSD)

******* Escribimos sector 0x200 *******

--> Se envia CMD24 (Escritura de bloque)

******* Leemos sector 0x200 *******

--> Se envia CMD17 (Lectura de bloque)
   >> Datos leidos:

00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,
20,21,22,23,24,25,26,27,28,29,2A,2B,2C,2D,2E,2F,30,31,32,33,34,35,36,37,38,39,3A,3B,3C,3D,3E,3F,
40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D,5E,5F,
60,61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F,70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D,7E,7F,
80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8D,8E,8F,90,91,92,93,94,95,96,97,98,99,9A,9B,9C,9D,9E,9F,
A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,
C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,CA,CB,CC,CD,CE,CF,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DA,DB,DC,DD,DE,DF,
E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,EA,EB,EC,ED,EE,EF,F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,FA,FB,FC,FD,FE,FF,
00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,
20,21,22,23,24,25,26,27,28,29,2A,2B,2C,2D,2E,2F,30,31,32,33,34,35,36,37,38,39,3A,3B,3C,3D,3E,3F,
40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D,5E,5F,
60,61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F,70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D,7E,7F,
80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8D,8E,8F,90,91,92,93,94,95,96,97,98,99,9A,9B,9C,9D,9E,9F,
A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,
C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,CA,CB,CC,CD,CE,CF,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DA,DB,DC,DD,DE,DF,
E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,EA,EB,EC,ED,EE,EF,F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,FA,FB,FC,FD,FE,FF,

AL parecer no esta corriendo el programa incluido SDCard_hard.c o no se porque tambien modifque en la parte de incializacion del SPI el clock:

SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_4|SPI_H_TO_L|SPI_XMIT_L_TO_H )

Pero no se que mas pueda ser :S

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 09 de Enero de 2012, 13:47:01

Saludos

Me he hecho a la tarea de montar físicamente el circuito que esta en el primer mensaje del presente hilo, con algunas modificaciones la primera es que lo terminales que quedan libres de la microsd los conecto a 3.3 v por medio de unas resistencias pulls -up de 10k, y conecto entre los terminales VDD y VSS de microcontrolador un condensador de 0,1 uf para eliminar los poblemas de acople que se me estaban presentando con la fuente de tensión que poseo. El microcontrolador utilizado en el circuito es un PIC16F887, además, se utilizó un MAX232 para conectar el microcntrolador con una computadora digital (RS232) para realizar el debug y la respectiva depuración del circuito y del software. Las rutinas que implemente son las que poco a poco he venido haciendo, mejorando como se muestran a continuación.

Rutina de inicialización

Código: [Seleccionar]
int init_mmc()
  {
    SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_XMIT_L_TO_H);
    OUTPUT_HIGH(PIN_C2);
    delay_ms(20);
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    OUTPUT_LOW(PIN_C2);             // Activo la targeta
    delay_ms(20);
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    i = 0;
    do
     {
      SPI_WRITE(0x40);
      SPI_WRITE(0x00);
      SPI_WRITE(0x00);
      SPI_WRITE(0x00);
      SPI_WRITE(0x00);
      SPI_WRITE(0x95);                // Comando CMDO datos a enviar
     }
    while((mmc_respuesta(0x01)==0x01) && (i<200));
    if(i>=200)
      {
        printf("Error en comando CMD0");
        return 1;                    // Error en memoria por que se supero el tiempo
      }
    i = 0;
    do
      {
        SPI_WRITE(0x41);         // Envia comando hasta que de la respuesta y hasta que se cumpla el tiempo
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0xFF);            // Secuencia del comando CMD1
        i= i + 1;
      }
    while((i<250) && (mmc_respuesta(0x00)==0x01));
    if(i>=250)
      {
        printf("Error en comando CMD1");
        return 1;                // si se supera el tiempo de respuesta no se ha inicializado bien la targeta
      }
   i = 0;
   do
    {
     SPI_WRITE(0x50);
     SPI_WRITE(0x00);
     SPI_WRITE(0x00);
     SPI_WRITE(0x02);
     SPI_WRITE(0x00);
     SPI_WRITE(0xFF);              // Comando CMD16 para configurarlo de 512 bytes
     i = i + 1;
    }
   while((mmc_respuesta(0x00)==0x01) && (i<2));
    if(i>=2)
      {
        printf("Error en comando CMD16");
        return 1;                // se ha inicializado incorrectamente
      }
    SPI_WRITE(59|0x40);
    SPI_WRITE(0x00);   
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);   
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);              // Comando CMD59 para desactivar el CRC
    if(mmc_respuesta(0x00)== 0x01)
     {
      printf("Error en comando CMD59");
      return 1;
     }
    OUTPUT_HIGH(PIN_C2);
    return 0;                // se ha inicializado correctamente

  }

La rutina de control de respuesta del comando es:

Código: [Seleccionar]
int mmc_respuesta(unsigned char respuesta)
  {
    unsigned long espera = 0xFFFF;
    while(SPI_READ(0xFF)!= respuesta && espera> 0)
     {
       espera= espera - 1;
     }
    if(espera==0)
     {
      return 1;                  // se ha superado el tiempo
     }
    else
     {
      return 0;
     }
  }

La rutina de escritura de un sector de la memoria es la siguiente

Código: [Seleccionar]
int mmc_escribir_bloque()
  {
    resp = 0;   OUTPUT_LOW(PIN_C2);
    for(i=0; i<16; i++)
      {
        SPI_WRITE(0xFF);         // Espero a que se estabilice la memoria
      }
    SPI_WRITE(0x58);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);          // Comando CMD24 pero escribé en el segundo bloque 0x200
    if(mmc_respuesta(0x00)==0x01)         // Espero la respuesta RB1
      {
        printf("Error en CMD24");
        return 1;              // no respondio correctamente la memoria
      } 
    SPI_WRITE(0xFE);          // Envio el token de inicio
    for(i=0; i<512; i++)
      {   spi_write(17);
        delay_ms(1);
      }
    SPI_WRITE(0xFF);
    SPI_WRITE(0xFF);             // espero ha que se estabilice o envio 2 CRC
    printf("%Lu",i);
    i=0;
    do
     {
      resp = SPI_READ(0xFF);
      i++;
     }
    while ((i<2000) && resp == 0xFF);
    if(i>=2000)
     {
       printf("Se ha superado el tiempo");
       return 1;
     }
    printf("Respuesta de recepción \n %X",resp);
    if((resp&0x0F)!=0x05)
      {
        printf("error al escribir los datos");
        SPI_WRITE(0xFF);
        OUTPUT_HIGH(PIN_C2);
        return 1;                            // No se escribio correctamente el bloque de 512 bytes dirente de 00101
      }
    OUTPUT_HIGH(PIN_C2);
    return 0;
  }

Continua...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 09 de Enero de 2012, 14:09:00

Continua.

La rutina para lectura de un sector de la memoria es la siguiente

Código: [Seleccionar]
int mmc_leer_bloque()
  {
    OUTPUT_LOW(PIN_C2);
    SPI_WRITE(0x51);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);          // Comando CMD17 para leer el bloque 2 de la memoria
    if(mmc_respuesta(0x00)==0x01)         // Espero el comando RB1 la respuesta
      {
        return 1;             // Hubo error en la lectura del bloque 2 de la memoria
      }
    if(mmc_respuesta(0xFE)==0x01)
      {
        return 1;            // espera por el token de respuesta
      }
    if((SPI_READ(0XFF)&0xE0)==0x00)  // espero el token correcto
      {
        return 1;
      }
    OUTPUT_HIGH(PIN_C2);
    return 0;
  }

Y el main es el siguiente

Código: [Seleccionar]
void main()
  {
   long conversion;
    int lectura;
    i = 0;
    setup_adc_ports(sAN0|sAN1|VREF_VREF);
    setup_adc(adc_clock_div_32);                  // configuro el conversor análogo digital
    set_tris_b(0x00);
    set_tris_a(0xff);
    set_tris_c(0x93);
    disable_interrupts(global);
    retorno = init_mmc();
    if(retorno==0x01)
      {
        printf("Error en memoria");
      }
    else
      {
    do
     {
        if (input(pin_d2)==1)
         {
           retorno = mmc_escribir_bloque();
           if(retorno==0x01)
            {
             printf("No se pudo escribir el bloque");
            }
           else
            {
             printf("Escritura realizada");
            }
          }
         if(input(pin_d2)==0)
           {
            retorno== mmc_leer_bloque();
            if(retorno==0x01)
             {
              printf("Error en lectura\r");
             }
            else
             {
              for(i=0; i<512; i++)
               {
                 lectura = spi_read(0XFF);
                 printf("%x",lectura);
                }
              SPI_READ(0xFF);
              SPI_READ(0xFF);
              OUTPUT_HIGH(PIN_C2);                   // Chip Select = 1 (off)
              SPI_WRITE(0xFF);
             }
           }
       }
      while(true);
     }
  }


Se dio inicio a la pruebas verificando que la memoria respondiera al algoritmo de inicio (init_mmc()), y funciona efectivamente, después se hicieron la implementación de la rutina de lectura de un sector y sin problemas, la única rutina que no he podido hacer funcionar es la rutina de escritura de un sector de la misma, para detectar el posible error empezé hacer el debug, encontre que la memoria responde acertadamente al comando CMD24, despues se envian acertadamente el token de inicio, después se envia el bloque a escribir y por último la memoria responde (si todo salio bien) la memoria debe responde con 0x05 pero según el siguiente código para revisar con que valor responde la memoria.

Código: [Seleccionar]
do
     {
      resp = SPI_READ(0xFF);
      i++;
     }
    while ((i<2000) && resp == 0xFF);
    if(i>=2000)
     {
       printf("Se ha superado el tiempo");
       return 1;
     }
    printf("Respuesta de recepción \n %X",resp);
    if((resp&0x0F)!=0x05)
      {
        printf("error al escribir los datos");
        SPI_WRITE(0xFF);
        OUTPUT_HIGH(PIN_C2);
        return 1;                            // No se escribio correctamente el bloque de 512 bytes diferente de 00101
      }

La memoria responde la mayoria de la veces con 0x00, en muy pocas ocasiones responde con 0xFC, 0x80, 0xF0 pero nunca aparece 0x05 la verdad no se cual se ha el problema no se si algún compañero del foro se le haya presentado el mismo problema, estoy por pensar que el conector con que viene la microsd tiene la protección contra escritura truncada, y por tal razón, no me deja realizar la operación de escritura. Si alguién tiene alguna idea o sugerencia bienvenida.

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: EMIF en 27 de Abril de 2012, 20:31:15
Hola amigos del Foro, les comento que estoy usando las librerias de Suky "FAT16_SDCard" y "SDCard_hard", y he obtenido muy buenos resultados, inicializo la memoria, la FAT, creo un archivo y puedo almacenar datos.
El paso que sigue es descargar los datos a la PC a traves del PIC, no sacando la memoria y leyendola diectamente de la PC. En las librerias esta la funcion FAT_OpenFile y dentro de esta llama a FAT_GETFile que por lo que entiendo mando por RS232 todo el archivo, pero esto no esta funcionando.
Lo que hace es enviar muchos caracteres NULL.
La verdad que hay algo que no estoy interpretando bien. Si hay alguien que haya trabajado con esto se agradeceria alguna sugerencia
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 27 de Abril de 2012, 21:51:50
Estas usando la versión 1.8?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: EMIF en 28 de Abril de 2012, 18:42:47
De la Fat uso la version 1.5 no la 1.8, porque esta andando muy bien. No quise usar las librerias genericas porque eran un poco mas complejas.
Has usado la funcion OpenFile o GetFile, para mandar el archivo por RS232?
Que deberia recibir en la PC? Los datos uno abajo del otro?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 28 de Abril de 2012, 19:14:29
Te recomiendo la 1.8. La otra seguramente tiene algunos bugs  :tongue:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: EMIF en 28 de Abril de 2012, 19:33:58
Disculpa que te pregunte tanto, pero no se que debo recibir al utilizar FAT_OpenFile, voy a recibir simplemente todos los datos uno tras otro??
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 28 de Abril de 2012, 20:57:31
Claro, los bytes que vaya leyendo del archivo.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: JorgeS en 10 de Mayo de 2012, 13:11:25
Hola, estoy comenzando con esto de las memorias SD y tengo un problema:

Utilice la libreria 1.8 y  el ejemplo mas sencillo:
Código: [Seleccionar]
#include <18F4550.h>
#device adc=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#use spi(MASTER,BITS=8,MODE=3,FORCE_HW,stream=SDCard)


#include "FAT16.c"

UINT8 Texto[512]="Texto Creado con PIC....\r\n";

void main(){

   int1 Card_Work=0;
   
   char NombreCorto[13];
   char NombreLargo[50];
   UINT16 UbicacionFolder=0;
   
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   InitHard_SDCard();
   delay_ms(1000); 
   

   while(1){
      if((SD_DETEC==0)&&(Card_Work==FALSE)){
         delay_ms(500);
         if(SD_DETEC==0){
            Card_work=1;
            SDCard_init();
            FAT_init();
            strcpy(&NombreCorto[0],"CARPET~1");
            strcpy(&NombreLargo[0],"Carpeta de PIC");
            UbicacionFolder=FAT_CreateDirectory(&NombreLargo[0],&NombreCorto[0],DirectorioRaiz);
            strcpy(&NombreCorto[0],"ARCHIV~1.txt");
            strcpy(&NombreLargo[0],"Archivo con PIC.txt");
            FAT_CreateFile(&NombreLargo[0],&NombreCorto[0],UbicacionFolder,&Texto[0]);
            FAT_OpenAddFile(&NombreCorto[0],UbicacionFolder,&Texto[0]);
         }
      }
         
         
      if((SD_DETEC==1)&&(Card_Work==TRUE)){
         Card_work=0;
      }
   }
 
}
   

Consegui una imagen de un ejemplo : imagen64.ima, y comence la simulacion comentando la parte de:

Código: [Seleccionar]
  /* #if defined(SDCARD_DEBUG)
      printf("\r\n--> Se envia CMD59 (Desactivación de CRC)\r\n");
   #endif
   // Se desactiva CRC.
   if(SDCard_send_command(CMD59,0,&Respuesta)==0){
      return(0);
   }
   if(Respuesta.R1.Val!=0){
      return(0);
   }*/
   

y en la simulación se tranca en se inicia sincronizacion, realizando algo de debugging encontre que el problema esta en, probe comentando el for, aumentando i<50,100 etc y no pasa de esa linea.
Código: [Seleccionar]
   for(i=0;i<20;i++) WriteMedia(0xFF);    // Para sincronización.
en WriteMedia(0xFF) que es la funcion:

Código: [Seleccionar]
void WriteMedia(UINT8 data_out){
   
  UINT8 TempVar; 
 
   #ifdef __18CXX
      TempVar = SSPBUF;           // Clears BF
      PIR1bits.SSPIF = 0;         // Clear interrupt flag
     
      SSPBUF = data_out;          // write byte to SSPBUF register
      while( !SSPSTATbits.BF );   // wait until bus cycle complete
   #endif
   #if defined(__PCH__)
      spi_write(data_out);
   #endif 
   #if defined (__PIC32MX__)
      TempVar = SPI1BUF; 
      SPI1BUF = data_out;              // Write to buffer for TX
      while( !SPI1STATbits.SPIRBF);    // Wait transfer complete
   #endif 
}

al parecer existe algun problema con el spi_write(0xFF), en anteriores versiones vi que utilizaron spi_xfer, y esas librerias antiguas si me funcionan.

Cual podría ser el problema?


PD: Tambien probé en Hardware, descomentando la parte del CRC, y no tengo respuesta. Utilizo el diagrama básico, con resistencias de 1.8k y 3.3k . En la SD tengo 3.15 V de voltaje (LM317) y con los divisores obtengo 3.13 V.

Esos voltajes son suficientes o debería llegar a los 3.3V?


Agradezco de antemano su ayuda!


Saludos


Jorge


(http://img.overpic.net/images/f/u/s/xfuslrya1p0kqp0pvftlh.jpg)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 10 de Mayo de 2012, 14:40:59
Sinceramente ya no utilizo CCS, o muy muy poco. Podes revisar que se ejecute OpenSPI(SPI_FOSC_64, MODE_11, SMPMID); y que se configuren los registros correctamente.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: JorgeS en 11 de Mayo de 2012, 10:23:16
Tenias razon!, en SDCardSPI.c tenia el llamado a:

Código: [Seleccionar]
   InitSPI(VELOCITY_SPI_LOW);
pero en HardwareSPI.c no estaba definida la opcion para PCH:

Código: [Seleccionar]
switch(Velocity){
      case VELOCITY_SPI_LOW:
         #ifdef __18CXX
         CloseSPI();
         OpenSPI(SPI_FOSC_64, MODE_11, SMPMID);
       
         #endif
       
         #if defined (__PIC32MX__)
         SPI1CON = 0x0000;
         SPI1BRG = 19;       // Clock = FCB/2*(19+1) = 1 MHz
         SPI1CON = 0x8120;   // ON, CKE=1; CKP=0, Sample Middle   
         #endif
      break;


Agregrandolo, ya pude pasar de sincronizacion :D, ahora voy a investigar por que obtengo este otro problema:

(http://img.overpic.net/images/7/m/k/x7mk4nu7je33o303fl5x.jpg)


Saludos


Jorge
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: JorgeS en 12 de Mayo de 2012, 15:31:29
Hola a todos, les cuento que ya tengo la simulacion funcionando, solo que ahora tengo problemas con el hardware....grabe el PIC descomentando la parte de:
Código: [Seleccionar]
  // Deshabilitado para simulación:
   #ifdef RS232_DEBUG
      printf("\r\n--> Se envia CMD59 (Desactivación de CRC)\r\n");
   #endif
   // Se desactiva CRC.
   if(SDCard_send_command(CMD59,0,Respuesta)==0){
      return(0);
   }else if(Respuesta!=0){
      return(0);
   }
 

Y no funciona, uso el hardware minimo con resistencias de 1.8k y 3.3k, alimento a la tarjeta SD con 3.24 V, y con el divisor resistivo tengo 3.20V. Probe aumentando un poco el voltaje de alimentacion de la SD a 3.4V, y no funciona.

Tengo una memoria Kingston de 2GB y una memoria SD que venia con un celular sony ericsson de 2 GB y ninguna funciona.

Les di formato con el programa: SDFormatter  con la opcion OverWrite, luego de intentar escribir algo, formatee con XP en 2 computadoras distintas y nada!!  :( :(


Esta es la imagen del WinHex de una de mis memorias:

(http://img.overpic.net/images/q/7/4/xq7456jhsywwrxiqsnbx.jpg)


Y esta de la segunda memoria, en el sector donde se realizo el overwrite con las y:


(http://img.overpic.net/images/u/y/7/xuy73jei2b8j7flqa0wqb.jpg)



¿Alguna sugerencia?


Agradezco de antemano su ayuda



Saludos


Jorge
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 12 de Mayo de 2012, 15:59:06
Nada de nada? O sea, no inicializa? El debug que indica?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: JorgeS en 12 de Mayo de 2012, 16:15:23
Estoy realizando el Debug con unos LEDs, y al parecer llega al final del programa sin inconvenientes  :?


EDITADO:


Adjunto el programa y su simulacion, estoy usando una version anterior de fat16 la 1.3 por que no necesito buscar ni la compatibilidad con C18.

Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 12 de Mayo de 2012, 17:45:52
Recomiendo usar la 1.8 que trata de solucionar algunos bug. 1.3 totalmente obsoleta  ;-)


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: JorgeS en 12 de Mayo de 2012, 21:42:32
Suky al implementar la version 1.8, tengo un ciclo infinito en fat_init()

(http://img.overpic.net/images/7/m/k/x7mk4nu7je33o303fl5x.jpg)

supongo que se da en la parte de:

Código: [Seleccionar]
  if(SDCard_read_block(0,&BufferFAT[0])==0){
     
      return(0);
     
   }


Disculpa mi ignorancia, pero por mas que vea el codigo no entiendo donde podria estar el error en la parte de:

Código: [Seleccionar]
SDCard_read_block(UINT32 Address,UINT8 *Buffer){
   
   SDCARD_RESPUESTA Respuesta;
   UINT8 TokenTmp;
   UINT16 i;
   
   // Se envia comando para leer bloque de bytes.-
   #if defined(SDCARD_DEBUG)
      printf("\r\n--> Se envia CMD17 (Lectura de bloque)\r\n");
   #endif
   SDSelect();
   if(SDCard_send_command(CMD17,Address,&Respuesta)==0){
      return(0);
   }
   if(Respuesta.R1.Val!=0){
      return(0);
   } 
// Pasamos a esperar Token.
   i=0;
   do{
      TokenTmp=ReadMedia();
      i++;
   }while(TokenTmp==0xFF && i<SDCARD_TIMEOUT);// Mientras sea 0xFF.-
   if(i>=SDCARD_TIMEOUT){SDDeselect();return(0);}
   if((TokenTmp&0xE0)==0){ // Si se recibe 000xxxxx y no 0xFE.-
      SDDeselect();
      return(0);
   }
   #if defined(SDCARD_DEBUG)
   //   printf("Toquen recibido: 0x%X\r\n",TokenTmp);
   #endif
   // Todo ok, recibimos data.-
   for(i=0;i<BLOCK_SIZE;i++){
      *Buffer++=ReadMedia();
   }
   // Ignoramos CRC.-
   ReadMedia();
   ReadMedia();
   
   SDDeselect();
   #if defined(SDCARD_DEBUG)
   //   printf("Terminada la lectura\r\n");
   #endif
   
   return(1);   


No entiendo por que no funcionaria la simulación, por que en el foro de ucontrol vi, que para probar la libreria solo hay que copiar el código ejemplo, agregar librerias y compilar. De tantos intentos creí que la simulación era la que fallaba así que compile el ejemplo con la librería 1.8 lo probé en el hardware e igualmente no me escribe nada :( como puse en el post anterior.

De tan frustrado que estoy con esto del CCS, estoy pasandome al C18 espero tener mejor suerte xD.

¿Alguna idea de por que tengo ese ciclo infinito?


Saludos


Jorge
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: churrinfunflais en 05 de Junio de 2012, 15:19:17
Hola!!!

Eh estado tratando de implementar una memoria SD en mis proyectos pero no lo logro, eh seguido el AN1045 y nada también la guia de Suky y no logro compilar también eh intentado el ejemplo que biene en el stack de microchip , sera que tengo algo mal??

ejemplo del Stack:
Código: [Seleccionar]
/******************************************************************************
 *
 *               Microchip Memory Disk Drive File System
 *
 ******************************************************************************
 * FileName:        Demonstration.c
 * Dependencies:    FSIO.h
 * Processor:       PIC18
 * Compiler:        C18
 * Company:         Microchip Technology, Inc.
 *
 * Software License Agreement
 *
 * The software supplied herewith by Microchip Technology Incorporated
 * (the �Company�) for its PICmicro� Microcontroller is intended and
 * supplied to you, the Company�s customer, for use solely and
 * exclusively on Microchip PICmicro Microcontroller products. The
 * software is owned by the Company and/or its supplier, and is
 * protected under applicable copyright laws. All rights are reserved.
 * Any use in violation of the foregoing restrictions may subject the
 * user to criminal sanctions under applicable laws, as well as to
 * civil liability for the breach of the terms and conditions of this
 * license.
 *
 * THIS SOFTWARE IS PROVIDED IN AN �AS IS� CONDITION. NO WARRANTIES,
 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
 * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
 * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 *****************************************************************************/


/*****************************************************************************
        Note:  This file is included to give you a basic demonstration of how the
           functions in this library work.  Prototypes for these functions,
           along with more information about them, can be found in FSIO.h
 *****************************************************************************/

//DOM-IGNORE-BEGIN
/********************************************************************
 Change History:
  Rev            Description
  ----           -----------------------
  1.2.4 - 1.2.6  No Change
  1.2.6          Add support for the PIC18F46J50_PIM
  1.3.4          Added support for PIC18F8722 on PIC18 Explorer Board
 ********************************************************************/
//DOM-IGNORE-END


#include "FSIO.h"


#if defined(PIC18F87J50_PIM) // Configuration bits for PIC18F87J50 FS USB Plug-In Module board
#pragma config XINST    = OFF    // Extended instruction set
#pragma config STVREN   = ON      // Stack overflow reset
#pragma config PLLDIV   = 3         // (12 MHz crystal used on this board)
#pragma config WDTEN    = OFF      // Watch Dog Timer (WDT)
#pragma config CP0      = OFF      // Code protect
#pragma config CPUDIV   = OSC1      // OSC1 = divide by 1 mode
#pragma config IESO     = OFF      // Internal External (clock) Switchover
#pragma config FCMEN    = OFF      // Fail Safe Clock Monitor
#pragma config FOSC     = HSPLL     // Firmware must also set OSCTUNE<PLLEN> to start PLL!
#pragma config WDTPS    = 32768
//      #pragma config WAIT     = OFF      // Commented choices are
//      #pragma config BW       = 16      // only available on the
//      #pragma config MODE     = MM      // 80 pin devices in the
//      #pragma config EASHFT   = OFF      // family.
#pragma config MSSPMSK  = MSK5
//      #pragma config PMPMX    = DEFAULT
//      #pragma config ECCPMX   = DEFAULT
#pragma config CCP2MX   = DEFAULT   
#elif defined(PIC18F46J50_PIM)
#pragma config WDTEN = OFF          //WDT disabled (enabled by SWDTEN bit)
#pragma config PLLDIV = 3           //Divide by 3 (12 MHz oscillator input)
#pragma config STVREN = ON            //stack overflow/underflow reset enabled
#pragma config XINST = OFF          //Extended instruction set disabled
#pragma config CPUDIV = OSC1        //No CPU system clock divide
#pragma config CP0 = OFF            //Program memory is not code-protected
#pragma config OSC = HSPLL          //HS oscillator, PLL enabled, HSPLL used by USB
#pragma config T1DIG = ON           //Sec Osc clock source may be selected
#pragma config LPT1OSC = OFF        //high power Timer1 mode
#pragma config FCMEN = OFF          //Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF           //Two-Speed Start-up disabled
#pragma config WDTPS = 32768        //1:32768
#pragma config DSWDTOSC = INTOSCREF //DSWDT uses INTOSC/INTRC as clock
#pragma config RTCOSC = T1OSCREF    //RTCC uses T1OSC/T1CKI as clock
#pragma config DSBOREN = OFF        //Zero-Power BOR disabled in Deep Sleep
#pragma config DSWDTEN = OFF        //Disabled
#pragma config DSWDTPS = 8192       //1:8,192 (8.5 seconds)
#pragma config IOL1WAY = OFF        //IOLOCK bit can be set and cleared
#pragma config MSSP7B_EN = MSK7     //7 Bit address masking
#pragma config WPFP = PAGE_1        //Write Protect Program Flash Page 0
#pragma config WPEND = PAGE_0       //Start protection at page 0
#pragma config WPCFG = OFF          //Write/Erase last page protect Disabled
#pragma config WPDIS = OFF          //WPFP[5:0], WPEND, and WPCFG bits ignored
#elif defined(__18F8722)
#pragma config OSC=HSPLL, FCMEN=OFF, IESO=OFF, PWRT=OFF, WDT=OFF, LVP=OFF, XINST=OFF
#else
#endif

char sendBuffer[22] = "This is test string 1";
char send2[2] = "2";
char receiveBuffer[50];

char dirname1[16] = ".\\ONE\\TWO\\THREE";
char dirname2[14] = "ONE\\TWO\\THREE";
char dirname3[14] = "FOUR\\FIVE\\SIX";
char dirname4[60] = "FOUR\\FIVE\\SEVEN\\..\\EIGHT\\..\\..\\NINE\\TEN\\..\\ELEVEN\\..\\TWELVE";
char dirname5[31] = "\\ONE\\TWO\\THREE\\FOUR\\FIVE\\EIGHT";
char dirname6[10] = "FOUR\\NINE";
char dirname7[2];

void main(void) {
    FSFILE * pointer;
    char path[30];
    char count = 30;
    char * pointer2;
    SearchRec rec;
    unsigned char attributes;
    unsigned char size = 0, i;

#if (defined(__18CXX) & !defined(PIC18F87J50_PIM)) || defined(__18F8722)
    ADCON1 |= 0x0F; // Default all pins to digital
#elif !defined(PIC18F87J50_PIM)
    AD1PCFG = 0xFFFF;
#endif
#if defined(PIC18F87J50_PIM)
    WDTCONbits.ADSHR = 1; // Select alternate SFR location to access ANCONx registers
    ANCON0 = 0xFF; // Default all pins to digital
    ANCON1 = 0xFF; // Default all pins to digital
    WDTCONbits.ADSHR = 0; // Select normal SFR locations
#endif
#if defined(PIC18F46J50_PIM)
    ANCON0 = 0xFF; // Default all pins to digital
    ANCON1 = 0xFF; // Default all pins to digital
#endif
    //********* Initialize Peripheral Pin Select (PPS) *************************
    //  This section only pertains to devices that have the PPS capabilities.
    //    When migrating code into an application, please verify that the PPS
    //    setting is correct for the port pins that are used in the application.
#if defined(PIC18F46J50_PIM)
    RPINR21 = 1; //SDI = RP1
    RPOR4 = 10; //RP4 = SCK
    RPOR2 = 9; //RP2 = SDO
    RPINR22 = 4; //SCK = RP4

    //enable a pull-up for the card detect, just in case the SD-Card isn't attached
    //  then lets have a pull-up to make sure we don't think it is there.
    INTCON2bits.RBPU = 0;

#endif
    while (!MDD_MediaDetect());

    // Initialize the library
    while (!FSInit());

#ifdef ALLOW_WRITES
    // Set the clock value
    // This will determine the create time for the file we're about to make
    // This will set the time and date to 3:05:26 PM on July 27, 2007.
    if (SetClockVars(2007, 7, 27, 15, 5, 26))
        while (1);

    // Create a file
    pointer = FSfopenpgm("FILE3.TXT", "w");
    if (pointer == NULL)
        while (1);

    // Write 21 1-byte objects from sendBuffer into the file
    if (FSfwrite((void *) sendBuffer, 1, 21, pointer) != 21)
        while (1);

    // FSftell returns the file's current position
    if (FSftell(pointer) != 21)
        while (1);

    // FSfseek sets the position one byte before the end
    // It can also set the position of a file forward from the
    // beginning or forward from the current position
    if (FSfseek(pointer, 1, SEEK_END))
        while (1);

    // Write a 2 at the end of the string
    if (FSfwrite((void*) send2, 1, 1, pointer) != 1)
        while (1);

    // Set the time again
    // When called before fclose, this will determine the last time
    // accessed and modified.  This time will be 4 seconds after the last one.
    if (SetClockVars(2007, 7, 27, 15, 5, 30))
        while (1);

    // Close the file
    if (FSfclose(pointer))
        while (1);

    // Set the clock again
    // This time is the last one possible with the FAT file system
    // 11:59:59 PM, December 31, 2106.
    if (SetClockVars(2107, 12, 31, 23, 59, 59))
        while (1);

    // Create a second file
    pointer = FSfopenpgm("FILE1.TXT", "w");
    if (pointer == NULL)
        while (1);

    // Write the string to it again
    if (FSfwrite((void *) sendBuffer, 1, 21, pointer) != 21)
        while (1);

    // Close the file
    if (FSfclose(pointer))
        while (1);
#endif

    // Open file 1 in read mode
    pointer = FSfopenpgm("FILE3.TXT", "r");
    if (pointer == NULL)
        while (1);

    if (FSrenamepgm("FILE2.TXT", pointer))
        while (1);

    // Read one four-byte object
    if (FSfread(receiveBuffer, 4, 1, pointer) != 1)
        while (1);

    // Check if this is the end of the file- it shouldn't be
    if (FSfeof(pointer))
        while (1);

    // Close the file
    if (FSfclose(pointer))
        while (1);

    // Make sure we read correctly
    if ((receiveBuffer[0] != 'T') ||
            (receiveBuffer[1] != 'h') ||
            (receiveBuffer[2] != 'i') ||
            (receiveBuffer[3] != 's')) {
        while (1);
    }

#ifdef ALLOW_DIRS
    // Create a small directory tree
    // Beginning the path string with a '.' will create the tree in
    // the current directory.  Beginning with a '..' would create the
    // tree in the previous directory.  Beginning with just a '\' would
    // create the tree in the root directory.  Beginning with a dir name
    // would also create the tree in the current directory
    if (FSmkdir(dirname1))
        while (1);

    // Change to directory THREE in our new tree
    if (FSchdir(dirname2))
        while (1);

    // Create another tree in directory THREE
    if (FSmkdir(dirname3))
        while (1);

    // Create a third file in directory THREE
    pointer = FSfopenpgm("FILE3.TXT", "w");
    if (pointer == NULL)
        while (1);

    // Get the name of the current working directory
    /* it should be "\ONE\TWO\THREE"       */
    pointer2 = FSgetcwd(path, count);
    if (pointer2 != path)
        while (1);

    // Simple string length calculation
    i = 0;
    while (*(path + i) != 0x00) {
        size++;
        i++;
    }
    // Write the name to FILE3.TXT
    if (FSfwrite((void *) path, size, 1, pointer) != 1)
        while (1);

    // Close the file
    if (FSfclose(pointer))
        while (1);

    // Create some more directories
    if (FSmkdir(dirname4))
        while (1);

    /*******************************************************************
            Now our tree looks like this

            \ -> ONE -> TWO -> THREE -> FOUR -> FIVE -> SIX
                                             -> SEVEN
                                             -> EIGHT
                                        NINE -> TEN
                                             -> ELEVEN
                                             -> TWELVE
     ********************************************************************/

    // This will delete only directory eight
    // If we tried to delete directory FIVE with this call, the FSrmdir
    // function would return -1, since FIVE is non-empty
    if (FSrmdir(dirname5, FALSE))
        while (1);

    // This will delete directory NINE and all three of its sub-directories
    if (FSrmdir(dirname6, TRUE))
        while (1);

    // You can't initialize an array in PIC18 to just a backslash
    // Initialize it manually
    dirname7[0] = '\\';
    dirname7[1] = 0;
    // Change directory to the root dir
    if (FSchdir(dirname7))
        while (1);

#endif

#ifdef ALLOW_FILESEARCH
    // Set attributes
    attributes = ATTR_ARCHIVE | ATTR_READ_ONLY | ATTR_HIDDEN;

    // Functions "FindFirstpgm" & "FindNext" can be used to find files
    // and directories with required attributes in the current working directory.

    // Find the first TXT file with any (or none) of those attributes that
    // has a name beginning with the letters "FILE"
    // These functions are more useful for finding out which files are
    // in your current working directory
    if (FindFirstpgm("FILE*.TXT", attributes, &rec))
        while (1);

    // Keep finding files until we get FILE2.TXT
    while (rec.filename[4] != '2') {
        if (FindNext(&rec))
            while (1);
    }

    // Delete file 2.
    // NOTE : "FSremove" function deletes specific file not directory.
    //        To delete directories use "FSrmdir" function
    if (FSremove(rec.filename))
        while (1);
#endif

    /*********************************************************************
            The final contents of our card should look like this:
            \ -> FILE1.TXT
          -> ONE       -> TWO -> THREE -> FILE3.TXT
                                       -> FOUR      -> FIVE -> SIX
                                                            -> SEVEN

     *********************************************************************/


    while (1);
}

Error que aparece:
Código: [Seleccionar]
CLEAN SUCCESSFUL (total time: 67ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD.X'
make  -f nbproject/Makefile-default.mk dist/default/production/SD.X.production.hex
make[2]: Entering directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD.X'
"X:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mcc18.exe"  -p18F8722 -I"C:/Microchip Solutions v2012-04-03/Microchip/Include/MDD File System" -I"C:/Microchip Solutions v2012-04-03/Microchip/Include" -I"C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F" -I"C:/Microchip Solutions v2012-04-03/MDD File System-SD Card"  -I "X:\Program Files (x86)\Microchip\mplabc18\v3.40\bin"\\..\\h  -fo build/default/production/_ext/1472/Demonstration.o   ../Demonstration.c
"X:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mplink.exe"  "..\18f8722_g.lkr"  -p18f8722  -w    -z__MPLAB_BUILD=1  -u_CRUNTIME -l "X:\Program Files (x86)\Microchip\mplabc18\v3.40\bin"\\..\\lib  -o dist/default/production/SD.X.production.cof  build/default/production/_ext/1472/Demonstration.o   
MPLINK 4.40, Linker
Device Database Version 1.3
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - could not find definition of symbol 'FSremove' in file './build/default/production/_ext/1472/Demonstration.o'.
Errors    : 1

make[2]: Leaving directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD.X'
make[1]: Leaving directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD.X'
make[2]: *** [dist/default/production/SD.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 901ms)

Pareciese que no jala las funciones de la libreria "FSIO.h", que piensan??
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: dejuninmza en 11 de Junio de 2012, 11:20:27
hola como estan?les comento que estoy en la implementación de un datalogger con el pic18f4550 y estoy usando la librerias de Suky FAT 1.8..la cuestión que hace unos meses estoy de cabeza con esto..ya logro crear y guardar datos en un archivo en la memoria sd...el problema surge debido a que después de almacenar muchos datos se vuelve lento añadir un dato en el archivo..por ejemplo si se guardan datos cada 1 segundo hay varias veces que el registro se hace cada 2 segundos..esto no pasa con la memoria vacía así que creo que la causa puede ser la búsqueda de un clúster libre en la memoria..además cdo el archivo es muy grande(100MB) también tengo problemas al guardar cada 1 min..la pregunta es si es posible solucionar este problema?..he visto como posible solución la de tener en una variable global el ultimo cluster utilizado pero no se bien como implementarlo..Hay alguna solución alternativa a esta ultima??..
Muchas gracias saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: churrinfunflais en 12 de Junio de 2012, 16:05:19
Aquí les dejo el proyecto en el que estoy trabajando.

Cambie al compilador CX8 para ver si había alguna diferencia pero sigo sin lograr compilar... Saludos

Código: [Seleccionar]
CLEAN SUCCESSFUL (total time: 117ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD_Demo.X'
make  -f nbproject/Makefile-default.mk dist/default/production/SD_Demo.X.production.hex
make[2]: Entering directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD_Demo.X'
"C:\Program Files (x86)\Microchip\xc8\v1.00\bin\xc8.exe" --pass1  --chip=18F8722 -Q -G --asmlist  --double=24 --float=24 --emi=wordwrite --opt=all,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore --mode=pro -N31 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+config,+clib,+plib "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: %%s" "--msgformat=%%f:%%l: advisory: %%s"  -obuild/default/production/main.p1  main.c
"C:\Program Files (x86)\Microchip\xc8\v1.00\bin\xc8.exe"  --chip=18F8722 -G --asmlist -mdist/default/production/SD_Demo.X.production.map  --double=24 --float=24 --emi=wordwrite --opt=all,+asm,-asmfile,+speed,-space,-debug,9 --addrqual=ignore --mode=pro -N31 --warn=0 --summary=default,-psect,-class,+mem,-hex,-file --runtime=default,+clear,+init,-keep,-no_startup,+osccal,-resetbits,-download,-stackcall,+config,+clib,+plib "--errformat=%%f:%%l: error: %%s" "--warnformat=%%f:%%l: warning: %%s" "--msgformat=%%f:%%l: advisory: %%s"   -odist/default/production/SD_Demo.X.production.cof  build/default/production/main.p1     
Microchip MPLAB XC8 C Compiler (Free Mode)  V1.00
Copyright (C) 2012 Microchip Technology Inc.
(1273) Omniscient Code Generation not available in Free mode (warning)
:: advisory: Employing 18F8722 errata work-arounds:
:: advisory:  * Corrupted fast interrupt shadow registers
main.c:167: warning: "RAM" is positioned at address 0x0 and has had its address taken; pointer comparisons may be invalid
:0: error: undefined symbols:
        _FSgetcwd(dist/default/production\SD_Demo.X.production.obj) _FSfclose(dist/default/production\SD_Demo.X.production.obj) _FSfwrite(dist/default/production\SD_Demo.X.production.obj) _FSremove(dist/default/production\SD_Demo.X.production.obj) _FindNext(dist/default/production\SD_Demo.X.production.obj) _FSrenamepgm(dist/default/production\SD_Demo.X.production.obj) _FSfeof(dist/default/production\SD_Demo.X.production.obj) _FSInit(dist/default/production\SD_Demo.X.production.obj) _FSfread(dist/default/production\SD_Demo.X.production.obj) _FSfseek(dist/default/production\SD_Demo.X.production.obj) _FSftell(dist/default/production\SD_Demo.X.production.obj) _FSchdir(dist/default/production\SD_Demo.X.production.obj) _FSmkdir(dist/default/production\SD_Demo.X.production.obj) _FSrmdir(dist/default/production\SD_Demo.X.production.obj) _FSfopenpgm(dist/default/production\SD_Demo.X.production.obj) _FindFirstpgm(dist/default/production\SD_Demo.X.production.obj) _MDD_SDSPI_MediaDetect(dist/default/production\SD_Demo.X.production.obj) _SetClockVars(dist/default/production\SD_Demo.X.production.obj)
make[2]: Leaving directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD_Demo.X'
make[1]: Leaving directory `C:/Microchip Solutions v2012-04-03/MDD File System-SD Card/PIC18F/SD_Demo.X'
(908) exit status = 1
make[2]: *** [dist/default/production/SD_Demo.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 2s)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: churrinfunflais en 13 de Junio de 2012, 12:54:25
Al fin,, Logre compilar el proyecto ahora lo estoy tratando de simular en el proteus pero nunca eh usado el simulador de SD, que es lo que debo saber para poder utilizarlo de forma correcta, al parecer me pide una imagen, esto que significa, también no se si mi circuito es correcto, según yo realice las conexiones que indica el archivo HardwareProfile.h pero no estoy seguro de estar haciéndolo bien... un poco de ayuda please..

Código: [Seleccionar]
#elif defined(__18F8722)

        #define USE_PIC18
        #define USE_SD_INTERFACE_WITH_SPI

        #define INPUT_PIN           1
        #define OUTPUT_PIN          0

        // Chip Select Signal
        #define SD_CS               PORTBbits.RB3
        #define SD_CS_TRIS          TRISBbits.TRISB3

        // Card detect signal
        #define SD_CD               PORTBbits.RB4
        #define SD_CD_TRIS          TRISBbits.TRISB4

        // Write protect signal
        #define SD_WE               PORTAbits.RA4
        #define SD_WE_TRIS          TRISAbits.TRISA4

        // Registers for the SPI module you want to use
        #define SPICON1             SSP1CON1
        #define SPISTAT             SSP1STAT
        #define SPIBUF              SSP1BUF
        #define SPISTAT_RBF         SSP1STATbits.BF
        #define SPICON1bits         SSP1CON1bits
        #define SPISTATbits         SSP1STATbits

        #define SPI_INTERRUPT_FLAG  PIR1bits.SSPIF

        // Defines for the HPC Explorer board
        #define SPICLOCK            TRISCbits.TRISC3
        #define SPIIN               TRISCbits.TRISC4
        #define SPIOUT              TRISCbits.TRISC5

        // Latch pins for SCK/SDI/SDO lines
        #define SPICLOCKLAT         LATCbits.LATC3
        #define SPIINLAT            LATCbits.LATC4
        #define SPIOUTLAT           LATCbits.LATC5

        // Port pins for SCK/SDI/SDO lines
        #define SPICLOCKPORT        PORTCbits.RC3
        #define SPIINPORT           PORTCbits.RC4
        #define SPIOUTPORT          PORTCbits.RC5

        #define SPIENABLE           SSPCON1bits.SSPEN

#define SPI_INTERRUPT_FLAG_ASM  PIR1, 3

        // Will generate an error if the clock speed is too low to interface to the card
        #if (GetSystemClock() < 400000)
            #error System clock speed must exceed 400 kHz
        #endif

Saludos...
Diagrama (https://docs.google.com/file/d/0B1p64iClB1upLUJibm40TExNQVE/edit?pli=1)
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: churrinfunflais en 13 de Junio de 2012, 14:20:23
Como puedo simular la inserción de la tarjeta en proteus?? alparecer esto es requerido para que el codigo avance , se lo contrario se queda esperando esta señal.

Código: [Seleccionar]
   while (!MDD_MediaDetect());

// Initialize the library
while (!FSInit());

Este codigo esta basado en el stack de microchip para almacenamiento masivo e implementado en "PIC18 Ecplorer Board" + "PICtail™ Daughter Board for SD™ and MMC Cards", los pines que utiliza son:

SCK   O   RC3/RB1   SPI Clock Out
SDI   I   RC4/RB0   SPI Data In
SDO   O   RC5/RC7   SPI Data Out
CD   I   RB4   Physical Card Insertion Detect Signal
WD   I   RA4   Physical Write-Protect Switch Status Signal
CS   O   RB3   Low Asserting SPI Chip Select
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: mosesito en 01 de Septiembre de 2012, 04:29:45
Las SDHC soportan SPI ? Me parece que no, como máximo siempre se trabajó con memorias hasta 2Gb

hola amigo donde puedo bajar la libreria fat16 1.8  y tambien las mosificaciones de low speed y high speed producen error

donde agrego esas funciones saludos

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Mat_DM2012 en 22 de Octubre de 2012, 19:45:48
Hola colegas... como les vá? no se si será el sobforo adecuado, pero estuve buscando ya hace varios dias y no encuentro aún nada. Lo que quiero es escribir y leer una tarjeta sd, el tema es que no manejo el "C" ni el "asembler", solo manejo y algo el Basic.
Quisiera que alguien me explique simplficadamente como hacer paa leer y escribir. Solo eso.

Espero que no les cause molestias...

Saludos y espero su ayuda con ansias...

nos vemos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: federics en 01 de Diciembre de 2012, 00:03:56
Hola. Tengo un problema, he implementado las funciones de inicializacion y escritura y cuando envio los comandos, la tarjeta responde perfectamente. Pero cuando escribo el comando CMD24, y recibo la respuesta, envio el token(0xFE), los datos y el CRC. Nunca recibo una respuesta y no logro escribir datos en la memoria. Hace dias reniego. Por favor si alguien sabe porque puede ser. Muchas gracias.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 20 de Agosto de 2013, 20:01:38
Saludo a todos los amigos del foro.
Hola amigo suki. ((:-))
Tengo que hacer un sistema para guardar claves a traves de un teclado matricial 4x4
en 4 y 6 digitos ¿el  largo del bloque para escritura lectura lo puedo configurar como 6
para guardar los números char Buffer[6]?. Mi idea es que al a leer la memoria con winhex.
pueda ver algo como esto.

1234 000000000000
567899000000000000
9854 000000000000
116587 00000000000

es para consultarlas a traves de un pc normal.
Gracais por tu ayuda. :-/


Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 20 de Agosto de 2013, 21:22:44
Hola! No, se puede escribir solo de a 512 bytes, leer si se puede seleccionar cualquier rango.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 21 de Agosto de 2013, 00:01:26
Gracias por contestar.
Me dejas medio frio, entonces como me puedo plantear este problema.
mi necesidad es poder leer ordenadamente estas claves? con un formato coherente.
agradezco la ayuda que me puedas dar.
Un saludo.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 21 de Agosto de 2013, 15:26:42
Amigo suky. :-/
Perdon por molestar tanto.
Tome este ejemplo para modificarlo, pero al sólo compilarlo me da un monton de errores
tengo ccs 4.104. sera que se compilo antes con otro codigo fuente algo distinto a este..
Te agradezco me des una mano con esto. :oops:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 28 de Agosto de 2013, 01:04:41
Hola amigo Suki.
Veo que estas ocupado; ya le queme bastante tiempo a esto de la memoria SD, usando los ejemplos de arossini.com.ar.
Logre simular perfecto lectura y escritura de la memoria, pero al pasar a protoboard, lo primero dañe la fat de la memoria y me toco formatear con win xp. Preciso leo y me pasa.
 :oops:
Ahora solo tengo el sector físico.
Tengo libre en 00000 desde el segundo bloque y empieza desde 512, ahora, ¿como calculo esta dirección para escribir la SD?
En el documento de arossini dice que es sector*512, pero ya no aparece physical sector No ni lógicas sector No
al leer la memoria con  winhex.
Al copiar archivos desde xp la memoria se deja escribir y leer.
¿Me podrías dar una manito con esto?
 :?
Gracias.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 28 de Agosto de 2013, 13:44:55
Hola, mi punto de vista. La memorias MMC/SD viene normalmente preformateadas en FAT ( 12/16/32 ) dependiendo del tamaño de la misma. Toda tarjeta internamente tiene una(s) memoria Nand Flash y un controlador. El protocolo de comunicación con la memoria unicamente sabe de sectores lógicos ( LBA logical block address ) y el formato FAT es una interpretación hecha por una capa de más alto nivel. Lo que desarrollo Suky ( ampliamente desarrollado en este post y posiblemente unos de los mejores del foro ) es justamente como hacer la interpretación lógica desde tu firmware para poder acceder/leer/escribir en la memoria. Finalizando, no te metas en tratar de escribir en sectores lógicos perdidos por ahí, posiblemente rompas el formato. Simplemente utiliza la librería de Suky y creas un archivo y escribís sobre el mismo lo que quieras.

Saludos !
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 28 de Agosto de 2013, 18:58:29
La verdad es que en proteus todo funciona bien, pero en el rpotoboard  nada anda..
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 28 de Agosto de 2013, 20:46:57
La verdad es que en proteus todo funciona bien, pero en el rpotoboard  nada anda..

En protoboard puede dar problemas.. Proba bajando la velocidad de SPI y asegura las conexiones, y que no sean cables muy largos.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 28 de Agosto de 2013, 22:35:39
Gracias por responder. :-/
La verdad es que quiero hacer mi propia subrutina y no copiar y pegar, pues no aprendería nada.
Ya solucione el problema, tenia un while que no me dejaba pasar de ahí.
Ahora ya escribo y leo muy bien, pero a pesar de esto, cuando chequeo  "if(D_in!=0x05){output_a(0x05);} else{ output_a(0x01);}" después de escribir la memoria
para asegurar buena escritura esperando respuesta de la SD; se me ejecuta el else; y al revisar la memoria con winhex, esta fue bien escrita en el bloque seleccionado
y el resto de los 512 byte rellenados con 0xff.
Alguna sugerencia?
La estoy sudando pero quiero aprender bien el tema. :P
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 03 de Septiembre de 2013, 20:45:22
Hola amigos.
Alguien me puede decir, como creo imagenes de sd en fat16 con winimage.
Las imagenes que creo salen en fat12 y la simulación no reconoce estas; las imagenes de la sd reales que creo, demoran mucho
en ser creadas y ocupan mucho espacio, alguien me puede decir como crean estas, en un foro vi una en fat16 que pesaba solo 300kb y trabaja perfecto, esta en winimage .
Gracias.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 03 de Octubre de 2013, 17:11:12
Buenas a todos!!

Estoy comenzando con este tema y me baso en la librería se Suky, la versión que está disponible en su web, más lo que voy leyendo en este foro y en otras páginas.

El tema está en que en el simulador anda todo perfectamente, desde leer la SD hasta crear carpetas y directorios.

Ahora, cuando lo llevo a la realidad y quiero leer la SD, para poder inicializar el FAT, solo leo 0x00 en todo el bloque inicial. Pense que era la SD y la leo con el WinHex y están todos los datos, nada de 0x00, en el sector inicial. Me fijo si se inicia mal la SD, pero aparentemente, se inicia todo bien. El drama solo esta el la lectura, ya que, hata el CMD17 y el tocken se da todo bien.

Dejo lo que se lee por DEBUG:





--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repuesta al ultimo CMDxx : 1)

--> Se envia CMD1 (Se activa SD Card)

Repuesta al ultimo CMDxx : 0)

--> Se envia CMD16 (Se fija largo del Bloque para escritura/lectura : 512)
Repuesta al ultimo CMDxx : 0)

--> Se envia CMD17 (Lectura de bloque)
Repeticiones para respuesta de CmdXX: 3; Respuesta recibida:0
Toquen recibido: 0xFE
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03
02 00 06 07 E0 C0 61 00 00 00 9F C0 03 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

Terminada la lectura
FAT_init:
-->Bytes por sector:0
-->Sectores por cluster:0
-->Numero de sectores reservados:0
-->Numero de copias FATs:0
-->Numero de entradas directorio raiz:0
-->Numero de sectores ocupados por un FAT:0
-->Primer sector de FAT1:0
-->Primer sector de FAT2:0
-->Primer sector del directorio raiz:0
-->Numero de sectores utilizados por directorio raiz:0
-->Numero de bytes por cluster:0




Espero que me puedan dar una mano, porque ya no se qué mas hacer o modificar

Saludos!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 03 de Octubre de 2013, 20:20:20
Estas utilizando CCS o algún compilador de Microchip? Si usas este último intenta utilizar su librería haber si resulta lo mismo. Yo hace mucho que no toco nada del tema, así que no puedo ayudar.



Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Nocturno en 04 de Octubre de 2013, 01:33:55
¿Será que hay alguna conexión mal hecha?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 07 de Octubre de 2013, 10:31:39
Gracias por las repuestas...

Suky, me he puesto a probar con la librería del CCS, como me decías, ya que programo con el CCS. Pero así mismo, en la memoria micro SD que es de 128MB marca Nokia, hace lo mismo. En el caso de una SanDisk, no se logra iniciar. Me falta probar con una kignston para ver si es problema de la marca, ya que con una logro algo más que con la otra.

Nocturno, no creo que sea una mala conexión, porque midiendo con el osciloscopio, hay comando que los recibe o por lo menos eso parece porque hay repuesta.

En general, ya me siento un poco decepcionado, porque al medir con el osciloscopio (voy a volver a corroborar bien), pero no encuentro que no se responda lo que debe ser. Ahora voy a probar leer comando por comando, para ver si se envía lo que se debe y se responde lo que se debe.

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: omix en 07 de Octubre de 2013, 15:37:10
Hola,
los síntomas que comentas parece como si no estuviera el SPI en modo 0,0, es decir, CKE = 1, CKP = 0. Algo similar me ocurrió a mi, y era porque lo tenia configurado con CKE = 0 y CKP = 0, hacia que a veces leyera bien y otras no, pero en cuanto me di cuenta de eso empezó a funcionar correctamente siempre.

Un saludo.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: cosmic en 07 de Octubre de 2013, 16:41:14
Es bastante raro, yo use las librerias de suky y logre escribir y leer las cuatro marcas de memorias que tenia a mano :-/
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 07 de Octubre de 2013, 17:10:42
Omix, gracias por tu repuesta.

Algo de eso pensé que podría ser, pero ya a estas alturas estoy super mareado  :5].

He leído en varios lados y las SD /MMC soportan modos 0 y 3. Tengo en el CCS el MODE=0, pero cuando mido en el osciloscopio, el clock posee un cero para el idle. Cuando pruebo el MODE=3, el clock posee un idle de uno. Buscando en internet, las tablas dicen lo contrario, justo al revés. Entonces, me podrías aclarar, si no es molestia, cómo debería estar el clock y en qué flanco se leería?? Porque de ser esto que está mal, por qué sale todo OK, menos los datos??

Cosmic, qué versión de CCS usaste?? Me podrías pasar un rar con la librería tal cual la tienes así la pruebo??

Saludos!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 07 de Octubre de 2013, 17:24:21
Un detalle, que no ha de ser para menos.

Con la librería de suky, obtenía lo que puse más arriba, en una memoria Nokia de 128MB. Con la librería del CCS, la mmcsd.c y la misma memoria, obtengo esto:





Inicializando Memoria

Comando CMD0...OK - 0
Comando CMD1...OK - 153
Comando CMD55...R1 = 0
Comando ACMD41...R1 = 4
Comando CMD16...OK - 0
Comando CMD E/D CRC...OK - 255
Comando CMD17...OK - 0
Esperando Token...OK

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03
02 00 06 07 E0 C0 61 00 00 00 9F C0 03 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA



Por lo que se ve, se puede leer prácticamente lo mismo. Podrá ser algún problema con la versión del compilador?? Porque con el WinHex, esta memoria tiene contenido en la dirección 0x00000000.

Ahora voy hacer la misma prueba de los dos códigos con la memoria SanDisk de 4GB.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 07 de Octubre de 2013, 17:31:03
Bueno, este es el resultado con los dos códigos, pero con una SanDisk.

librería Suky




--> Se inicia sincronizacion

--> Se envia CMD0 (Se desactiva SD Card)

Repuesta al ultimo CMDxx : 1)

--> Se envia CMD1 (Se activa SD Card)



Librería mmcsd.c del CCS:




Inicializando Memoria

Comando CMD0...OK - 0
Comando CMD1...1



Como se puede observar, ambas se clavan en el CMD1, apenas se trata de inicializar. En el caso del código mmcsd.c, le agregué que si sale por timeout, me diga cuál fue el el útlimo R1 que recibió. Claramente, el CMD1 responde 0x01, para la SanDisk.

Al parecer no me va a quedar otra que comprar una SD de otra marca, para comprobar de dónde proviene el error.

Ya es bastante info, o por lo menos no estamos navegando a ciegas. Estos últimos resultados han dado un par de posibilidades más de por qué, con la memoria de Nokia, leo lo que leo. Tal vez sea por falta de algún comando o cosa propia de la marca.

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 07 de Octubre de 2013, 20:11:31
Hola! Probaste de escribir el sector y después leerlo? Y eso mismo mirarlo con el WinHex?


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: omix en 08 de Octubre de 2013, 16:31:34
Omix, gracias por tu repuesta.

Algo de eso pensé que podría ser, pero ya a estas alturas estoy super mareado  :5].

He leído en varios lados y las SD /MMC soportan modos 0 y 3. Tengo en el CCS el MODE=0, pero cuando mido en el osciloscopio, el clock posee un cero para el idle. Cuando pruebo el MODE=3, el clock posee un idle de uno. Buscando en internet, las tablas dicen lo contrario, justo al revés. Entonces, me podrías aclarar, si no es molestia, cómo debería estar el clock y en qué flanco se leería?? Porque de ser esto que está mal, por qué sale todo OK, menos los datos??

Efectivamente las tarjetas SD técnicamente soportan ambos modos el 0 y 3, aunque yo personalmente uso siempre el 0 porque casi todos los dispositivos que utilizo usan este modo y si pongo varios en el mismo bus SPI no tengo que andar cambiando de modo. En ambos modos el dato se pone en el flanco descendente y se lee en el ascendente, la única diferencia está en el estado en reposo de la señal de reloj, en el caso de modo 0 se mantiene a 0 y en modo 3 se mantiene a 1.

Saludos.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 08 de Octubre de 2013, 17:12:33
Gracias nuevamente.

Suky, no se cómo me serviría esa prueba ya que, para iniciar el FAT, es necesario leer el primer sector de la SD. Si yo trato de escribir y luego leer lo que escribí, no gano nada. Seguiría sin poder leer la 0x00000000.

Omix, gracias por tu aclaración. Entonces me quedo tranquilo en que el modo, esta OK.

Ahora estuve probando con una micro SD Kingston de 4GB, la cual leí con el WinHex y he obtenido una serie de datos interesantes. Realizando los comandos CMD0 y CMD1 sin deshabilitar la SD, con dos de las memorias me mostraba lo mismo que les mostré antes. Cuando habilito y deshabilito en cada comando, en de ellas me muestra lo mismo que antes. Se el caso que sea, la Kingston no da señal de vida, se clava en la espera de la repuesta del CMD1.

Esto me tiene como loco  :5], no puede ser que no se pueda leer la tabla de la SD. Leo y leo por internet, y a todos los que les anda, tienen de los más variados métodos de inicialización. y ninguno tiene nada parecido al otro, salvo por el CMD0.

Se me queman los libros, ya.... je...
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 08 de Octubre de 2013, 20:56:47
Suky, no se cómo me serviría esa prueba ya que, para iniciar el FAT, es necesario leer el primer sector de la SD. Si yo trato de escribir y luego leer lo que escribí, no gano nada. Seguiría sin poder leer la 0x00000000.


La prueba sería sin sistema de archivos, para  probar el acceso a bajo nivel.


Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 09 de Octubre de 2013, 15:32:34
Suky, entiendo lo que me decís. Ahora lo voy a probar. De todo modos, no me termina de cerrar porque me pregunto qué razón haría que se lea lo que escribí, si ni siquiera lee lo que trae la memoria. Pero ya te comento que sale.

Por otro lado, he probado una librería de un Brasilero, que anduvo perfecto con las MMC y SD viejas. Leoo perfecto el primer sector, el cual contiene la información de la FAT  :-/ :-/. La librería es esta:




Código: [Seleccionar]
/**********************************************
 * ANDRE L. V. SILVA
 * andreluizeng@yahoo.com.br
 *
 * change the strings to your own language if you want (it is in portuguese br)
 *
 * Example of use:
 *
 *
   int main (void)
   {
      pic initialization....

      InicializaSPI ();
      InicializaMMC ();
      InicializaFAT32 ();

      While (TRUE)
      {
         your code ....
      }

      return 0;
   }

 **********************************************/
 
#include "MMCFat32.h"
#include "string.h"

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// Funções do cartão MMC
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

int32 FATTable[128];
int32 gFirstEmptyCluster;
FAT32Vars gFAT32Vars;
diskinforec DiskInfo;
FILE gFiles[MAXFILES];


#byte MMCAddressL       = gFAT32Vars
#byte MMCAddressH       = gFAT32Vars+1
#byte MMCAddressHL       = gFAT32Vars+2
#byte MMCAddressHH       = gFAT32Vars+3
#byte gStartSectorL    = gFAT32Vars+8
#byte gStartSectorH    = gFAT32Vars+9
#byte gStartSectorHL    = gFAT32Vars+10


//-------------------------------------------------------------------------
// Detecção do MMC 
//-------------------------------------------------------------------------
char DetectaMMC (void)
{
   char Resp;
   
   TRIS_DETECTA_MMC = ENTRADA;
   
   printf ("\r\nDetectando MMC...");
   
   if (MMC_DETECT)
   {
      printf ("Nao Conectado !");
      printf ("\r\nAguardando Conexao... ");
       
      while (MMC_DETECT);
   }
   
   TRIS_DETECTA_MMC = ENTRADA;
   MMC_DETECT = SAIDA;
   MMC_DETECT = FALSE;
   
   
   printf ("OK");   
   
   return Resp;
}   

//-------------------------------------------------------------------------
// Configuração da SPI
//-------------------------------------------------------------------------
void InicializaSPI (char Tipo)
{
   TRIS_SPI_SCK      =   SAIDA;
   TRIS_SPI_SDI      =   ENTRADA;
   TRIS_SPI_SDO      =   SAIDA;
   TRIS_SPI_MMC_CS      =   SAIDA;

   MMC_CS   = TRUE;
   SPI_SCK = TRUE;
   SPI_DI   = TRUE;
   SPI_DO   = FALSE;

    if (Tipo == MAXIMO)
   {
      printf ("\r\nAjustando SPI: ");
      printf ("5 MHz...");
     
      SSPEN = FALSE;
      SSPCON1 = SPI_MASTER_SCK_DIV_4;
      SMP = TRUE;
      CKE = FALSE;
      CKP = TRUE;
      SSPEN = TRUE;
   }


   else if (Tipo == MEDIO)
   {
      printf ("\r\nAjustando SPI: ");
      printf ("1.25 MHz...");
     
      SSPEN = FALSE;
      SSPCON1 = SPI_MASTER_SCK_DIV_16;
      SMP = TRUE;
      CKE = FALSE;
      CKP = TRUE;
      SSPEN = TRUE;

   }

   else if (Tipo == MINIMO)
   {
      printf ("\r\nInicializando SPI: ");
      printf ("312.5 KHz...");
     
      SSPEN = FALSE;
      SSPCON1 = SPI_MASTER_SCK_DIV_64;
      SMP = TRUE;
      CKE = FALSE;
      CKP = TRUE;
      SSPEN = TRUE;
   }

   printf ("OK");

   delay_ms (10);

    return;
}



//-------------------------------------------------------------------------
// Função de Seleção do CS do MMC
//-------------------------------------------------------------------------
void SelecionaMMC (boolean Flag)
{
   if (Flag)
   {
      MMC_CS = FALSE;
   }

   else
   {
      MMC_CS = TRUE;
   }
}


//-------------------------------------------------------------------------
// Função para enviar um dado via SPI
//-------------------------------------------------------------------------
void EnviaMMC (char a)
{
   char b;

   BF = FALSE;
   SSPBUF = a;
   while (! BF);
   b = SSPBUF;

   return;
}

//-------------------------------------------------------------------------
// Função para receber um dado via SPI
//-------------------------------------------------------------------------
char RecebeMMC (void)
{
   char b;

   BF = FALSE;
   SSPBUF = 0xff;
   while (! BF);
   b = SSPBUF;

   return b;
}

//-------------------------------------------------------------------------
// 8 pulsos de clock dummy
//-------------------------------------------------------------------------
void MMC8Clock (void)
{
   EnviaMMC (0xff);
   return;
}


//-------------------------------------------------------------------------
// Comando de Reset
//-------------------------------------------------------------------------
void ExecutaCMD0 (void)
{
   char Resp;
   long TimeOut;
   char i;

   // comando CMD0 - Reset
   printf ("\r\n\tResposta ao CMD0...");
   
   do
   {
      SelecionaMMC (FALSE);
     
      Resp = 0xff;
      TimeOut = 100;

      // envia pelo pulsos de clock para inicialização
      for (i = 0; i < 10; i++)   MMC8Clock ();

      // envia CMD0 -> Idle state
      SelecionaMMC (TRUE);
      output_high(PIN_B0);
      EnviaMMC (0x40); // CMD0
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x95); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x01 - caso contrário = falha
      while ((Resp != 0x01) && (TimeOut))
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }

      SelecionaMMC (FALSE);
      MMC8Clock ();
   // roda enquanto der timeout
   } while ((! TimeOut) && Resp!=0x00);

   printf ("OK");
   
   return;
}   

//-------------------------------------------------------------------------
// Modo SPI
//-------------------------------------------------------------------------
void ExecutaCMD1 (void)
{
   char Resp;
   long TimeOut;

   // comando CMD1 - Modo SPI
   printf ("\r\n\tResposta ao CMD1...");
   do
   {
      Resp = 0xff;
      TimeOut = 100;


      // envia CMD1 -> Modo SPI
      SelecionaMMC (TRUE);
      EnviaMMC (0x41); // CMD1
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x01); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contrário = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }

      SelecionaMMC (FALSE);
      MMC8Clock ();

   // roda enquanto der timeout
   } while ((! TimeOut) && Resp!=0x00);

   printf ("OK");
   
   return;
}
   
//-------------------------------------------------------------------------
// Ajusta o tamanho do bloco - 512 bytes
//-------------------------------------------------------------------------
void ExecutaCMD16 (void)
{
   char Resp;
   long TimeOut;
   
   // comando CMD16 - Bloco de 512 bytes
   printf ("\r\n\tResposta ao CMD16...");

   do
   {
      Resp = 0xff;
      TimeOut = 100;

      // envia CMD16 -> block lenght
      SelecionaMMC (TRUE);
      EnviaMMC (0x50); // CMD16
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x02);
      EnviaMMC (0x00);
      EnviaMMC (0x01); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contrário = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }
      SelecionaMMC (FALSE);
      MMC8Clock ();

   // roda enquanto der timeout
   } while ((! TimeOut) && Resp!=0x00);

   printf ("OK");

   return;
}   

//-------------------------------------------------------------------------
// Lê a identificação do cartão - CID
//-------------------------------------------------------------------------
void ExecutaCMD10 (void)
{
   char Resp;
   long TimeOut;
   char i;
   char Ano;
   char Mes;
   char HW;
   char FW;

   // comando CMD10 - Lê a identificação do cartão
   printf ("\r\n\tResposta ao CMD10...");
   
   do
   {
      Resp = 0xff;
      TimeOut = 100;

      SelecionaMMC (TRUE);
         EnviaMMC (0x4A);   //CMD10 - Le CID
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x01);
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contrário = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }

      // dummy
      MMC8Clock ();

      // respondeu
      if (TimeOut)
      {

//         // recebe a identificação - binário (8bits)
//         printf ("\r\n\r\n\tID do Fabricante: 0x%x", RecebeMMC ());   // identificação para MMCA
//
//         // recebe a id de aplicação - binário (16bits)
//         printf ("\r\n\tID da Aplicação: 0x");
//         for (i = 0; i < 2; i++)
//         {
//            printf ("%x", RecebeMMC ());   // identificação para MMCA
//         }
//         
//         printf ("\r\n\r\n\tProduto: ");
//         for (i = 0; i < 6; i++)
//         {
//            printf ("%c", RecebeMMC ());   // 6 próximos bytes - Nome do Produto
//         }
//
//         // revisão do produto - 8bits - BCD
//         printf ("\r\n\r\n\tRevisão do Produto: %02d", RecebeMMC ());
//
//         printf ("\r\n\tSerial: 0x");
//         
//         for (i = 0; i < 4; i++)
//         {
//            printf ("%x", RecebeMMC ());   // 4 próximos bytes - Serial do Produto
//         }
//
//         
//
//
//         FW = Resp & 0x0f;               // Firmware = 4bits menos significativos
//         HW = (Resp >> 4) & 0x0f;         // Hardware = 4bits mais significativos
//         printf ("\r\n\tFirmware: %2d", FW);
//         printf ("\r\n\tHardware: %02d", HW);
//         printf ("\r\n\tFW+HW: 0x%x", Resp);
//         
//         
//   
//         Resp = RecebeMMC ();       // Mes + Ano;
//         Ano = Resp & 0x0f;         // Ano = 4bits menos significativos
//         Mes = (Resp >> 4) & 0x0f;   // Ano = 4bits mais significativos
//
//         printf ("\r\n\tAno: %02d", Ano);
//         printf ("\r\n\tMes: %02d", Mes);
//         printf ("\r\n\tAno+Mes: 0x%x\r\n", Resp);
       
      }

      SelecionaMMC (FALSE);
       
   // roda enquanto der timeout
   } while (! TimeOut); 

   printf ("OK"); 
   
   return;
}
   
//-------------------------------------------------------------------------
// Lê o formato do cartão - CSD
//-------------------------------------------------------------------------
void ExecutaCMD9 (void)
{
   char Resp;
   long TimeOut;

   // comando CMD9 - Lê o formato do cartão
   printf ("\r\n\tResposta ao CMD9...");
   
   do
   {
      Resp = 0xff;
      TimeOut = 100;

      SelecionaMMC (TRUE);
         EnviaMMC (0x49);   //CMD9 - Le CSD
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x01);
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contrário = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }
       
      // Respondeu
      if (TimeOut)
      {
         
      }

      SelecionaMMC (FALSE);

   // roda enquanto der timeout
   } while (! TimeOut);

   printf ("OK");
   
   return;
}   

//-------------------------------------------------------------------------
// Muda para o modo de high-speed
//-------------------------------------------------------------------------
void ExecutaCMD6 (void)
{
   char Resp;
   long TimeOut;

   // comando CMD6 - high speed (manual mmc plus)
   printf ("\r\n\tResposta ao CMD6...");
   
   do
   {
      Resp = 0xff;
      TimeOut = 100;

      SelecionaMMC (TRUE);
      EnviaMMC (0x46); // CMD6
      EnviaMMC (0x03);
      EnviaMMC (0xb9);
      EnviaMMC (0x01);
      EnviaMMC (0x00);
      EnviaMMC (0x01); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contrário = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }
      SelecionaMMC (FALSE);

   // roda enquanto der timeout
   } while (! TimeOut);

   printf ("OK");
   
   return;
}   

//-------------------------------------------------------------------------
// Inicialização do MMC
//-------------------------------------------------------------------------
void InicializaMMC (void)
{

   printf ("\r\nInicializando MMC...");
   
   ExecutaCMD0 ();
   ExecutaCMD1 ();
   ExecutaCMD16 ();
   //ExecutaCMD10 ();
   //ExecutaCMD9 ();
   
   printf ("\r\nInicializando MMC...OK");

   return;
}

//-------------------------------------------------------------------------
// Le um setor da memória - FAT32
//-------------------------------------------------------------------------
void ReadSector(int32 sector, char *buffer)
{
      char errs,response;
      char cnt2,cnt3;

      #byte sectorL = sector
      #byte sectorH = sector+1
      #byte sectorHL = sector+2

      // if (input(CardInserted)) return;
       
   // Disable_interrupts(GLOBAL);
      Restart_wdt();
       
      MMCAddressL = 0;
      MMCAddressH = sectorL;
      MMCAddressHL = sectorH;
      MMCAddressHH = sectorHL;
      gFAT32Vars.MMCAddress <<= 1;

   SelecionaMMC (TRUE);
      EnviaMMC (0x51);
      EnviaMMC (MMCAddressHH);
      EnviaMMC (MMCAddressHL);
      EnviaMMC (MMCAddressH & 0xFE);

      EnviaMMC (0);
      EnviaMMC (0x01);
      errs = 8;
       
   do
   {
       response = RecebeMMC ();
       
     } while ((--errs) && (response == 0xFF));
       
       
      errs = 50;
   
      do
   {
       
         response = RecebeMMC ();
       
      if (response == 0xFE) break;
       
         delay_ms(1);
         
      } while (--errs);
       
      *0xFE9 = (int16) buffer;
   
      cnt3 = 2;
      cnt2 = 0;
   
   do
   {
         do
         {
            SSPBUF = 0xFF;
            while (!BF);
             
            *0xFEE = SSPBUF;
           
      } while (--cnt2);
      } while (--cnt3);
       
       
      response = RecebeMMC ();
      response = RecebeMMC ();
       
   SelecionaMMC (FALSE);
       
//      enable_interrupts(GLOBAL);
}


//-------------------------------------------------------------------------
// Escreve em um setor da memória - FAT32
//-------------------------------------------------------------------------
void WriteSector (int32 sector, char *buffer)
{
   char errs;
      char response;
      char cnt2;
      char cnt3;
      #byte sectorL = sector
      #byte sectorH = sector+1
      #byte sectorHL = sector+2

//      if (input (CardInserted)) return;
   
//      disable_interrupts(GLOBAL);
//      restart_wdt();
   
      MMCAddressL    = 0;
      MMCAddressH    = sectorL;
      MMCAddressHL = sectorH;
      MMCAddressHH = sectorHL;
      gFAT32Vars.MMCAddress <<= 1;
   
      response = 0;

   SelecionaMMC (TRUE);
   
      EnviaMMC (0x58);
       
    EnviaMMC (MMCAddressHH);
    EnviaMMC (MMCAddressHL);
    EnviaMMC (MMCAddressH & 0xFE);
 
      EnviaMMC (0);
      EnviaMMC (0x01);
      MMC8Clock ();
      errs = 8;
       
      do
   {
       response = RecebeMMC ();
       
      } while (--errs && response==0xFF);
       
      if (response)
   {
      SelecionaMMC (FALSE);
       
         MMC8Clock();
//         enable_interrupts(GLOBAL);
         
        return;
      }
       
      MMC8Clock ();
      EnviaMMC (0xFE);
      *0xFE9 = (int16)buffer;
       
      cnt3 = 2;
      cnt2 = 0;
       
   do
   {
       do
       {
            SSPBUF = *0xFEE;
            while (!BF);
            response = SSPBUF;
             
         } while (--cnt2);
         
      } while (--cnt3);
   
      EnviaMMC (0x00);
      EnviaMMC (0x01);
       
      response = RecebeMMC ();
      response ^= 0xE5;
       
      if (response)
   {
       goto endwr3;
      }
       
      do
   {
       response = RecebeMMC ();
       
      } while (response == 0);
       
      response = 0;
       
endwr3:
   SelecionaMMC (FALSE);
    MMC8Clock();
     
//      enable_interrupts (GLOBAL);
}



//-------------------------------------------------------------------------
// mostra um determinado setor - FAT32
//-------------------------------------------------------------------------
void MostraSetor (int32 setor, char *dados, long tamanho)
{
   long i;
   long j;
   long k;

   printf ("\r\n\r\nLendo setor: %lx\r\n\r\n", setor);
   ReadSector (setor, dados);

   j = 0;
   for (i = 0; i < tamanho; i++)
   {
      printf ("%02X ", dados[i]);
      if (j >= 15)
      {
         printf ("          ");

         for (k = (i - 15); k < i; k++)
         {
            if (! isalnum (dados[k])) printf (".");
            else printf ("%c", dados[k]);
         }

         printf ("\r\n");
         j = 0;
      }

      else
      {
         j++;
      }

      delay_ms (1);

   }
}

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// Funções da FAT32
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------


char IsSelfDir (char *be)
{
   if (be[0] == '.' && be[1] == '.') return 0xFF;
   else return 0;
}


int16 GetCurrentDOSDate ()
{
   int16 retval;

   retval = myrec.tm_year - 1980;
   retval <<= 9;
   retval |= ((int16)myrec.tm_mon << 5);
   retval |= (int16)myrec.tm_mday;

   return retval;
}

int16 GetCurrentDOSTime ()
{
   int16 retval;

   retval = myrec.tm_hour;
   retval <<= 11;
   retval |= ((int16)myrec.tm_min << 5);
   retval |= (int16)myrec.tm_sec >> 1;
   
   return retval;
}

void InicializaFAT32 (void)
{
    int32 actsector;
    char i;
   
    gFirstEmptyCluster       = 0;
    gFAT32Vars.gStartSector = 0;
       
    // limpa o CREN (comunicação contínua)
    printf ("\r\nInicializando FAT32...");
       
    ReadSector (gFAT32Vars.gStartSector, gFiles[MAXFILES-1].IOpuffer);
       
    if (gFiles[MAXFILES-1].IOpuffer[0] != 0xEB)
    {
        gStartSectorL    = gFiles[MAXFILES-1].IOpuffer[0x1C6];
        gStartSectorH    = gFiles[MAXFILES-1].IOpuffer[0x1C7];
        gStartSectorHL    = gFiles[MAXFILES-1].IOpuffer[0x1C8];
       
        ReadSector (gFAT32Vars.gStartSector, gFiles[MAXFILES-1].IOpuffer);
    }
       
    memcpy (&DiskInfo, gFiles[MAXFILES-1].IOpuffer, sizeof(DiskInfo));
   
    actsector = gFAT32Vars.gStartSector + DiskInfo.Reserved1;
   
    ReadSector (actsector, FATTable);
    gFAT32Vars.FATstartidx = 0;
   
    gFAT32Vars.gFirstDataSector = gFAT32Vars.gStartSector + DiskInfo.FATCopies * DiskInfo.hSectorsPerFat + DiskInfo.Reserved1 - 2;
   
    SecFAT1=DiskInfo.Reserved1;                                                                                 // Nº 1º Sector FAT1
    SecFAT2=DiskInfo.Reserved1+DiskInfo.holdSectorsPerFat;                                                      // Nº 1º Sector FAT2
    FirstRootDirSecNum=(unsigned int16)(DiskInfo.Reserved1+(DiskInfo.FATCopies*DiskInfo.holdSectorsPerFat));    // Nº 1º Sector de Directorio Raiz
    RootDirSecNum=((unsigned int16)(DiskInfo.hMaxRootEntries/DiskInfo.hBytesPerSector)*32);                     // Cant. de sectores utilizados por Directorio Raiz.
   
    BytesPerClus=((unsigned int32)DiskInfo.hBytesPerSector*DiskInfo.bSectorsPerCluster);                        // Nº de Bytes por Cluster.-
   
    for (i = 0; i < MAXFILES; i++)
        gFiles[i].Free = TRUE;
       
   printf ("OK");
   
   return;
}


int32 GetNextCluster (int32 curcluster)
{
      int32 actsector;
      int32 clpage;
      char clpos;

      clpage = curcluster >> 7;
      clpos = curcluster & 0x7F;
       
      if (clpage != gFAT32Vars.FATstartidx)
     {
        // read in the requested page
      actsector = gFAT32Vars.gStartSector+DiskInfo.Reserved1 + clpage;
         ReadSector (actsector, FATTable);
         
         gFAT32Vars.FATstartidx = clpage;
   }
   
   return (FATTable[clpos]);
}

void SetClusterEntry (int32 curcluster, int32 value)
{
      int32 actsector;
      int32 clpage;
      char clpos;

      clpage = curcluster >> 7;
      clpos = curcluster & 0x7F;
      actsector = gFAT32Vars.gStartSector + DiskInfo.Reserved1 + clpage;
       
      if (clpage != gFAT32Vars.FATstartidx)
   {
       ReadSector (actsector, FATTable);
         gFAT32Vars.FATstartidx = clpage;
      }
   
      FATTable[clpos] = value;
      WriteSector (actsector, FATTable);
      actsector += DiskInfo.hSectorsPerFat;
      WriteSector (actsector,FATTable);
}

void ClearClusterEntry (int32 curcluster)
{
   int32 actsector;
      int32 clpage;
      char clpos;

      clpage = curcluster >> 7;
      clpos = curcluster & 0x7F;
       
      if (clpage != gFAT32Vars.FATstartidx)
   {
       actsector = gFAT32Vars.gStartSector + DiskInfo.Reserved1 + gFAT32Vars.FATstartidx;
         WriteSector (actsector, FATTable);
         
         actsector += DiskInfo.hSectorsPerFat;
         WriteSector (actsector,FATTable);
         
         actsector = gFAT32Vars.gStartSector + DiskInfo.Reserved1 + clpage;
         ReadSector (actsector,FATTable);
     
         gFAT32Vars.FATstartidx = clpage;
      }
       
   FATTable[clpos] = 0;
}


int32 FindFirstFreeCluster ()
{
   int32 i;
   int32 st;
   int32 actsector;
   int32 retval;
   char j;

      st = gFirstEmptyCluster;
       
      for (i = st; i < DiskInfo.hSectorsPerFat; i++)
   {
       if (i != gFAT32Vars.FATstartidx)
       {
           actsector = gFAT32Vars.gStartSector + DiskInfo.Reserved1 + i;
           ReadSector (actsector, FATTable);
            gFAT32Vars.FATstartidx = gFirstEmptyCluster = i;
         }
         
         for (j=0;j<128;j++)
         {
            if (FATTable[j] == 0)
           {
               retval = i;
               retval <<= 7;
               retval |= j;
               return retval;
            }
         }
      }
       
      return 0x0FFFFFFF;
}

void ConvertFilename (DIR *beDir, char *name)
{
   char i;
   char j;
   char c;

      j = 0;

      name[0] = 0;

      for (i = 0; i < 8; i++)
   {
       c = beDir->sName[i];
       
         if (c == ' ') break;
         
         name[j++] = c;
      }
     
      for (i = 0; i < 3; i++)
   {
         c = beDir->spam[i];
         
         if ((c == ' ') || (c == 0)) break;
         
         if (!i) name[j++] = '.';
         
       name[j++] = c;
      }
       
      name[j++] = 0;
}

void GetDOSName (DIR *pDir, char *fname)
{
   char i;
   char j;
   char leng;
   char c;
   char toext;

      toext = FALSE;
      j = 0;
       
      leng = strlen(fname);
       
      for (i = 0; i < 8; i++)
       pDir->sName[i] = ' ';
       
      for (i = 0; i < 3; i++)
         pDir->spam[i] = ' ';
         
      for (i = 0; i < leng; i++)
      {
       c = fname[i];
         c = toupper(c);
         
         if (c == '.')
       {
            toext = TRUE;
            continue;
         }
         
         if (toext) pDir->spam[j++] = c;
         else pDir->sName[i] = c;
      }
}


void ReadRootDirectory (char fil)
{
   int32 actsector;

      if (fil > (MAXFILES-1)) return;
       
     actsector = gFAT32Vars.gStartSector + (DiskInfo.FATCopies * DiskInfo.hSectorsPerFat) + DiskInfo.Reserved1;

      ReadSector (actsector, gFiles[fil].IOpuffer);
       
   gFAT32Vars.gDirEntrySector = actsector;
      gFiles[fil].dirSector = actsector;
      gFiles[fil].dirIdx = 0;
      memcpy (&(gFiles[fil].DirEntry), gFiles[fil].IOpuffer,32);
      gFiles[fil].CurrentCluster = DiskInfo.hRootStartCluster;
}


char FindDirEntry (char *fname, char f)
{
    DIR *pDir;
    int16 i;
    char filename[16];
    int32 nextcluster;
    int32 actsector;
   
    if (f > (MAXFILES-1)) return FALSE;
   
    gFAT32Vars.gFirstEmptyDirEntry = 0xFFFF;
    gFAT32Vars.gFirstDirEntryCluster = 0x0FFFFFFF;
       
   do
   {
       pDir = (DIR*)(gFiles[f].IOpuffer);
       
         for (i = 0; i < 16; i++)
       {
            if (((pDir->sName[0] == 0xE5) || (pDir->sName[0] == 0)) && (gFAT32Vars.gFirstEmptyDirEntry == 0xFFFF))
           {
              // store first free
                 gFAT32Vars.gFirstEmptyDirEntry = i;
               gFAT32Vars.gFirstDirEntryCluster = gFiles[f].CurrentCluster;
            }

               if (pDir->sName[0] == 0) return FALSE;
                 
         ConvertFilename (pDir,filename);
             if (!strcmp (filename, fname))
           {
               memcpy(&(gFiles[f].DirEntry), pDir, 32);
               gFiles[f].dirIdx = i;
               gFAT32Vars.gDirEntryIdx = i;
               return TRUE;
            }
             
            pDir++;
         }
         
         nextcluster = GetNextCluster (gFiles[f].CurrentCluster);
         
         
            if ((nextcluster != 0x0FFFFFFF) && (nextcluster != 0))
       {
            actsector = nextcluster + gFAT32Vars.gFirstDataSector;
            ReadSector (actsector, gFiles[f].IOpuffer);
             
            gFAT32Vars.gDirEntrySector = actsector;
            gFiles[f].dirSector = actsector;
            gFiles[f].CurrentCluster = nextcluster;
         }
       
         
      } while ((nextcluster != 0x0FFFFFFF) && (nextcluster != 0));
       
      return FALSE;
}

// file I/O routines
char *TryFile(char *fname, char *f)
{
   char i;
      char leng;
      char *filename;

      (*f) = 0xFF;
   
      for (i = 0; i < MAXFILES; i++)
   {
         if (gFiles[i].Free)
        {
           (*f) = i;
            break;
         }
      }
       
      if ((*f) == 0xFF) return 0;
       
      ReadRootDirectory (*f);
       
      filename = fname;
      leng = strlen (fname);
       
      for (i = 0; i < leng; i++)
   {
       if (fname[i] == '/')
       {
           fname[i] = 0;
             
            if (! cwd (filename,(*f)))
           {
                 gFiles[(*f)].Free = TRUE;
               return 0;
            }
         
            filename = fname + i + 1;
             
        }
      }
   
      return filename;
}

char fcreate (char f, char *fname)
{
   DIR *pDir;
      int32 actsector;
      char actcl;
      int16 i;

      if (f > (MAXFILES-1)) return FALSE;
       
      if (gFAT32Vars.gFirstDirEntryCluster == 0x0FFFFFFF)
   {
       // extend the directory file !!!
         gFAT32Vars.gFirstDirEntryCluster = FindFirstFreeCluster ();
         gFAT32Vars.gFirstEmptyDirEntry = 0;
         SetClusterEntry(gFiles[f].CurrentCluster, gFAT32Vars.gFirstDirEntryCluster);
      SetClusterEntry(gFAT32Vars.gFirstDirEntryCluster, 0x0FFFFFFF);
         actsector = gFAT32Vars.gFirstDirEntryCluster + gFAT32Vars.gFirstDataSector;
         
         for (i = 0; i < 512; i++)
         {
            gFiles[f].IOpuffer[i] = 0;
        }
       
         WriteSector(actsector, gFiles[f].IOpuffer);
      }
       
      actsector = gFAT32Vars.gFirstDirEntryCluster + gFAT32Vars.gFirstDataSector;
      ReadSector (actsector, gFiles[f].IOpuffer);
   
   
      pDir = (DIR*)(&(gFiles[f].IOpuffer[32 * gFAT32Vars.gFirstEmptyDirEntry]));
      gFiles[f].dirSector = actsector;
      gFiles[f].dirIdx = gFAT32Vars.gFirstEmptyDirEntry;
       
      GetDOSName (pDir, fname);
       
      pDir->bAttr = 0;
      actcl = FindFirstFreeCluster ();
      pDir->hCluster = actcl & 0xFFFF;
      pDir->hClusterH = actcl >> 16;
       
      SetClusterEntry (actcl, 0x0FFFFFFF);
      pDir->wSize = 0;
      gFiles[f].position = 0;
      pDir->hDate = GetCurrentDOSDate ();
      pDir->hTime = GetCurrentDOSTime ();
       
      WriteSector (actsector, gFiles[f].IOpuffer);
      memcpy (&(gFiles[f].DirEntry), pDir,32);
       
   return TRUE;
}

int32 ComposeCluster (char f)
{
   int32 retval;

   retval = gFiles[f].DirEntry.hClusterH;
   retval <<= 16;
   retval |= gFiles[f].DirEntry.hCluster;

   return retval;
}

char fopen (char *fname, char mode)
{
   char found;
      char f;
      int32 actsector;
      int32 actcluster;
      int32 nextcluster;
      char *filename;

      //if (input(CardInserted)) return 0xFF;
   
             
      filename = TryFile (fname, &f);

      if (filename == 0) return 0xFF;

      found = FALSE;
      found = FindDirEntry (filename,f);

       
      if (!found)
   {
         if (mode == 'r')
         {
            gFiles[f].Free = TRUE;
            return 0xFF;
         }
       else
      {
           if (! fcreate(f, filename)) return 0xFF;
            found = TRUE;
         }
      }
   
   if (found)
   {
         gFiles[f].Free = FALSE;
         gFiles[f].mode = mode;
         
         if  (mode == 'a') // com problemas
       {
           gFiles[f].position = gFiles[f].DirEntry.wSize;
           
            actcluster = ComposeCluster(f);
             
            while ((actcluster != 0x0FFFFFFF) && (nextcluster != 0))
           {
               nextcluster = GetNextCluster(actcluster);
                   
                  if ((nextcluster == 0x0FFFFFFF) || (nextcluster == 0)) break;
                   
                  actcluster = nextcluster;
            }
           
            actsector = actcluster + gFAT32Vars.gFirstDataSector;
            ReadSector (actsector, gFiles[f].IOpuffer);
             
            gFiles[f].CurrentCluster = actcluster;
            gFiles[f].posinsector = gFiles[f].position & 0x01FF;
             
            if ((gFiles[f].posinsector == 0) && (gFiles[f].position != 0))
            {
               gFiles[f].posinsector = 512;
         }   
         }
       
      else
      {
           gFiles[f].position = 0;
           
            actsector = ComposeCluster (f);
            actsector += gFAT32Vars.gFirstDataSector;
         ReadSector(actsector,gFiles[f].IOpuffer);
         
            gFiles[f].CurrentCluster = ComposeCluster (f);
            gFiles[f].posinsector = 0;
         }
      }
   
      return f;
}

void fclose (char f)
{
      if (f > (MAXFILES-1)) return;
      if ((gFiles[f].mode == 'a') || (gFiles[f].mode == 'w')) fflush(f);
       
      gFiles[f].Free = TRUE;
}

void fflush (char f)
{
   int32 actsector;
   DIR *pDir;

      if (f > (MAXFILES-1)) return;
   
      actsector = gFiles[f].CurrentCluster + gFAT32Vars.gFirstDataSector;
      WriteSector (actsector, gFiles[f].IOpuffer);
      ReadSector(gFiles[f].dirSector, gFiles[f].IOpuffer);
   
      pDir = (DIR*)(&(gFiles[f].IOpuffer[32 * gFiles[f].dirIdx]));
   
      if (gFiles[f].DirEntry.bAttr & 0x10) pDir->wSize = 0; // if it is a directory
      else pDir->wSize = gFiles[f].position;
   
      pDir->hDate = GetCurrentDOSDate ();
      pDir->hTime = GetCurrentDOSTime ();
      WriteSector(gFiles[f].dirSector,gFiles[f].IOpuffer);
      ReadSector(actsector, gFiles[f].IOpuffer);
}

char cwd (char *fname, char f)
{
   int32 actsector;

     if (f > (MAXFILES-1))
      {
      return FALSE; // just in case of overaddressing
      }
   
   if (IsSelfDir(fname))
      {
         return TRUE; // already in Root dir
      }   
       
      if (!FindDirEntry(fname,f))
      {
         return FALSE; // not found
      }

 
      actsector = ComposeCluster (f);
      actsector += gFAT32Vars.gFirstDataSector; // read current dir
      ReadSector (actsector, gFiles[f].IOpuffer);
       
      gFAT32Vars.gDirEntrySector = actsector;
      gFiles[f].dirSector = actsector;
      gFiles[f].CurrentCluster = ComposeCluster (f);
             
      return TRUE;
}

void fputch (char be, char f)
{
      int32 nextcluster;
      int32 actsector;

      if (f > (MAXFILES-1)) return;
       
      if (gFiles[f].posinsector == 512)
   {
       actsector = gFiles[f].CurrentCluster + gFAT32Vars.gFirstDataSector;
         WriteSector (actsector,gFiles[f].IOpuffer);
         
         nextcluster = FindFirstFreeCluster ();
     
       if ((nextcluster != 0x0FFFFFFF) && (nextcluster != 0))
      {
           SetClusterEntry (gFiles[f].CurrentCluster, nextcluster);
            SetClusterEntry (nextcluster, 0x0FFFFFFF);
            actsector = nextcluster + gFAT32Vars.gFirstDataSector;
            //ReadSector (actsector,gFiles[f].IOpuffer);  //-- nao tem a necessidade de ler o setor toda vez que for gravar um bloco
            gFiles[f].CurrentCluster = nextcluster;
            gFiles[f].posinsector = 0;
         }
      }
       
      gFiles[f].IOpuffer[gFiles[f].posinsector] = be;
      gFiles[f].posinsector++;
      gFiles[f].position++;

   return;       
}

void fputstring (char *be, char f)
{
   int16 leng;
   int16 i;

      if (f > (MAXFILES-1)) return;
   
      leng = strlen (be);
   
      for (i = 0; i < leng; i++)
       fputch (be[i], f);
   
}

int16 fread (char *buffer, int16 leng, char f)
{
   int16 i;
   int16 retv;
   char c;
   char v;

      if (f > (MAXFILES-1)) return 0;
       
      retv = 0;
       
      for (i = 0; i < leng; i++)
   {
       v = fgetch (&c, f);
       
         if (v)
        {
           buffer[i] = c;
            retv++;
         }
         
         else break;
      }
   
      return retv;
}

void fwrite (char *buffer, int16 leng, char f)
{
   int16 i;

      if (f > (MAXFILES-1)) return;
       
      for (i = 0; i < leng; i++)
       fputch (buffer[i],f);

}


char fgetch (char *ki, char f)
{
      int32 nextcluster;
      int32 actsector;

      if (f > (MAXFILES-1)) return FALSE;
       
      if (gFiles[f].position >= gFiles[f].DirEntry.wSize) return FALSE;
       
      *ki = gFiles[f].IOpuffer[gFiles[f].posinsector];
       
      gFiles[f].posinsector++;
      gFiles[f].position++;
   
   if (gFiles[f].posinsector == 512)
   {
       nextcluster = GetNextCluster (gFiles[f].CurrentCluster);
       
         if ((nextcluster != 0x0FFFFFFF) && (nextcluster != 0))
         {
            actsector = nextcluster + gFAT32Vars.gFirstDataSector;
            ReadSector (actsector,gFiles[f].IOpuffer);
             
            gFiles[f].CurrentCluster = nextcluster;
            gFiles[f].posinsector = 0;
         }
      }
   
      return TRUE;
}

char remove (char *fname)
{
      char i;
      char found;
      char f;
      DIR *pDir;
      int32 nextcluster;
      int32 currentcluster;
      char *filename;

      filename = TryFile (fname, &f);
       
      if (filename == 0) return FALSE;
       
      found = FindDirEntry (filename,f);
       
   if (!found)
   {
       gFiles[f].Free = TRUE;
       
       printf ("Arquivo não encontrado...\r\n");
         return FALSE;
      }
       
   
   
      pDir = (DIR*)(&(gFiles[f].IOpuffer[32 * gFAT32Vars.gDirEntryIdx]));
      pDir->sName[0] = 0xE5;
       
      for (i = 1; i < 8; i++)
      pDir->sName[i] = ' ';
       
      for (i = 0; i < 3; i++)
         pDir->spam[i] = ' ';
         
      WriteSector (gFAT32Vars.gDirEntrySector, gFiles[f].IOpuffer);
      currentcluster = ComposeCluster (f);
       
      while ((currentcluster != 0x0FFFFFFF) && (nextcluster != 0))
   {
       nextcluster = GetNextCluster (currentcluster);
         ClearClusterEntry (currentcluster);
          currentcluster = nextcluster;
      }
       
      ClearClusterEntry (currentcluster);
      SetClusterEntry (currentcluster, 0);
      currentcluster = gFAT32Vars.gStartSector + DiskInfo.Reserved1 + gFAT32Vars.FATstartidx;
      WriteSector (currentcluster, FATTable);
      currentcluster += DiskInfo.hSectorsPerFat;
      WriteSector (currentcluster, FATTable);
      gFiles[f].Free = TRUE;
   
      return TRUE;
}

char getfsize (char *fname, int32 *fsiz)
{
      char found;
      char f;
      DIR *pDir;
      char *filename;

      filename = TryFile (fname, &f);
       
      if (filename == 0) return FALSE;
       
      found = FindDirEntry (filename, f);
   
   if (!found)
   {
       gFiles[f].Free = TRUE;
       
         return FALSE;
      }
   
      pDir = (DIR*)(&(gFiles[f].IOpuffer[32 * gFAT32Vars.gDirEntryIdx]));
   
      gFiles[f].Free = TRUE;
      *fsiz = pDir->wSize;
   
      return TRUE;
}




Alentado por este éxito y leyendo un poco más fino en el foro, encuentro la versión en la que la librería tuya, Suky, posee la inicialización tanto para MMC/SD como las SDHC (que son las que se consiguen hoy). Entonces decidí hacer una pequeña prueba y logré iniciar todas las memorias. O por lo menos eso parece que dice el debug, ya que al leer el sector 0x00000000, nuevamente tengo todo cero. Lo bueno es que ahora es con todas las memorias, tanto MMC/SD como SDHC   :mrgreen:

Comparando esta librería con la del brasilero, estoy tratando de lograr una final que ande perfecto con cualquier memoria. Así luego poder seguir con la librería FAT que ya nos compartió en oportunidades anteriores!

Espe
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 09 de Octubre de 2013, 15:56:10
Suky, ahi realicé lo que me decías de escribir y leer. El código es:

for(ptr_buff=0; ptr_buff<512; ptr_buff+=2)
{
    BufferFAT[ptr_buff] = 0xFF;
    BufferFAT[ptr_buff+1] = 0x00;
}
                       
SDCard_write_block(0x200,&BufferFAT[0]);
                       
for(ptr_buff=0; ptr_buff<512; ptr_buff++)
    BufferFAT[ptr_buff] = 0x55;
                           
SDCard_read_block(0x200,&BufferFAT[0]);

Al medio, entre escritura y lectura, cargo el BufferFAT con cualquier cosa, para saber si lo que leo es realmente lo que escribí. Lee y escribe, pero solo si lo hago desde el PIC. Es decir, cuando agarro el WinHex, no encuentro por ningún lado lo que escribí  :shock:. Como puede ser??????

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: RICHI777 en 09 de Octubre de 2013, 16:36:34
Hola,

Citar
Suky, no se cómo me serviría esa prueba ya que, para iniciar el FAT, es necesario leer el primer sector de la SD. Si yo trato de escribir y luego leer lo que escribí, no gano nada. Seguiría sin poder leer la 0x00000000.

Lo que quiso comentar Suky, es que antes de probar el sistema de archivo es necesario tener la certeza de que la comunicación con la SD/MMC funcione perfecto. Una vez que funcione eso, lo del sistema de archivos es casi trivial. Como a la tarjeta la accedes por LBA escribiendo ejemplo 0x55 y leyendo lo mismo en sector, muchisimas veces, te aseguras de que el bajo nivel funcione.

Yo al igual que Suky, publique un código similar, digamos que el trabajo de Suky era mucho mas completo que el mio. Algunas personas usaron mi código, hace un par de años me contacte personalmente con una persona que me comentaba que para ciertos modelos la SD nunca se inicializaba, y me mando varias muestras. No hubo caso no había manera de hacerlas funcionar, si tocaba algo en el código, otras memorias que antes funcionaban dejaban de hacerlo. Investigando un poco descubrí que muchas de las memorias que se consiguen aquí ( Argentina ) son memorias truchas chinas que no cumplen con los estándares, así que a esta persona le di un besito en la frente y no hice nada.

Problema complicado ...

Saludos !


Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 10 de Octubre de 2013, 12:36:08
Buenas a todos!!!!

Hoy he logrado un enorme avance. Tal cual y como les había dicho antes, ya había comenzado a poder terminar de iniciar la memorias, basado en la versión aquí publicada de Suky, luego de varios retoques y pruebas.

A pesar del mucho renegar, probar, medir con el osciloscopio y leer, leer y más leer, logré retocar la librería de Suky para que funcione correctamente con el compilador CCS, versión 4.114. No solo iniciando la memoria, si no que también, leyendo el boot sector donde se encuentra la FAT. A su vez, logré terminar de integrar en una sola librería el correcto funcionamiento para MMC, SD y SDHC...  :-/ :-/ :-/

Todo este trabajo fue realizando una integración entre la librería de Suky y la librería del brasilero ANDRE L. V. SILVA, todo esto junto a toda la experiencia que pude realizar y a los conocimientos leyendo todo lo que se conseguía respecto a SD y FAT. SAí mismo, todavía queda empezar con las pruebas de creación de carpetas y archivos, junto a las demás funciones del FAT. Pero lo importante y más complejo, leer el boot sector, leer y escribir cualquier sector, y poder manejar tanto MMS/SD y SDHC.  8)

En las librería que subo, están las que funcionan correctamente, más la que no han sido tocadas. Las que he estado trabajando y modificando, he tratado de de dejar nota de las modificaciones y, dentro de lo que se podía, el por que o para qué. Así mismo, las librerías modificadas, tiene la cabecera modificada, con el agregado de los detalles de lo realizado por mi.

Espero que puedan usarlas y probarlas con otros compiladores y micros, para ver si completamente quedó una librería global y completa, dentro de lo posible.

Saludos!!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 22 de Octubre de 2013, 17:06:13
Buenas a Todos!!!!!  :-/ :-/

Bueno, ya estando todo OK y funcionando, subo el aporte final.

Funciona para SD/MMC y para SDHC. He probado diversas marcas y todas andan bien. Las marcas probadas son Kignston, Sandisk y Nokia, hasta 4GB. Funciona para crear y buscar directorios, para crear y buscar archivos. He probado diferentes tamaños y extensiones y va todo OK.   :-/ :-/

Espero que no tengan ninguna complicación, pero en la vida real funciona perfectamente, además del simulador.  ((:-)) ((:-)) Eso si, no dejen de agradecer y de usar a cabecera, que salen los aportes y originales de los participantes.

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 22 de Octubre de 2013, 20:29:23
Felicitaciones por el trabajo!  ((:-))
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gajobar en 22 de Octubre de 2013, 21:49:00
Muchas gracias Suky, pero no lo habría podido lograr sin toda la base que armó Ud con toda la FAT y funciones para el manejo de la SD.

También debo agradecer al Ing ANDRE L. V. SILVA, por sus bases, ya que de allí pude realizar los primeros pasos de inicialización.

Saludos!!!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Hugo Torez en 04 de Noviembre de 2013, 16:43:06
Citar
Bueno, ya estando todo OK y funcionando, subo el aporte final.

Te agradezco por compartirlo...

Tienes el esquematico para simularlo en proteus? o algun diagrama pa la configuracion de pines? me gustaria probarlo con pic18f4550 que es lo que tengo a la mano..

un saludo.


Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: gabrilaser en 07 de Noviembre de 2013, 15:11:11
GeSHI, estuve trabajando migrando un programa que habia hecho para un micro LPC1769, a PIC18f4620. El tema es que despues de migrarlo no puedo hacer que inicialice bien ningun tipo de memorias. No se por que cuando envio el CMD55 y luego el ACMD41, no deja nunca de estar en IDLE, es decir que me responde siempre 1, y no llega a responderme 0.
Al ver tu comentario pense en ver las librerias que decis, pero no veo que las hayas subido a algun lado.
Si podes ayudarme te lo agradeceria.
Mucas gracias!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: ppyote en 31 de Marzo de 2014, 15:54:29
He leído tanto de las SD últimamente, que ya no se sí he probado está librería :):)
La búsqueda imagino que será por nombres cortos igual que la de Suky, verdad?
Quiero hacer una librería para buscar cualquier archvo de audio wav alojado dentro de la carpeta raíz pero me surgen algunas dudas
sí yo grabo con el pc un archivo wav en la sd, después con el winhex lo localizo buscando en asci "RIFF", en las características de los archivos wav siempre está e indica que son datos de un archivo de audio.
Yo apunto la dirección del primer bloque y la agrego al código del pic. El principal problema que tengo, es que en el archivo wav localizado usando este método, no puedo ver el nombre de este... Sólo datos como el número de canales, sí es mono o estéreo etc...
donde guarda la sd la información del nombre del archivo y la dirección de datos?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: ppyote en 01 de Abril de 2014, 13:29:41
Me autocorrijo, en el archivo wav está lo que busco

tenía una pregunta para Suky, sí voy cargando todos los bloques de 512bytes en la ram, uno detrás de otro y llego a el último bloque de la tarjeta, sí intento cargar el siguiente, cosa que no es posible por que ya no hay más bloques,  la función SDCard_read_block me devolverá un 0 como que ha habido un error?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 01 de Abril de 2014, 21:10:51
Me autocorrijo, en el archivo wav está lo que busco

tenía una pregunta para Suky, sí voy cargando todos los bloques de 512bytes en la ram, uno detrás de otro y llego a el último bloque de la tarjeta, sí intento cargar el siguiente, cosa que no es posible por que ya no hay más bloques,  la función SDCard_read_block me devolverá un 0 como que ha habido un error?

Sinceramente no lo probé. Pero la memoria no deberia retornar el token creo yo  :roll:
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: ppyote en 02 de Abril de 2014, 10:45:57
Hoy lo comprobaré.
Gran trabajo el tuyo con la librería Suky, muchas gracias  ((:-)) ((:-)) ((:-))
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: ppyote en 02 de Abril de 2014, 22:17:12
Suky... el valor retornado es 0 cuando se intenta leer un bloque mayor al posible... lo acabo de probar...
un saludo
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BINARIO en 10 de Agosto de 2014, 20:17:36
PERDON, lei todo pero estoy re perdido con esto, no me doy idea como arrancar, entiendo que el hardware que implemento es el que sale aca y usualmente en las mismas hojas de datos. Pero no entiendo como implementar el codigo bien.

Lo que quisiera saber es si debo ocupar cualquier pin, o tengo que respetar los pines que me salen en el protocolo SPI de la hoja de datos de mi microcontrolador.
Si alguien tiene un ejemplo asencillo seria genial.


 :-/ :-/ :-/ 
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Chenao en 10 de Agosto de 2014, 21:22:16

Hola compañero Binario.

Un ejemplo sencillo para comenzar con memoria SD seria implementar las funciones de inicio, escritura y lectura de un bloque de memoria, esta funciones creo que esta disponibles en el presente hilo. Ahora si lo que deseas son resultados creo que la librería del compañero Suky es lo que necesitas, no estoy seguro pero creo que en el sitio web de compañero se encuentra la documentación de tal librería y algunos ejemplos prácticos.

Citar
Lo que quisiera saber es si debo ocupar cualquier pin, o tengo que respetar los pines que me salen en el protocolo SPI de la hoja de datos de mi microcontrolador.
Si alguien tiene un ejemplo asencillo seria genial.

Naturalmente si vas a utilizar el modulo SPI del micro debes respetar la función del respectivo PIN. Años atrás trabaje unos meses con esta memoria pero la necesitaba para algo muy especifico si encuentro algún ejemplo no dudare en subirlo.

   

 
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: BEXTIXTOX en 01 de Septiembre de 2014, 02:39:04
SR.. SUKY fenomenal trabajo exelente...
he estado leyendo todo el  proyecto de como inicializar la memoria y entrar a FAT he tomado algunos ejemplitos del tema y me funcionan incluso personalize el contenido y titulo  de los TXT que se generan con el pic dentro de la SD
me surgio la idea de guardar algunos BMP en la memoria sd y  despues leerlos para graficarlos en una  nokia3310  pero no Veo algun ejemplo de alguna lectura de archivos, o de txt menos de .bmp
he intentado con FAT_GetFile pero no me resulto
tendras algun ejemplo de lectura de archivos  a la sd
utilizo ccs 5.007 y 18f4550
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: inventor1967 en 01 de Octubre de 2014, 15:41:23
Cordial Saludo a todos y felicitaciones por su trabajo.
Estoy tratando de hacerlo con el 18f4550 y en assembler, el asunto es que según entiendo hago lo siguiente:
Envío los 80 pulso de reloj
Selecciono la memoria CS=0
Envío comando 0
Envío comando 8
Envío comando 1
 hasta aquí todo parece ok pero cuando envío comando 17 para leer no se logra.
Pueden por favor corregirme?
O mejor ilustrarme sobre los pasos o comandos que debo usar, primero sobre la inicializacion y lecturas y escreituras simples de las tarjetas micro SD HC, por ahora ya luego veré lo de la fat.
de antemano un agradecimiento inmenso.


Título: UNA AYUDA CON HI_TECH Por favor
Publicado por: motorista en 28 de Octubre de 2014, 12:30:18
LLevo ya mas de una semana intentando "prepararme" para leer y escribir en las SD.
Yo hago todo en Hi-tech y en este caso concreto estoy usando un pic 18f252.
Despues de mucho buscar lñibrerias para Hi-tech, decidi coger estas de Suky y ir eliminando /cambiando cosas para que el MPLAB ya no me diera error.
Por fin ayer consegui que ya compilara (de si funciona de momento ni hablamos....). Los cambios realizados, a grandes rasgos son:
- Ir dejando lo que era para el pic18 y resto eliminar.
- Con el manejo de las union/estrcut, hitec trabaja diferente y el generictypedef que trae Hitech lo aclara. Modifique en todos los sitios que accedia a los bits
- Esta parte no la coge el compilador y simplemente BORRE los pragma...¿?
  //  #pragma udata BufferCARD
    UINT8 BufferFAT[512];
//    #pragma udata

- Compilando solo el main que trae de ejemplo y NADA mas lo complila sin problema.

Mi problema es que al juntar estas librerias con mi programa ya avanzado, me da error al compilar de que no tiene sitio para los 512bytes de la variable TEXTO (del main) o si la dejo pequeña me dice que no encuentra 0x200 posiciones o algo asi.....

Dudas: como almaceno semejante variable?
Podre realizar esto con mi pc18f252? Ya tengo todo muy avanzado a falta solo de almacenar datos. Se trata de un datalogger con 3 sondas 18b20 y 1 dht21, reloj etc
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: inventor1967 en 29 de Octubre de 2014, 01:11:47
Bueno yo poco se de C, lo estoy haciendo en assembler y ya casi... Bueno le pregunto, En que parte trata de almacenar la variable?
si es en la RAM le sugiero revisar a donde la direcciona la librería ya que el 18F4550 se dispone de  7 bancos de 256 bytes, en tanto el que Ud. menciona solo tiene 5, y puede por tanto estar enviando a alguno que no este implementado para ese pic
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: motorista en 29 de Octubre de 2014, 06:39:55
Bueno yo poco se de C, lo estoy haciendo en assembler y ya casi... Bueno le pregunto, En que parte trata de almacenar la variable?
si es en la RAM le sugiero revisar a donde la direcciona la librería ya que el 18F4550 se dispone de  7 bancos de 256 bytes, en tanto el que Ud. menciona solo tiene 5, y puede por tanto estar enviando a alguno que no este implementado para ese pic

Mis conocimientos no llegan has ta ese punto.....
No trato de almacenarla en ningun sitio concreto, donde se almacenen de normal....
En cuanto a los bancos de memoria etc. no es algo que domine, salvo por havber oido que existen... con este lenguaje de programacion nunca me he preocupado de estos temas.

En mi pregunta ya interpreto de que los tiros van por ahi, pero yo no tengo conocimientos para saber lo que hacer.... por eso ponia lo de los #pragma etc.
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: motorista en 29 de Octubre de 2014, 12:01:38
Bueno, aunque sigo sin entender como puedo hacer en Hi-tech,
para almacenar variables en zona de programa
o estender la ram a la zona de EEPROM
et etc (si es que lo anterior se puede)

YA HE RESUELTO el problema. Al juntar la parte de la SD con el resto de programa que tenia ya realizado, me salia el error y no podia ver mas. "de repente" me he acordado que en este programa tambien he esprimentado por primera vez con la libreria Tones.c y tenia varias canciones .......con lo cual he borrado algunas y ......sin problema espacio disponible en RAM.


 :-/ :-/ :-/ :-/ :-/
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: AKENAFAB en 09 de Noviembre de 2014, 02:01:21
Hola amigos!

Unas preguntas respecto al hardware PIC-SDcard.

¿ Porque en la mayoría de los diagramas mostrados se usan resistencias de pull-up sí el SPI es salida tottem pole ?

Entiendo que la memoria pondrá en alta impedancia el pin MISO cuando se deshabilite , ahí se podria ocupar pullup para no dejar flotando esa linea, pero en los otros pines ?

Segun entiendo en modo SDbus se usan , pero el control se pasa a modo SPI.

LA microSD que vamos a usar no se va a quitar hasta que se carguen nuevos datos,y para eso hay que apagar el equipo.

Estoy trabajando con pic a 3.3v y microSD.


P.D. En un proyecto anterior use un attiny85 que controlaba la sdcard directo.


Saludos!!
Título: Otro empujoncito, por favor...
Publicado por: motorista en 13 de Noviembre de 2014, 04:38:12
Buenos dias,
Tras dos semanas desde que consegui que me compilara la libreria de suky en Hitech, he realizado algun avance, pero aun no puedo escribir en la SD por FAT.
He conseguido que lea y escriba bloques, si la direccion que le pongo es "alta".
He conseguido que me Inicie la FAT, sin errores, pero los datos leidos en BufferFAT, no son los correctos. Tras leerme este post entero, me descargue ayer una libreria adaptada de la de suky que pone de Grabriel j. barchuck, he ido viendola y copiando los trozos que veo segun avanzo (por no empezar de cero).
Segun la explicacion cuando el BufferFAT[0] !=0xEB, entonces se leee una direccion posterior que nos indica la diferencia entre el sector fisico y logico.
En mi caso este valor es 129 (81h) o 135(87h) en dos tarjetas que tengo.
La cuestion es que intentando leer el sector 0 en esa direccion me da error (return(0)).

Continuando veo que se ha modificado tambien la rutina de read_block y el codigo añadido es:
   // if(SDCARD_Modo == SDCARD_MODO_HC)
   //     Address = Address / BLOCK_SIZE;       
   /********************************************/
   
   /* Agregado por el Ing. Gabriel J. Baruchuk, en función del brasilero */
   UINT32_VAL   MMCSDAddress;
   
   if(SDCARD_Modo == SDCARD_MODO_NORMAL)
   {
     #byte sectorL = Address
     #byte sectorH = Address+1
     #byte sectorHL = Address+2
   
     MMCSDAddress.LB = 0;
     MMCSDAddress.HB = sectorL;
     MMCSDAddress.UB = sectorH;
     MMCSDAddress.MB = sectorHL;
   
     MMCSDAddress.Val <<= 1;
   
     MMCSDAddress.HB = MMCSDAddress.HB & 0xFE;
   }
   else
      MMCSDAddress = Address;
   /********************************************/

Esto me da error en la compilacion pues no reconoce el #byte.
Una ayudita de que hace lo anterior, para adaptarlo al Hi-tech?
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: Suky en 13 de Noviembre de 2014, 22:28:25
Hola AKENAFAB! Sinceramente no recuerdo, seguramente lo tome de algún esquemático de referencia.


Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: AKENAFAB en 13 de Noviembre de 2014, 23:50:09
Gracias Suky!

Parece que se ocupa mas cuando hay varios dispositivos en el bus y si la tarjeta se extrae e inserta varias veces.
Tambien entendi en una nota de aplicacion que la tarjeta podria habilitar sus propias pull ups dependiendo el modo, creo que en SD mas no en spi.

Solo deje pull up en CS y en MISO.

Saludos!
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: motorista en 17 de Noviembre de 2014, 04:55:48
 :-/ :-/ :-/ :-/ :-/
Solucionado y FUNCIONANDO TODO.
Con la libreria de Grabriel j. barchuck ya me ha funcionado todo.
Por cierto Todo esto:
     #byte sectorL = Address
     #byte sectorH = Address+1
     #byte sectorHL = Address+2
   
     MMCSDAddress.LB = 0;
     MMCSDAddress.HB = sectorL;
     MMCSDAddress.UB = sectorH;
     MMCSDAddress.MB = sectorHL;
   
     MMCSDAddress.Val <<= 1;
   
     MMCSDAddress.HB = MMCSDAddress.HB & 0xFE;

Es igual a

MMCSDAddress.HB =Address*512
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: nano18F en 17 de Marzo de 2015, 16:56:05
He probado esta libreria con las ultimas modificaciones de Grabriel j. barchuck, pero me he encontrado con una limitante muy importante, no permite crear mas de 512 archivos en un directorio. Quizas no muchos se van a topar con esta limitante pero yo necesitaba crear mas de 512 archivos dentro de una misma carpeta y no se puede. Caso similar en el directorio raiz no se pueden crear mas de 256 archivos.

Lo dejo de conocimientos publico.

Saludos
Título: Re: Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: jvb57 en 31 de Marzo de 2015, 09:10:22
Hola Muchachos...
Soy nuevo en TodoPic, tenganme paciencia !!
Resulta que hace como un año hice un desarrollo que incluia el manejo de una memoria microSD a la que pude acceder, escribir, todo OK.
La misma esta controlada con un SPI simulado desde un PIC18, labure bastante para ajustar tiempos y funciona bastante bien !!

Ahora me doy con que una de las placas que fabricamos no le funciona la memoria, mido todos los pines del SPI se ven todos normales (sospechando que sea problema de hard).
Sigo analizando y me don con que la memoria me responde bien al CMD0 es decir que reconoce el SPI y resetea OK.
Pero cunado le mando el comando de inicializacion me respodne 0xC1 y si sigo insistiendo va variando la respuesta como si estuviese en flush o algo asi...

Midiendo veo que al segundo comando, en el 2do o 3er clock que le mando (antes de reconocer el comando) me responde algo en el pin DO... cosa mas que ilógica...
ME lei cuanto doc encontre al respecto uy no logro entender que sucede.
Parece que la memoria hubiese entrado en algun estado de bloqueo o algo asi...

A alguno le paso algo parecido que me pueda ayudar ??
Espero comentarios, gracias !!!
Título: Re:Comenzando con memorias SD/MMC. Librería a nivel hardware.
Publicado por: micronet3 en 04 de Enero de 2017, 17:31:37
saludos.
una consulta, estoy utilizando la libreria de suky  y modificada por Ing. Gabriel J. Baruchuk en el compilador CCS, mi intencion es simularlo en proteus, descargue estos archivos y lo compile y sale todo normal, pero cuando habilito  #define SDCARD_DEBUG  , ya no compila y me sale lo siguiente que no reconoce a la variable MMCSDAddress, no se a que se debera este problema, a ver si alguien me hecha una manito, he intentado arreglarlo pero hasta ahora no doy con el problema
 - Tienes que ingresar para ver archivos adjuntos -