TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: therionx en 16 de Noviembre de 2009, 23:26:59

Título: microSD por puerto SPI del micro 18f4550
Publicado por: therionx en 16 de Noviembre de 2009, 23:26:59
buenas a todos hace mucho q no psoteaba por cuestiones de salud
resulta que me pusieron un proyecto usando un 18f4550
un sistema de almaceamiento en memoria microSD por puerto SPI del micro, debe almacenar datos telefónicos nombre apellido y telefono de por lo menos 20 usuarios, salida por LCD Gráfica.

lo dealmacenar y msotrar en lcd grafica es bastante sencillo sin embargo la parte de SPI jamas la he manejado no se si alguno podria colaborarme con un ejemplo de como manejar dicho puerto usando la micro SD
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 17 de Noviembre de 2009, 00:19:00
Te adjunto una librería para el manejo de memorias SD a nivel hard, más un ejemplo de como se usaría, prueba si funciona con la microSD  ;-)



Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 17 de Noviembre de 2009, 05:15:22
Suky, para qué lenguaje son las librerías??

Muchas gracias por el aporte XD
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 17 de Noviembre de 2009, 05:17:08
Creo que me auto-respondo, CCS no??

Genial XD
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 17 de Noviembre de 2009, 09:31:33
Si, CCS  :mrgreen: Es solo la que controla a nivel hard, escribe y lee bytes.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 17 de Noviembre de 2009, 10:21:28
Lo que me pasa es que no consigo leer una!!!

He probado varios programas y funcionan, pero cuando hago uno no :5]

Creo que el erro lo tengo el los fuses pero ya no sé...
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 17 de Noviembre de 2009, 13:02:52
mmm... tienen sus mañas estas memorias, tendrías que postear la que te funciona y la tu haces y no, para ver si entre más cabezas detectamos donde puede estar el problema  :?

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 17 de Noviembre de 2009, 13:26:10
Lo curioso es que la que he probado es el ejemplo de microchip y la que he hecho es a partir del mismo ejemplo dejando sólo la inicialización.... y no inicia la tarjeta  :(


Por lo que creo que tienen que ser los fuses...
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 17 de Noviembre de 2009, 14:04:38
Aquí está el programa http://www.4shared.com/file/154037886/8aefa2c8/sd_card.html

Está hecho en C18 y me está desesperando......
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 17 de Noviembre de 2009, 14:51:41
En los fuses no veo ningún problema  :? Eso si, mirando el código, yo cada vez que envio un comando tuve que agregar un par de envios de sincronización, sino era imposble establecer comunicación.

Osea:
Código: C
  1. SDC_CS = 0;                           //Card Select
  2.    
  3.     // Copy over data
  4.     CmdPacket.cmd        = sdmmc_cmdtable[cmd].CmdCode;
  5.     CmdPacket.address    = address;
  6.     CmdPacket.crc        = sdmmc_cmdtable[cmd].CRC;       // Calc CRC here
  7.    
  8.    
  9.     WriteSPI(CmdPacket.cmd);                //Send Command
  10.         WriteSPI(CmdPacket.addr3);              //Most Significant Byte
  11.     WriteSPI(CmdPacket.addr2);
  12.         WriteSPI(CmdPacket.addr1);
  13.     WriteSPI(CmdPacket.addr0);              //Least Significant Byte
  14.     WriteSPI(CmdPacket.crc);                //Send CRC

Lo haría de la siguiente manera:

Código: C
  1. SDC_CS = 0;                           //Card Select
  2.    
  3.     // Copy over data
  4.     CmdPacket.cmd        = sdmmc_cmdtable[cmd].CmdCode;
  5.     CmdPacket.address    = address;
  6.     CmdPacket.crc        = sdmmc_cmdtable[cmd].CRC;       // Calc CRC here
  7.    
  8.     for(timeout=0; timeout<10; timeout++)
  9.          mSend8ClkCycles();
  10.    
  11.     WriteSPI(CmdPacket.cmd);                //Send Command
  12.         WriteSPI(CmdPacket.addr3);              //Most Significant Byte
  13.     WriteSPI(CmdPacket.addr2);
  14.         WriteSPI(CmdPacket.addr1);
  15.     WriteSPI(CmdPacket.addr0);              //Least Significant Byte
  16.     WriteSPI(CmdPacket.crc);                //Send CRC

Igual, el ejemplo completo de Microchip con tu memoria te funciono?

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 18 de Noviembre de 2009, 05:01:19
Ayer no pude ponerlo porque me tenía que ir... pero lo conseguí!!! cambiando los fuses se logra!!!

De todas maneras, ahora pruebo lo que me has dicho y te contesto con los dos códigos para que los veas  :mrgreen:

Muchas gracias maestro!!!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 18 de Noviembre de 2009, 06:56:18
grrrrrrrraaaaaaa!!!!

NO FUNCIONA!!!!

Parecía que funcionaba porque me equivoqué en los mensajes de debug  :(

lo que cambié fue:
#pragma config PLLDIV=12
#pragma config CPUDIV=OSC4_PLL6

y el usart:
   OpenUSART( USART_TX_INT_OFF &
   USART_RX_INT_OFF &
   USART_ASYNCH_MODE &
   USART_EIGHT_BIT &
   USART_SINGLE_RX &
   USART_BRGH_HIGH,
   41);

Pero na....

y lo que me has dicho tampoco  :(

¿Puede ser la desactivación de las instrucciones extendidas? En el ejemplo de microchip están activadas y en el mío no....
He probado a activarlas y me dice el compilador que no se usan por lo que puede tener ejecutarse con errores.

me pierde....
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 18 de Noviembre de 2009, 07:37:29
por cierto, el error que me da es Card Init Comm Failure
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 18 de Noviembre de 2009, 10:33:50
El tema de los fuses depende de que oscilador externo estés utilizando y la frecuencia interna a la que quiere trabajar, por ejemplo en el código de Microchip podemos decir que usar un cristal de 20MHz, cada ciclo de maquina será 4 ciclos de reloj, y divide la frecuencia del PLL en 2, así que trabaja a 12MIPS. Para que trabajé de igual manera lo único que tienes que proveerle es el cristal de 20MHz  ;-)

Por lo que indicas falla al tratar de desactivar la memoria, y en el código prueba una sola vez, lo que yo hago es probar varias veces dentro de un while. Por ejemplo yo la inicialización la haría de la siguiente manera:

Código: C
  1. SDC_Error MediaInitialize(SDCSTATE *Flag)
  2. {
  3.     word timeout;
  4.     SDC_Error       status = sdcValid, CSDstatus = sdcValid;
  5.  
  6.     SDC_RESPONSE    response;
  7.     // clear out flags
  8.     Flag->_byte = 0x0;
  9.  
  10.     SDC_CS = 1;                               //Initialize Chip Select line
  11.     // This function was called for a reason Turn it on
  12.     //SDC_ON;
  13.     //Media powers up in the open-drain mode and cannot handle a clock faster
  14.     //than 400kHz. Initialize SPI port to slower than 400kHz
  15.     OpenSPI(SPI_FOSC_64, MODE_11, SMPMID);
  16.     // let the card power on and initialize
  17.     Delayms(100);
  18.     //Media requires 80 clock cycles to startup [8 clocks/BYTE * 10 us]
  19.     for(timeout=0; timeout<20; timeout++)
  20.         mSend8ClkCycles();
  21.     SDC_CS = 0;
  22.     Delayms(20);
  23.  
  24.     timeout = 0xFFF;
  25.     do
  26.     {
  27.          response = SendSDCCmd(GO_IDLE_STATE,0x0);
  28.          timeout--;            
  29.     }while((response.r1._byte&0x01)== 0x00 && timeout != 0);
  30.     // see if it failed        
  31.     if(timeout == 0)        
  32.     {
  33.         status = sdcCardInitTimeout;      // we have not got anything back from the card
  34.         goto InitError;
  35.     }
  36.    
  37.     timeout = 0xFFF;
  38.     do
  39.     {
  40.          response = SendSDCCmd(SEND_OP_COND,0x0);
  41.          timeout--;            
  42.     }while((response.r1._byte&0x01)== 0x01 && timeout != 0);
  43.     // see if it failed        
  44.     if(timeout == 0)        
  45.     {
  46.         status = sdcCardInitTimeout;      // we have not got anything back from the card
  47.         goto InitError;
  48.     }else{
  49.        // get the CSD register before increasing the spped page 4-8 of sd card manual last line
  50.        CSDstatus=CSDRead();
  51.        if(!CSDstatus)
  52.            OpenSPI(SPI_FOSC_4, MODE_11, SMPMID);       //Increase clock speed
  53.         else
  54.            status=sdcCardTypeInvalid;
  55.     }
  56.  
  57.    // Turn off CRC7 if we can, might be an invalid cmd on some cards (CMD59)
  58.    // response = SendMMCCmd(cmdCRC_ON_OFF,0x0);
  59.      
  60.    // Ok Now set the block length to 512. It should be already
  61.    SendSDCCmd(SET_BLOCKLEN,BLOCKLEN_512);
  62.    
  63.    // set the write protect state
  64.    if(IsWriteProtected())
  65.       Flag->isWP = TRUE;
  66.  
  67.     // read it a couple times until we sucessfully read it, seen san disks that really do not
  68.     // like this init routine for somereason, almost have to prime the device...
  69.     for(timeout = 0xFF; timeout > 0 && SectorRead(0x0,(byte*)msd_buffer)!= sdcValid; timeout--)
  70.     {;}
  71.  
  72.     // see if we had an issue
  73.     if(timeout == 0)  
  74.     {    
  75.         status = sdcCardNotInitFailure;
  76.         goto InitError;
  77.     }
  78.  
  79.     return(status);  
  80.    
  81. InitError:
  82.     SDC_CS = 1;                               // deselect the devices
  83.    
  84.     return(status);                            
  85. }//end MediaInitialize


Se prueba varias veces hasta desactivarla, y después se prueba varias veces hasta activarla, si no fallo hasta ahí lo demás debería de andar joya!

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 18 de Noviembre de 2009, 11:16:38
Con esta modificación me dice "Card Init Time Out"  :(

Esto es cosa de meigas...
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 18 de Noviembre de 2009, 11:41:37
Le tengo puesto un xtal de 20Mhz  :mrgreen:

No entiendo nada.... he estado comparando la librería que has colgado con el programa y modificando para que sean exactas y nada...

Muchas gracias suky!!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 18 de Noviembre de 2009, 12:19:43
Suky, ¿cómo conectas el SDI? ¿Lo conectas directamente al pic o mediante un buffer para igualar tensiones?

yo lo tengo puesto mediante un buffer que son dos puertas nand con las entradas unidas (queda un inversor) en serie. Así niego 2 veces por lo que la señal queda igual. Es que no tenía inversores :oops:
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 18 de Noviembre de 2009, 12:27:37
Con esta modificación me dice "Card Init Time Out"  :(

Esto es cosa de meigas...

Osea que hace 4095 intentos de inicialización y no lo logra  :?
Suky, ¿cómo conectas el SDI? ¿Lo conectas directamente al pic o mediante un buffer para igualar tensiones?

yo lo tengo puesto mediante un buffer que son dos puertas nand con las entradas unidas (queda un inversor) en serie. Así niego 2 veces por lo que la señal queda igual. Es que no tenía inversores :oops:

Yo uso un 18F4550 y le coloqué un divisor resistivo a CS, SCK y SDI de la memoria, no estarás equivocándote (como yo en una ocasión  :oops:) de colocar el pin DO del PIC con el pin DO de la memoria?

También si puedes cambia de memoria, es un microSD o SD?


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 19 de Noviembre de 2009, 04:56:50
No, tengo un divisor en el SDI de la memoria al SDO del pic y el buffer que te comenté del SDO de la memoria al SDI del pic.

Tengo puesta una microsd con adaptador a sd, probaré con una mmc y una sd normal a ver que pasa....

Pero tengo puesto esa porque la aplicación de microchip exige un fat32 y es la única tarjeta que tengo con ese formato...
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 19 de Noviembre de 2009, 05:12:13
Nada :(

Cuelgo el esquema para que le eches un vistazo http://www.4shared.com/file/155159172/77f1b13/sd_online.html

Muchas gracias Suky!!!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 19 de Noviembre de 2009, 09:53:21
El hardware se ve correcto  :? Vamos a seguir haciendo pruebas, lo que queda es variar la frecuencia de SPI al inicializar a SPI_FOSC_16 y SPI_FOSC_4, probar con las 2 haber si hay respuesta.-

Después sería ideal ver que valor tiene la respuesta al salir de cada bucle:

Código: C
  1. do
  2.    {
  3.         response = SendSDCCmd(GO_IDLE_STATE,0x0);
  4.         timeout--;            
  5.    }while((response.r1._byte&0x01)== 0x00 && timeout != 0);
  6.    //  Mostrar valor de response.r1._byte   <<<<<---<<<<<<
  7.    // see if it failed        
  8.    if(timeout == 0)        
  9.    {
  10.     .....
  11.    do
  12.    {
  13.         response = SendSDCCmd(SEND_OP_COND,0x0);
  14.         timeout--;            
  15.    }while((response.r1._byte&0x01)== 0x01 && timeout != 0);
  16.    //  Mostrar valor de response.r1._byte   <<<<<---<<<<<<
  17.    // see if it failed        
  18.    if(timeout == 0)        
  19.    {
  20.     .......


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 19 de Noviembre de 2009, 14:01:09
No funciona con el cambio de frecuencia, lo había probado ya...

Los valores son los mismos en los dos casos: F0E552E552E552040EDBCF (SPI_FOSC_64)
52E552E552040EDBCF (SPI_FOSC_4)
f0E552E552R552040EDBCF (SPI_FOSC_16)
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 19 de Noviembre de 2009, 14:57:12
Que es exactamente lo que me muestras?

Para ver como está reaccionando la memoria al enviar un comando habría que ver que responde en este sector:

Código: C
  1. do
  2.         {
  3.             response.r1._byte = ReadMedia();
  4.             timeout--;
  5.         }while((response.r1._byte == 0xFF) && (timeout != 0));

Dentro de la función SendSDCCmd.

Según la teoría después de enviar un comando se debe esperar la respuesta R1 que tiene la forma de 0xxxxxxx, en donde cada bit es indicativo de un error o estado de la memoria.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 20 de Noviembre de 2009, 11:29:17
Esas respuestas son las de "response.r1._byte" que me ponías en el otro post.

No he podido mirar el código que me has puesto porque he tenido mucho curro hoy  :oops: y hasta el lunes no tengo internet
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 23 de Noviembre de 2009, 14:05:45
te prometo que mañana te lo pongo!!!!!
hoy tampoco me han dejado :5]
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 23 de Noviembre de 2009, 14:08:03
Ok! Estaremos a la espera haber si podemos sacar adelante este proyecto  :undecided:


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 25 de Noviembre de 2009, 13:27:29
Lo puede mirar!!!

Pero... no tengo respuesta!!! :huh:

Este es el código que he modificado en SendSDCCMD:
Código: [Seleccionar]
putrsUSART("\nenvío por el SPI");
    WriteSPI(CmdPacket.cmd);                //Send Command
    WriteSPI(CmdPacket.addr3);              //Most Significant Byte
    WriteSPI(CmdPacket.addr2);
    WriteSPI(CmdPacket.addr1);
    WriteSPI(CmdPacket.addr0);              //Least Significant Byte
    WriteSPI(CmdPacket.crc);                //Send CRC
putrsUSART("\nse supone que tengo respuesta:");
WriteUSART(sdmmc_cmdtable[cmd].responsetype);
putrsUSART(sdmmc_cmdtable[cmd].responsetype);
    // see if  we are going to get a response   
    if(sdmmc_cmdtable[cmd].responsetype == R1 || sdmmc_cmdtable[cmd].responsetype == R1b)
    {
        do
        {
            response.r1._byte = ReadMedia();
            timeout--;
WriteUSART(response.r1._byte);
        }while((response.r1._byte == 0xFF) && (timeout != 0));
y no me saca nada :huh:
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 25 de Noviembre de 2009, 13:44:50
Hola!!
Esta parte eliminala:
Código: [Seleccionar]
putrsUSART("\nse supone que tengo respuesta:");
WriteUSART(sdmmc_cmdtable[cmd].responsetype);
putrsUSART(sdmmc_cmdtable[cmd].responsetype);

Lleva mucho tiempo y se puede perder datos.  ;-)

Ahora en este caso:
Código: [Seleccionar]
WriteUSART(response.r1._byte);
Se debería de recibir alguna respuesta, si es 0x00, es porque no hay ninguna respuesta de la memoria  :( Has esta prueba con más de una memoria para que ver que pasa.

Acuérdate de tener:

Código: [Seleccionar]
for(timeout=0; timeout<10; timeout++)
       WriteSPI(0xFF);

WriteSPI(CmdPacket.cmd);                //Send Command

Para que se sincronice el envío de datos.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 25 de Noviembre de 2009, 14:09:36
La parte que dices que quiete la he puesto para hacer la prueba.

¿Dónde tengo que tener ese código?
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 25 de Noviembre de 2009, 14:13:17
El código lo tengo justo antes del envío  :mrgreen:

He probado con una mmc, una sd y la microsd con adaptador y lo mismo :5]
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 26 de Noviembre de 2009, 02:03:22
No tuve éxito en C18, por ahora me gano!  :mrgreen:

Debug en CCS:
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28403.0;attach=10567)

Debug en C18.
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28403.0;attach=10565)

Es el mismo código, pero debo estar configurando mal SPI porque no resulta  :5] Adjunto ambos códigos.-

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 26 de Noviembre de 2009, 04:58:33
¿Pero es otro código?

¿Entonces no sólo soy yo?  :oops:

No sé si alegrarme o entristecerme
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 26 de Noviembre de 2009, 10:08:16
¿Pero es otro código?

¿Entonces no sólo soy yo?  :oops:

No sé si alegrarme o entristecerme

Es el mio pasado a C18. En CCS se inicia la SD Card, pero en C18 no, y no veo porque!  :? Haciendo debug en proteus veo la linea de SDO baja cuando debería estar siempre en alto por la configuración  :shock:

Cuando me haga un tiempito lo sigo revisando.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 26 de Noviembre de 2009, 14:57:22
Hola! Soy nuevo con eso de los SD & MMC...

Pueden disponibilizar el schematic???

Gracias!  :)
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 26 de Noviembre de 2009, 16:11:51
Hola! Soy nuevo con eso de los SD & MMC...

Pueden disponibilizar el schematic???

Gracias!  :)

En el mismo hilo (http://www.todopic.com.ar/foros/index.php?topic=28403.msg234353#msg234353) está el esquemático que utiliza Slalen.

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 30 de Noviembre de 2009, 05:46:20
Suky estoy probando tu programa en CCS, y tengo varias dudas:

¿Para cambiar el clock a 20MHz sólo tengo que cambiar #use delay(clock=20000000)?
¿No tengo que cambiar ningún valor para el RS232?

¿Para qué son los pines?:
   output_high(PIN_C0);
   output_high(PIN_C1);
   output_high(PIN_C2);

Es que al cambiar los pines del 232, del cs y el valor del clock recibo datos pero no se puede leer nada...
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 30 de Noviembre de 2009, 05:50:03
Me respondo: No hay que cambiar el valor del clock, tienes una entrada de 20MHz y con el divisor obtienes los 48MHz  :D

Lo que me dice tu programa:
Código: [Seleccionar]
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

Parece que el error lo tengo en la lectura. Voy a comprobar la placa ;-)

Muchas gracias SENSEI!!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 30 de Noviembre de 2009, 06:06:04
Más pruebas:
1- Quitar el buffer del SDI (del pic o sea, SDO de la sd) por si está metiendo algún error: no detecta la tarjeta por lo que tiene que tener el buffer  :D
2- Activar el rs232-debbug de tu programa:
Código: [Seleccionar]
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: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: 2; Respuesta recibida:0
Toquen recibido: 0xFE

Manufacturer ID: 1B
OEM/Application ID: SM
Product Name: 00000
Product Revision: 10
Serial Number: B157967E
Manufacturer Date Code: 0094
CRC-7 Checksum: 47

Lectura del CSD:

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

CSD_STRUCTURE: 00
TAAC: 7F
NSAC: B0
TRAN_SPEED: 32
CCC: 05F5
READ_BL_LEN: 09
READ_BL_PARTIAL: 01
WRITE_BLK_MISALIGN: 00
READ_BLK_MISALIGN: 00
DSR_IMP: 00
C_SIZE: 33
VDD_R_CURR_MIN: 06
VDD_R_CURR_MAX: 06
VDD_W_CURR_MIN: 06
VDD_W_CURR_MAX: 06
C_SIZE_MULT: 06
ERASE_BLK_EN: 01
SECTOR_SIZE: 3F
WP_GRP_SIZE: 7F
WP_GRP_ENABLE: 01
R2W_FACTOR: 05
WRITE_BL_LEN: 09
WRITE_BL_PARTIAL: 00
FILE_FORMAT_GRP: 00
COPY: 00
PERM_WRITE_PROTECT: 00
TMP_WRITE_PROTECT: 00
FILE_FORMAT: 00
CRC: CB

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: 2; Respuesta recibida:0
Toquen recibido: 0xFE
Terminada la lectura
Valores Leidos:

EB,FE,90,66,73,69,6D,35,2E,36,30,00,02,20,01,00,02,00,02,00,00,F8,76,00,20,00,02,00,00,00,00,00,
00,B0,0E,00,00,00,29,78,56,34,12,20,20,20,20,20,20,20,20,20,20,20,46,41,54,31,36,20,20,20,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,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: 2; 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,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,4D,82,30,43,BC,40,A1,10,05,E9,5A,CA,45,
07,06,00,4D,28,EA,85,54,0E,00,20,80,EA,10,0D,90,81,1A,80,03,14,11,8C,E0,A4,49,71,23,08,68,80,58,
8C,A7,0C,A1,54,02,02,41,99,2C,00,48,9C,15,CA,A8,D3,24,94,E6,F7,06,00,D3,20,2D,5F,13,E1,8B,14,72,
05,0C,40,87,10,05,0A,84,1D,50,44,20,D2,08,58,40,01,A2,20,CC,1A,40,44,95,62,A1,C8,5C,D1,A0,24,E0,
3B,50,03,93,A0,81,57,00,04,E1,60,17,50,78,0A,12,01,40,30,40,08,86,B1,15,92,91,03,48,9B,10,82,0E,
21,A4,18,AD,56,0E,09,24,91,3A,0C,54,CB,2C,83,00,2C,E8,42,6C,04,F0,C0,11,84,0A,28,35,CA,40,84,24,
19,AC,A8,B8,0D,0C,C0,CB,21,85,04,39,49,10,24,C8,4E,04,B0,C1,4A,05,20,2C,71,60,00,EC,69,1E,10,4A,
81,00,45,45,28,94,5A,70,86,00,98,DD,05,82,04,BB,46,22,20,54,4B,24,43,10,0F,0E,31,7E,84,09,E0,6C,
00,68,02,B3,00,40,04,A3,82,8E,93,1C,2C,0B,19,03,80,E0,98,20,56,C0,2C,31,54,08,40,01,42,FE,20,64,
08,81,22,92,43,30,C0,23,01,2C,00,11,08,25,88,72,42,AE,1D,42,44,19,10,28,10,49,24,00,00,00,00,00,

Si entiendes algo espero que me lo expliques  :D :D

Veo que los CMD de inicialización los responde bien pero para escribir en ella nada.

- Probar con todas las tarjetas y el resultado es el mismo.

Lo que alegra es que se inicializa la tarjeta  :-/ :-/
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 30 de Noviembre de 2009, 10:41:48
 :-/ :-/ Claramente se ve que inicia la tarjeta  :-/

Enviando CMD0 vemos que la memoria de deshabilita rápidamente (respuesta 0x01), luego al enviar CMD1 es necesario el envío de 3 veces el comando, para pasar a activarla (respuesta 0x00).

Y funciona todo! Fíjate que al leer el primer sector estas leyendo el campo de la FAT, esto se ve claramente por los tres primeros bytes: EB,FE,90

Ahora dices que la escritura no funciona, pero yo veo que si! Fíjate en la lectura de la dirección 512 dice Liberia ... pero en Hex.  ;-)

Sabemos que funciona, ahora hay que solucionarlo en C18 y ya estamos  :-/


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 30 de Noviembre de 2009, 11:53:38
Todo un avance!!! :-/ :-/ :-/

Ahora queda lo difícil :5]

Cómo me has alegrado el día  :mrgreen: :mrgreen:
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 30 de Noviembre de 2009, 13:58:19
Todo un avance!!! :-/ :-/ :-/

Ahora queda lo difícil :5]

Cómo me has alegrado el día  :mrgreen: :mrgreen:

jejeje!! En C18 hay que revisar la parte de configuración del SPI, los fuses los revise bien y no encontré que pueda estar afectando  :?
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 30 de Noviembre de 2009, 17:21:27
ya tengo internet en casa XD

yo he revisado el modo del spi y tiene estos:
CKP: Clock Polarity Select bit
1 = Idle state for clock is a high level
CKE: SPI Clock Select bit
0 = Transmit occurs on transition from Idle to active clock state

#define   SMPMID        0x00           // Input data sample at middle of data out
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 30 de Noviembre de 2009, 23:21:42
ya tengo internet en casa XD

yo he revisado el modo del spi y tiene estos:
CKP: Clock Polarity Select bit
1 = Idle state for clock is a high level
CKE: SPI Clock Select bit
0 = Transmit occurs on transition from Idle to active clock state

#define   SMPMID        0x00           // Input data sample at middle of data out

Claro, se debe configurar en modo 3 (1_1), osea que clock y data estén en high en modo inactivo. Lo que vi en C18 que eso no pasa, sino que después de enviar el primer Byte las lineas bajan, haber si mañana me hago un tiempito y reviso el código para detectar el problema  :?

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 01 de Diciembre de 2009, 01:26:43
Solo a modo de información  :mrgreen: Probaste la SD, MMC y la microSD y te mostró lo mismo? Para saber que tan aplicable es el código, porque yo tuve la posibilidad de probarlo solo en un SD Card.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 01 de Diciembre de 2009, 04:59:42
funciona con todas, con la que mejor va es con la MMC
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 02 de Diciembre de 2009, 23:33:56
Lo logre  :-/  :mrgreen: Pase la rutina que había hecho en CCS a C18, ahora hay que probar si le funciona a alguien mas  :D . Adjunto la librería más un ejemplo de prueba.
Hay que tener en cuenta que en C18 para crear arreglos mayores a 256 bytes se debe modificar el *.lkr, el cual adjunto también junto a la librería.


Código: C
  1. #include <p18f4550.h>
  2. #include <delays.h>
  3. #include <usart.h>
  4.  
  5. #include <SDCardSPI.h>
  6.  
  7. #pragma config PLLDIV=5
  8. #pragma config CPUDIV=OSC1_PLL2
  9. #pragma config USBDIV=2
  10. #pragma config FOSC=HSPLL_HS
  11. #pragma config IESO=OFF
  12. #pragma config PWRT=ON
  13. #pragma config WDT=OFF
  14. #pragma config MCLRE=ON
  15. #pragma config XINST=OFF
  16. #pragma config DEBUG=OFF
  17. #pragma config FCMEN = OFF
  18. #pragma config VREGEN=ON
  19. #pragma config LVP=OFF
  20. #pragma config BOR=OFF
  21.  
  22. #pragma udata data=0x400
  23. volatile far char Buffer[512];
  24. #pragma udata
  25.  
  26.  
  27. void main(void){
  28. unsigned char k;
  29. unsigned int j;
  30.         OpenUSART( USART_TX_INT_OFF &
  31.         USART_RX_INT_OFF &
  32.         USART_ASYNCH_MODE &
  33.         USART_EIGHT_BIT &
  34.         USART_SINGLE_RX &
  35.         USART_BRGH_LOW,
  36.         77);
  37.         Delay10KTCYx(255);
  38.        
  39.        
  40.         for(j=0;j<512;j++) Buffer[j]=j;
  41.  
  42.         putrsUSART("Iniciando SD Card\n\r" );
  43.         SDCard_init();
  44.         SDCard_read_CID();
  45.         SDCard_read_CSD();
  46.         printf("Escribimos sector 0x200\n\r" );
  47.         if(SDCard_write_block(0x200,Buffer)==0){
  48.                 printf("Error en escritura\n\r" );
  49.         }else{
  50.                 printf("Leemos sector 0x200\n\r" );
  51.                 if(SDCard_read_block(0x200,Buffer)==0){
  52.                         printf("Error en lectura\n\r" );
  53.                 }else{
  54.                         printf("Valores Leidos:\r\n\r\n");
  55.                     for(j=0;j<16;j++){
  56.                       for(k=0;k<32;k++){
  57.                          printf("%X,",((unsigned char)Buffer[j*32+((unsigned int)k)]));
  58.                       }
  59.                       printf("\r\n");
  60.                     }
  61.                         putrsUSART("Listo\n\r" );
  62.                 }
  63.         }
  64.         while(1){                               // Bucle infinito.
  65.         }
  66. }
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 03 de Diciembre de 2009, 05:26:34
Creo que no me va :(
La respuesta de la SD o MicroSD:
Código: [Seleccionar]
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:
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:
Iniciando SD Card

--> Se inicia sincronizacion

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

Repeticiones para respuesta de CmdXX:
Iniciando SD Card

La respuesta de la MMC:
Código: [Seleccionar]
Iniciando SD Card

--> Se inicia sincronizacion

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

Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:
Repeticiones para respuesta de CmdXX: 1; Respuesta recibida:
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: 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
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:
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:
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:
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:  Respuesta recibida:1
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:
Iniciando SD Card
La MMC creo que si funciona :?
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 03 de Diciembre de 2009, 09:21:47
Hiciste el cambio en la definición del pin CS? Voy a revisar haber que puede ser  :?


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 03 de Diciembre de 2009, 10:13:22
Hiciste el cambio en la definición del pin CS? Voy a revisar haber que puede ser  :?


Saludos!
Sí, al principio se me pasó :oops: y cuando no leía nada miré a ver que podía ser y me dí cuenta de que no lo había cambiado  :mrgreen:
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 03 de Diciembre de 2009, 15:15:27
Hola Suky! Muy buen trabajo!

A mi todavia me parece griego, jejeje, puedes disponibilizar el archivo del Proteus que hiciste por favor? Necesito mucho hacer conexion com un SD!

A mi me sigue dando error en Proteus, "can´t create or open card image file"

Luego, con el archivo de Proteus, puedo simular com el SDCard.c? O es el SDCarCSS.c???????
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 03 de Diciembre de 2009, 15:20:52
Una otra duda, yo tambien tengo una EEPROM conectada al PIC.

Tengo que conectar la EEPROM y el MMC a RB0 y RB1

Yo puedo simplemente conectar los dos directamente?

(http://img51.imageshack.us/img51/1885/mmceeprom.png)
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: MGLSOFT en 03 de Diciembre de 2009, 15:36:02
Drod, estas confundiendo SPI con I2C.
Puedes poner varios dispositivos I2C juntos.
Tambien dos o mas dispositivos SPI juntos.
Pero no deberias mezclarlos.
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 03 de Diciembre de 2009, 16:20:35
Exacto, no mezcles  :tongue: Y el error que marca es porque no le has asignado una imagen a la SD Card o MMC, busca por la red siempre se encuentra algo o creo que en los ejemplos de Proteus hay una ;-)


Luego, con el archivo de Proteus, puedo simular com el SDCard.c? O es el SDCarCSS.c???????

Lo más fácil es usar el código del primer post, que está en CCS, porque para usar el de C18 hay que manejarlo un poco mas como para crear el proyecto, adjuntar correctamente las librerías, ect.

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 04 de Diciembre de 2009, 12:25:09
Por fin me he aclarado un poco a respecto del I2C y el SPI! Gracias!

Suky, mira, hice un test en Proteus, con una imagen asignada a la SD Card, y con el archivo SDCard.hex, y me sale
"Iniciando SD Card - Error" en el hyperterminal. Que puede ser?

(http://img80.imageshack.us/img80/6731/mmcerror.png)


Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 04 de Diciembre de 2009, 13:00:31
El Bus SPI no necesita resistencias pull-up, retíralas haber si es eso  :? Sino subo la imagen y el circuito que uso yo, pero son como 30MB.



Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 04 de Diciembre de 2009, 13:07:06
Es que antes de este test, yo ya habia hecho sin las resistencias!!! Se las puse por si acaso, y tampoco funciono :?
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 04 de Diciembre de 2009, 13:40:06
aaaaa!!  :oops: me había olvidad de algo  :mrgreen: Para la simulación se debe comentar la parte de la inicialización que asegura desactivar el CRC, osea la función SDCard_init tiene que quedar de la siguiente manera:

Código: C
  1. int1 SDCard_init(void){
  2. int i,Respuesta;
  3.    
  4.    SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_16|SPI_H_TO_L|SPI_XMIT_L_TO_H );
  5.    
  6.    #if RS232_DEBUG
  7.       printf("\r\n--> Se inicia sincronizacion\r\n");
  8.    #endif
  9.    output_high(SD_CS);
  10.    delay_ms(20);
  11.    for(i=0;i<20;i++) spi_xfer(SDCard,0xFF);   // Para sincronización.
  12.    output_low(SD_CS);
  13.    delay_ms(20);
  14.    #if RS232_DEBUG
  15.       printf("\r\n--> Se envia CMD0 (Se desactiva SD Card)\r\n");
  16.    #endif
  17.    i=0;
  18.    do{
  19.       if(SDCard_send_command(CMD0,0x00,Respuesta)==0){
  20.          return(0);        // Si se recibe 0 error por timeout.-
  21.       }else{i++;}  
  22.    }while(((Respuesta&0x01)==0x00) && i<200);
  23.    if(i>=200){return(0);} // Timeout esperando desactivación de SD Card.
  24.    // Pasamos a esperar condición de SD Card activa.
  25.    // Si R1=0x01, SD Card en estado desactivado.
  26.    #if RS232_DEBUG
  27.       printf("\r\n--> Se envia CMD1 (Se activa SD Card)\r\n");
  28.    #endif
  29.       i=0;
  30.    do{
  31.       if(SDCard_send_command(CMD1,0x00,Respuesta)==0){
  32.          return(0);     // Si se recibe 0 error por timeout.-
  33.       }else{i++;}
  34.    }while(((Respuesta&0x01)==0x01) && (i<100)); // Mientras se reciba R1=0x01
  35.    if(i>=100){return(0);} // Timeout esperando activación de SD Card.
  36.    
  37.    #if RS232_DEBUG
  38.       printf("\r\n--> Se envia CMD16 (Se fija largo del Bloque para escritura/lectura : %lu)\r\n",BLOCK_SIZE);
  39.    #endif
  40.    // Se fija largo del bloque lectura/escitura.
  41.    if(SDCard_send_command(CMD16,BLOCK_SIZE,Respuesta)==0){
  42.       return(0);
  43.    }else if(Respuesta!=0){
  44.       return(0);
  45.    }
  46.  
  47.    /*#if RS232_DEBUG
  48.       printf("\r\n--> Se envia CMD59 (Desactivación de CRC)\r\n");
  49.    #endif
  50.    // Se desactiva CRC.
  51.    if(SDCard_send_command(CMD59,0,Respuesta)==0){
  52.       return(0);
  53.    }else if(Respuesta!=0){
  54.       return(0);
  55.    }*/
  56.    
  57.    SDDeselect();
  58.    return(1);
  59. }


Con memorias reales no surge este problema  ;-)


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 04 de Diciembre de 2009, 14:01:52
SIIIIIIII!!!!! jajajaja!!!!!!!!!  :-/

Ahora puedo seguir con los estudios de las SD!  :P Muchas gracias!!!!  :-/

(http://img163.imageshack.us/img163/2519/porfin.png)
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 04 de Diciembre de 2009, 14:09:08
Para ver paso a paso lo que se va haciendo coloca Debug_RS232 a 1.  ;-)


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 04 de Diciembre de 2009, 14:15:11
DIOOOOOOOOOOOOS!  :mrgreen: Que bueno!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 04 de Diciembre de 2009, 14:22:32
Una preguntita, sobre una duda que se me ocurrio,

Como me habeis dicho, el IC2, y el SPI no se mezclan, verdad..

Pero algunos pines los tienen en comun no?

Para hacer este test magnifico que hicistes tu, yo conecte el SD via SPI (como se puede ver en el schematic),

pero....

Y si, además del SD, yo quisiera conectar la EEPROM y el DS1307, que son I2C?

Los pines se mezclarian no?

Yo leí que en este caso, hay que emular via software, o el I2C o el SPI, siendo que el SPI es el mas facil de hacer por software,
asignando cualquiera otros 4 pines para tal!

Mi pregunta es: Se puede adaptar el codigo SDCard.c y SDCard_hard.C, para que trabaje como SPI pero emulando via software, y con
el SD card conectado en D0 D1 D2 y D3 por ejemplo???

O me aconsejas hacer al revés, emulando el I2C?

Muchiiiiiiiisimas gracias!




 


Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 04 de Diciembre de 2009, 14:26:54
IC2 no, I2C, jajajaja  :oops:
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 04 de Diciembre de 2009, 14:39:55
Es sencillo cualquiera de los 2, por lo menos en CCS  :mrgreen:

Por ejemplo para implementar SPI por soft hay que comentar la siguiente linea en SDCard_init():
Código: [Seleccionar]
//SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_16|SPI_H_TO_L|SPI_XMIT_L_TO_H );
Y al inicio cambiar el #use SPI() por:

Código: [Seleccionar]
#use spi(MASTER,CLK=PIN_A0, DO=PIN_A1, DI=PIN_A2, BITS=8, MODE=3, MSB_FIRST, stream=BUS_SPI, FORCE_SW)
Colocando los pines que tu quieras. Eso si, así no lo probé nunca  :?


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 04 de Diciembre de 2009, 14:52:52
Realmente hay que cambiar el "stream=SDCard" por el "stream=BUS_SPI"?

Lo cambie, pero ahora me salem 25 errores "undefined identifier SDCard"!

Tendre que cambiar todos los SDCard por BUS_SPI?

Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 04 de Diciembre de 2009, 15:33:22
Perdón, me equivoque de nombre  :D Manteen "stream=SDCard"  ;-)


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 05 de Diciembre de 2009, 00:14:33
Hola!

Hice eso, comente la línea
//SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_16|SPI_H_TO_L|SPI_XMIT_L_TO_H );

Y cambié esta línea para exactamente
#use spi(MASTER,CLK=PIN_A0, DO=PIN_A1, DI=PIN_A2, BITS=8, MODE=3, MSB_FIRST, stream=SDCard, FORCE_SW)

Así como cambié el schematic en Proteus (image), y cabie la comunicacion serial para el d0 y d1 (antes se usava a0, y a1)

La CS sigue donde estava.

También hice: set_tris_a (0b00000100);

Pero mira lo que pasa: (Y se queda así infinitamente. Qué puede ser?)
(http://img42.imageshack.us/img42/672/errorhu.png)

Saludos!


Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 05 de Diciembre de 2009, 00:20:20
Lo que pasa que en el esquemático, el SDO del PIC debe ir al SDI de la memoria y lo mismo con la otra linea  :mrgreen:

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 05 de Diciembre de 2009, 00:30:00
No compreendo  :oops:
En este caso volveriamos a la configuracion anterior no? Seguiriamos usando
el SPI por hardware, y no emulando via software verdad?

Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 05 de Diciembre de 2009, 00:40:20
No, así como esta configurado por software, el SDO de la memoria MMC iría al Pin A2, el SDI de la memoria al pin A1.  ;-)


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 05 de Diciembre de 2009, 00:49:42
Siiiii!!! Ahora si!!!  :oops: :oops: :oops: :oops:  :-/ :-/ :-/ :-/ :-/

Es que yo habia conectado exactamente los pines del MMC en proteus, como estan en la linea

Código: [Seleccionar]
#use spi(MASTER,CLK=PIN_A0, DO=PIN_A1, DI=PIN_A2, BITS=8, MODE=3, MSB_FIRST, stream=SDCard, FORCE_SW)
Pero es al revés... jeje Es el mismo problema que tuve al conectar

El TX y RX del pic a un COMPIM, yo habia conectado el TX al RX del COMPIM, y el RX al TX del COMPIM, y en realidad es al revés   :oops: :oops: :oops: :oops:

Bueno, todavia no dominé el Sd card, pero el hardware del SD, EEPROM, DS1307, ya los tengo mas o menos!  :-/ :-/ :-/ :-/ :-/ :-/

Muchas gracias!  :-/ :-/ :-/ :-/ :-/ :-/ :-/
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 05 de Diciembre de 2009, 00:53:16
Y cuando has dicho "el SDO del PIC debe ir al SDI de la memoria y lo mismo con la otra linea", creia que te referias el SDO y SDI reales (pin 33 y 26) jejeje, por eso dije lo del "En este caso volveriamos a la configuracion anterior no?"  :oops: :oops:

Es lo que pasa cuando ententas compreender cosas a las 2 de la mañana jajaja  :D
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 05 de Diciembre de 2009, 01:00:41
 :D :D No hay problema, yo hice una de esas al hacer una plaquita modular para conexión SPI  :? Así se aprende  :D

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 05 de Diciembre de 2009, 12:17:18
Librería FAT:

Con esta librería es posible crear un archivo o directorio, abrir un archivo y agregarle datos, dentro del directorio raíz o en una dirección de carpetas establecidas (por ejemplo "/Logger/temp/data"). Además soporta nombres largos.

Ejemplos de utilización:

Buscando una dirección de carpetas. Por ejemplo si en nuestra memoria SD tenemos la siguiente estructura de directorios "/Logger/temp/data", y deseamos crear una carpeta o archivo en ella debemos determinar el cluster donde se encuentra definida para trabajar en ella. Para ello utilizamos la siguiente función:

FAT_FindDirectory(Direccion,DirectorioInicial,UbicacionCarpeta);   

donde:
Dirección: indica la estructura de directorios a buscar ("/Logger/temp/data").
DirectorioInicial: Indica a partir de que carpeta buscamos estructura. En principio iniciaríamos en la carpeta raíz y este valor seria 0.
UbicacionCarpeta: En esta variable se devuelve el cluster donde trabajar.

NOTA: La búsqueda se realiza a partir de los nombres cortos.-

Crear una carpeta. Para ello primero definimos el nombre corto (Mayúscula) y el nombre largo, que puede ser el mismo.

NombreCorto[12]="CARPETA"
NombreLargo[30]="Carpeta creada con PIC"

Utilizamos la siguiente función:

FAT_CreateDirectory(NombreLargo,NombreCorto,Ubicación)

donde:
Ubicación: es la dirección del Cluster en donde la crearemos. Esta dirección puede ser DirectorioRaiz (Definida dentro de la librería como 0) o una que se obtiene a buscar una dirección de carpetas con FAT_FindDirectory(...).

Creación de un archivo. Es idéntico a crear una carpeta pero con el adicional de indicar el string a escribir en dicho archivo. Dadas las capacidades físicas del microcontrolador el tamaño del string siempre será menor a un cluster.

FAT_CreateFile(NombreLargo,NombreCorto,Ubicacion,Texto)

Agregar datos a un archivo. Si tenemos ya un archivo creado con datos almacenados y necesitamos agregar más datos con esta función es relativamente sencillo donde posemos ir generando un archivo de cualquier tamaño. La función a utilizar es la siguiente:

FAT_OpenAddFile(NombreArchivo,UbicacionCarpeta,Texto)

donde:
NombreArchivo: Nombre corto de archivo en donde agregaremos datos.
UbicacionCarpeta: Dirección de carpeta contenedora del archivo.
Texto: Texto a agregar al archivo.

Abrir un archivo y leer su contenido: En la libreria se lee el archivo y se envia por puerto serial, es aquí donde se debe cambiar a gusto.

FAT_OpenFile(NombreArchivo,UbicacionCarpeta)
donde:
NombreArchivo: Nombre corto de archivo en donde agregaremos datos.
UbicacionCarpeta: Dirección de carpeta contenedora del archivo.




Ejemplo:
Código: C
  1. #include <18F4550.h>
  2. #device adc=8
  3. #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
  4. #use delay(clock=48000000)
  5. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_A0,bits=8, force_sw)
  6.  
  7. #include <SDCard_hard.c>
  8. #include <FAT16_SDCard1.3_.c>
  9.  
  10.  
  11.  
  12. char Texto1[512]={"******Datos iniciales**********\r\n28/10/09 11:10:56 22ºC\r\n28/10/09 11:11:56 22ºC\r\n28/10/09 11:12:56 22ºC\r\n28/10/09 11:13:56 22ºC\r\n28/10/09 11:14:56 22ºC\r\n28/10/09 11:15:56 22ºC\r\n28/10/09 11:16:56 22ºC"};
  13. char Texto2[512]={"\r\n******Datos Agregados**********\r\n28/10/09 11:10:56 22ºC\r\n28/10/09 11:11:56 22ºC\r\n28/10/09 11:12:56 22ºC\r\n28/10/09 11:13:56 22ºC\r\n28/10/09 11:14:56 22ºC\r\n28/10/09 11:15:56 22ºC\r\n28/10/09 11:16:56 22ºC"};
  14.  
  15. /*******************************************************************************/
  16. void main(){
  17. char NombreArchivo[13]="ARCHIVO.TXT";
  18. char EstructuraCarpetas[20];
  19. char NombreDirectorio[12]="CARPETA";
  20. char NombreLargo[30]="Archivo Datos.txt";
  21. int16 UbicacionFolder;
  22.  
  23. char i;
  24.  
  25.  
  26.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  27.    setup_adc(ADC_OFF);
  28.    setup_psp(PSP_DISABLED);
  29.    setup_wdt(WDT_OFF);
  30.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  31.    setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
  32.    setup_timer_2(T2_DISABLED,0,1);
  33.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  34.    setup_comparator(NC_NC_NC_NC);
  35.    setup_vref(FALSE);
  36.    
  37.    output_high(PIN_C0);
  38.    output_high(PIN_C1);
  39.    output_high(PIN_C2);
  40.    
  41.    delay_ms(1000);
  42.  
  43.    printf("Iniciando SD Card\r\n");
  44.  
  45.    if(SDCard_init()==0){
  46.          printf("Error al iniciar, intento %u\r\n",i);
  47.    }else{
  48.  
  49.       printf("Se ha iniciado correctamente la memoria!!!\r\n\r\n");
  50.       if(FAT_init()==0){
  51.          printf("Error FAT\r\n");
  52.          break;
  53.       }
  54.       Printf("Buscamos direccion de carpeta donde crear archivo:\r\n");
  55.       strcpy(EstructuraCarpetas,"/LOGGER/TEMP/DATA");
  56.       if(FAT_FindDirectory(EstructuraCarpetas,DirectorioRaiz,UbicacionFolder)==0){
  57.          printf("Error no se encuentra carpetas\r\n");
  58.       }
  59.      
  60.       printf("Creando Archivo:\r\n");
  61.       if(FAT_CreateFile(NombreLargo,NombreArchivo,UbicacionFolder,Texto1)==0){
  62.          printf("Error al crear archivo\r\n");
  63.       }
  64.       printf("    ->Archivo creado\r\n");
  65.       printf("Creando Carpeta:\r\n");
  66.       if(FAT_CreateDirectory(NombreDirectorio,NombreDirectorio,UbicacionFolder)==0){
  67.          printf("Error al crear carpeta\r\n");
  68.       }
  69.       printf("    ->Carpeta creada\r\n");
  70.       printf("Al archivo creado le agregamos datos:\r\n");
  71.       if(FAT_OpenAddFile(NombreArchivo,UbicacionFolder,Texto2)==0){
  72.          printf("Error al intentar encontrar archivo\r\n");
  73.       }
  74.       printf("    ->Datos Agregados\r\n");
  75.    }
  76.    while(1){}
  77.    
  78. }
Resultado:
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28403.0;attach=10636)

He realizado pocas pruebas como para decir que es 100% funcional, pero un 15% alcanza  :D Cuando me haga de tiempo iré probando y depurando el código  ;-)


Edit:
Errores corregidos:
■ Se tiene en cuenta en la definición de archivos o directorios el tamaño de las entradas, para prever si no hay suficiente el espacio del sector.
■ Se corrige problema al crear directorios de nombre largo.
■ Se corrige problema en algoritmo de creación de nombres largos, dado que según el tamaño se hacia erróneamente.
■ La rutina de lectura de archivo lee según tamaño de archivo y no hasta recibir el carácter nulo.   

--------------------------------------------------------------------------------


Saludos!


Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: tinchosalamero en 06 de Diciembre de 2009, 17:58:40
Excelente trabajo... son aportes realmente importantes, sefuramente los estaremos usando

muchas gracias
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 07 de Diciembre de 2009, 12:12:48
Oh no, me dice que no hay RAM suficiente para las variables!  :shock:
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 07 de Diciembre de 2009, 13:28:11
 :D Estas usando USB? Porque la librería FAT ocupa unos 700 bytes, saca los buffer Texto1 y Texto2, reemplazalos por uno solo y de menor tamaño.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 07 de Diciembre de 2009, 15:28:29
Si yo quito el ProbandoFuncionamento()si que funciona, pero el 18F4550 tiene mas capacidad no?....

En el compilador CCS es solo necesario poner PCH16 bit, y poner 18F4550 en "Target Chip"???

A respecto del programa, funciono!

Pero creo que no se puede simular en proteus verdad?

Creo que solo con un SD fisico tienes la carpeta "host" no?

Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 07 de Diciembre de 2009, 15:41:41
Realmente ya no se ni que estas probando  :D Porque probando funcionamiento es para probar la librería a nivel hard, osea la comunicación SPI.

El 18F4550 tiene 32k de flash (memoria de programa) y 2k de RAM, que si se utiliza USB se reduce al 50% dependiendo de la versión del CCS. En el foro hay un tema que trata  como ajustar el uso de la memoria RAM cuando se usa USB.

Después para proba la librería FAT, hay que hacerlo con una tarjeta real. No se me ocurre sino como probarlo  :undecided:


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Drod en 07 de Diciembre de 2009, 17:11:30
Hola suky! Solo estoy probando el archivo "SDCard.c", con las líneas del archivo FAT añadidas!

No hay nada mas en el archivo, jeje





Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: gabriela_jimena en 16 de Diciembre de 2009, 21:20:09
Hola chicos!


Soy novata con respecto a las sd card. Me parece interesante y un muy buen tema. Bueno, queria ver si me podian ayudar con el conexionado de la sd card, un ds1307 y una salida serial (o alguno de ellos XD), utilizando el pic 18f4550. Yo estoy usando el proteus (me lo recomendaron) y programo en pic c (ccs). Una imagen o un archivo .dsn me seria util. :mrgreen:
Ademas cual libreria seria la mas adecuada para usar en una sd card de 1GB (en CCS si se puede chiquillos), dado q veo muchas librerias.

Saludos! :o

La colombianita.
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 16 de Diciembre de 2009, 21:38:52
Hola chicos!


Soy novata con respecto a las sd card. Me parece interesante y un muy buen tema. Bueno, queria ver si me podian ayudar con el conexionado de la sd card, un ds1307 y una salida serial (o alguno de ellos XD), utilizando el pic 18f4550. Yo estoy usando el proteus (me lo recomendaron) y programo en pic c (ccs). Una imagen o un archivo .dsn me seria util. :mrgreen:
Ademas cual libreria seria la mas adecuada para usar en una sd card de 1GB (en CCS si se puede chiquillos), dado q veo muchas librerias.

Saludos! :o

La colombianita.

Hay que dedicarse y estudiar un poco el tema, las SD Card usa comunicación SPI y necesita 5 lineas del microcontrolador, luego el DS1307 es I2C, por lo que necesita 2 lineas adicionales y ademas la interface RS232. Veras que SPI y I2C por hardware utilizan los mismos pines, y además la comunicación serial coincide en el pin RC7. Entonces queda definir que comunicación la realizaras mediante hardware y la demás deberás realizarlas por software, que en CCS es muy sencillo pero las velocidades de transmisión máximas cambian.

Por aquí  (http://infopic-suky.blogspot.com/2009/04/buses-de-comunicacion.html)hay unos tutoriales sobre comunicaciones seriales para que veas como debes implementar el hardware.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: jigsaw en 22 de Diciembre de 2009, 00:15:14
OOOOHH q buen tema!!!

Me gustaria poder simularlo en proteus, por casualidad Drod no tienes una imagen del circuito con la sd card y el pic 18f4550 o el archivo. o cualquiera q lea esto lo pueda facilitar porfa.

Ademas preguntar... como corroborar q me ha simulado bien la sd card.

Saludos!!!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: gabriela_jimena en 22 de Diciembre de 2009, 00:59:31
Hola chicos!


Soy novata con respecto a las sd card. Me parece interesante y un muy buen tema. Bueno, queria ver si me podian ayudar con el conexionado de la sd card, un ds1307 y una salida serial (o alguno de ellos XD), utilizando el pic 18f4550. Yo estoy usando el proteus (me lo recomendaron) y programo en pic c (ccs). Una imagen o un archivo .dsn me seria util. :mrgreen:
Ademas cual libreria seria la mas adecuada para usar en una sd card de 1GB (en CCS si se puede chiquillos), dado q veo muchas librerias.

Saludos! :o

La colombianita.

Hay que dedicarse y estudiar un poco el tema, las SD Card usa comunicación SPI y necesita 5 lineas del microcontrolador, luego el DS1307 es I2C, por lo que necesita 2 lineas adicionales y ademas la interface RS232. Veras que SPI y I2C por hardware utilizan los mismos pines, y además la comunicación serial coincide en el pin RC7. Entonces queda definir que comunicación la realizaras mediante hardware y la demás deberás realizarlas por software, que en CCS es muy sencillo pero las velocidades de transmisión máximas cambian.

Por aquí  (http://infopic-suky.blogspot.com/2009/04/buses-de-comunicacion.html)hay unos tutoriales sobre comunicaciones seriales para que veas como debes implementar el hardware.


Saludos!



Muchas gracias suky. Podrias mostrar una imagen de como va la conexion del 18f4550 y la sd card. Segun Drod le dio resultado pero no alcanzo a divisar muy bien el conexionado q hace él con el puerto serial, el pic 18f4550 y la sd card en proteus.

Saludos.

La colombianita!!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Slalen en 22 de Diciembre de 2009, 05:00:39
Aquí lo tienes:
http://www.todopic.com.ar/foros/index.php?topic=28403.msg234353#msg234353
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: KALLITOS en 30 de Diciembre de 2009, 01:29:00
Disculpen muchachos, ando buscando info y jugando un poco, deseo empezar con esto de las MMC pero por el momento en simulacion.

Una consulta, en proteus al igual que a Drod me sale  que no se puede crear o abrir archivo en la tarjeta de memoria, que le puedo cargar para que no me mande ese erroe??

Saludos
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 30 de Diciembre de 2009, 10:33:06
Hola KALLITOS! mmm... primero que nada hay que cargar una imagen *.bin a la MMC, y tiene que tener formato FAT16 para probarla. Luego en la función de inicialización de la memoria hay que comentar cuando se envía el comando para asegurar la desactivación del CRC. (En los primeros post se muestra algo de ello)
Puedes habilitar el debug por RS232 para saber que pasos se van siguiendo y donde esta ocurriendo el problema.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: pepe_2009 en 08 de Enero de 2010, 13:16:34
Muy buen Aporte Suky y Slalen pero no se si pueden subir el diagrama o en su defecto la simulacion en proteus en los ejemplos del Proteus hay un ejemplo por si no lo tienen lo subo:

MSD (http://www.megaupload.com/?d=6FK5GU58)

hay como dice Suky un archivo *.bin que hay que cargar al MMC del proteus luego como sigo???
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: gabriela_jimena en 03 de Febrero de 2010, 02:57:22
Hola Chicos.


  Estaba tratando de simular el programa en proteus de la sd card y no me muestra nada en el virtual terminal.
 Queria ver si me pudieran ayudar, por favor porque llevo tiempo tratando de hacer funcionar el programa y nada.

  Envio la simulacion que hice y el programa en ccs que estoy usando.

(http://xs.to/image-466A_4B690C4A.jpg)

  Por favor diganme si esta mal conectado o el programa tiene alguna falla. Vi en el foro q t funcionaba a ti drod.
 Ademas a la MMC del proteus hay q cargarle un archivo .bin, pero no logro encontrarlo, siendo que se encuentra en la carpeta. Le cargue un archivo .mmc que encontre en otro ejemplo de MMC. (A lo mejor es lo que hace q la simulacion no funcione bien)

 Espero que me puedan ayudar.
 
Se despide.

 La colombianita.
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 03 de Febrero de 2010, 08:58:37
Revisa por aquí, (http://www.todopic.com.ar/foros/index.php?topic=27786.0) se explica paso a paso, como para que veas donde estas fallando.


Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: metacho44 en 28 de Febrero de 2010, 05:04:57
Hola suki he estado trabajando con una microSD de 2 Gb SanDisk (en la simulacion lee , escribe , crea arcrchivos etc..todo ok) (en el montaje  inicia perfectamente pero no lee los datos, el problema se debe a que a la variable "token" debe llegarle un 0xFE pero le esta llegando un 0x00 no entiendo a que se debe esto....quedo en espera de su pronta respuesta .
gracias.
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: rodrigoolguinc en 26 de Septiembre de 2011, 19:02:22
Te adjunto una librería para el manejo de memorias SD a nivel hard, más un ejemplo de como se usaría, prueba si funciona con la microSD  ;-)



Saludos!

Grande Suky,
Con esos drivers logré escribir y leer en la SD... al menos en Proteus funciona.
Muchas gracias
Rod_O
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 26 de Septiembre de 2011, 19:08:38
Hola! Por aquí esta detallado y al final del hilo hay una actualización:

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

Saludos!
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: andresaat en 27 de Septiembre de 2011, 05:00:39
primero que todo muchas gracias por sus aportes, pero tengo una duda, hay alguna diferencia al trabajar con memorias SD y micro SD?
gracias
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: Suky en 27 de Septiembre de 2011, 10:48:38
primero que todo muchas gracias por sus aportes, pero tengo una duda, hay alguna diferencia al trabajar con memorias SD y micro SD?
gracias

No.
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: nano18F en 11 de Marzo de 2015, 17:44:37
Hola, he estado haciendo pruebas con la libreria version 1.5 FAT y 1.0 SDCard_hard de suky y me he encontrado con una limitante, no se pueden crear mas de 512 archivos en una carpeta, el tema es que necesito crear muchos mas que esa cantidad, antes de buscar y probar con una version mas actualizada quisiera saber si es posible crear mas de 512 archivos en una carpeta usando la libreria mas actualizada de suky o modificaciones a esta.

Saludos cordiales,
Título: Re: microSD por puerto SPI del micro 18f4550
Publicado por: jvb57 en 30 de Marzo de 2015, 13:19:55
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 !!!