Autor Tema: microSD por puerto SPI del micro 18f4550  (Leído 47681 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado therionx

  • PIC10
  • *
  • Mensajes: 10
microSD por puerto SPI del micro 18f4550
« 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #1 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #2 en: 17 de Noviembre de 2009, 05:15:22 »
Suky, para qué lenguaje son las librerías??

Muchas gracias por el aporte XD

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #3 en: 17 de Noviembre de 2009, 05:17:08 »
Creo que me auto-respondo, CCS no??

Genial XD
« Última modificación: 17 de Noviembre de 2009, 05:40:25 por Slalen »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #4 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #5 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é...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #6 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #7 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...

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #8 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......

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #9 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #10 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!!!

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #11 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....

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #12 en: 18 de Noviembre de 2009, 07:37:29 »
por cierto, el error que me da es Card Init Comm Failure

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #13 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #14 en: 18 de Noviembre de 2009, 11:16:38 »
Con esta modificación me dice "Card Init Time Out"  :(

Esto es cosa de meigas...


 

anything