Autor Tema: Pic 32mx y micro sd SPI  (Leído 4436 veces)

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

Desconectado sokar

  • PIC10
  • *
  • Mensajes: 5
Pic 32mx y micro sd SPI
« en: 30 de Julio de 2013, 11:17:08 »
Hola soy nuevo en el foro.
Estoy tratando de leer y escribir una microSD mediante SPI. A mi parecer la inicialización esta correcta pero cuando intento leer o escribir en ella esto no funciona.
por ejemplo.. me responde al comando leer pero quedo esperando el token FE y nunca llega. en el tema de escritura me envia el byte de confirmación pero cuando reviso la memoria con el software Winhex no se encuentra grabada. estoy programando en lenguaje C con compilador Hi-tech.
Espero puedan orientarme en esto. Saludos

Desconectado sokar

  • PIC10
  • *
  • Mensajes: 5
inicialización
« Respuesta #1 en: 30 de Julio de 2013, 11:17:54 »
Código: C++
  1. #define clockSPI()       comunicaSpi3( 0xFF)
  2. #define readSPI()    comunicaSpi3( 0xFF)
  3. #define disableSD()  SDCS = 1
  4. #define enableSD()   SDCS = 0
  5. #define SD_COMMAND_TIMEOUT 300
  6.  
  7.  
  8. void sd_init(void){
  9.  
  10.         unsigned long h;
  11.         unsigned long i;
  12.         unsigned long f;
  13.         unsigned char bk[40];
  14.         unsigned char respuesta1=0x00;
  15.         unsigned char respuesta2=0x00;
  16.         unsigned char respuesta3=0x00;
  17.         unsigned char respuesta4=0x00;
  18.  
  19.         TRIS_SDCS=0;            //CS salida    
  20.         disableSD();
  21.         for(h=0;h<10000;h++);
  22.         SettingSpi3(200);      
  23.  
  24. //envio 80 pulsos
  25.         for ( i=0; i<10; i++){
  26.                                                         clockSPI();
  27.         }
  28.         enableSD();
  29.  
  30.         cmd(0);
  31.  
  32.         for( f=0; f<SD_COMMAND_TIMEOUT ; f++)
  33.         {
  34.                 respuesta1 = comunicaSpi3( 0xFF );
  35.                 if (respuesta1==0x01)
  36.                                                         {
  37.                                                         sprintf((char*)bk,"memoria reset: %02X",respuesta1);
  38.                                                 escribe_lcd1602((char*)bk,1);
  39.                                                         break;
  40.                 }
  41.         }
  42.  
  43.     clockSPI();
  44.     clockSPI();
  45.  
  46. //Comando 8
  47. // envia paquete de comandos (6 bytes)
  48.  
  49.    comunicaSpi3(8 |0x40 );      // envio el comando
  50.    comunicaSpi3( 0 );
  51.    comunicaSpi3( 0 );
  52.    comunicaSpi3( 0x01 );        // ocupo 3,3v
  53.    comunicaSpi3( 0xAA );        // chk
  54.    comunicaSpi3( 0x87 );        // crc
  55.        
  56.         for( f=0; f<SD_COMMAND_TIMEOUT ; f++)
  57.         {
  58.                 respuesta2 = comunicaSpi3( 0xFF );
  59.                 if (respuesta2==0x01)
  60.                                                         {
  61.                                                         sprintf((char*)bk,"    es v2 : %02X",respuesta2);
  62.                                                 escribe_lcd1602((char*)bk,2);
  63.                                                 clockSPI();
  64.                                                 clockSPI();    
  65.                                                         clockSPI();
  66.                                                 clockSPI();
  67.                                                         break;
  68.                 }
  69.         }
  70.  
  71. hasta:
  72. //Comando ACMD41
  73.         cmd(55);
  74.  
  75.    for( i=0; i<SD_COMMAND_TIMEOUT ; i++)
  76.    {
  77.       respuesta3 = comunicaSpi3( 0xFF );
  78.       if (respuesta3==0x01)
  79.                      {
  80.                      clockSPI();
  81.                      escribe_lcd1602("Responde cmd55  ",2);
  82.                      break;
  83.       }
  84.    }
  85.  
  86.     clockSPI();
  87.     clockSPI();
  88.  
  89.         cmd(1);
  90.    
  91.    for( i=0; i<SD_COMMAND_TIMEOUT ; i++)
  92.    {
  93.       respuesta3 = comunicaSpi3( 0xFF );
  94.       if (respuesta3==0x00)
  95.                      {
  96.                      escribe_lcd1602("SPI Inicializado ",1);
  97.                      break;
  98.       }
  99.    }
  100.  
  101.    if (respuesta3!=0x00)
  102.                   {
  103.                   escribe_lcd1602("Inicializando...   ",1);
  104.                                   goto hasta;
  105.    }
  106.  
  107.  
  108.         clockSPI();
  109.         clockSPI();
  110.  
  111.         //Comando 16
  112.         comunicaSpi3(16|0x40 );    
  113.         comunicaSpi3( 0 );
  114.         comunicaSpi3( 0 );
  115.         comunicaSpi3( 0x02 );            //512 byte        
  116.         comunicaSpi3( 0 );        
  117.         comunicaSpi3( 0xFF );        // crc
  118.  
  119.         for( i=0; i<SD_COMMAND_TIMEOUT ; i++)
  120.         {
  121.         respuesta4 = comunicaSpi3( 0xFF );
  122.         if (respuesta4==0x00)
  123.                                                 {
  124.                                                 escribe_lcd1602("  Formato 512 ",2);
  125.                                                 break;
  126.                 }
  127.         }
  128.  
  129.     clockSPI();
  130.     clockSPI();
  131.     disableSD();
  132.     clockSPI();
  133.     clockSPI();
  134.                        
  135. }//sd_init()
« Última modificación: 30 de Julio de 2013, 11:24:13 por sokar »

Desconectado sokar

  • PIC10
  • *
  • Mensajes: 5
Leer
« Respuesta #2 en: 30 de Julio de 2013, 11:27:40 »
Código: C++
  1. void sd_leer(void){
  2.  
  3.         unsigned char bk[40];
  4.         unsigned char res[40];
  5.         unsigned long i;
  6.         unsigned long h;
  7.         unsigned long f;
  8.         unsigned char respuesta1;
  9.         unsigned char respuesta2;
  10.         unsigned long counter;
  11.  
  12.         SettingSpi3(2);
  13.         enableSD();
  14.     clockSPI();
  15.     clockSPI();
  16.  
  17.         // COMANDO 17********************      
  18.         comunicaSpi3( 17|0x40);    
  19.         comunicaSpi3( 0x00 );
  20.         comunicaSpi3( 0x01 );           //sector 9
  21.         comunicaSpi3( 0x20 );           //(9+135)*512 en hexa      
  22.         comunicaSpi3( 0x00 );      
  23.         comunicaSpi3( 0xFF );       // crc
  24.         //********************************
  25.  
  26.         for( f=0; f<300 ; f++)
  27.         {
  28.         respuesta1 = comunicaSpi3( 0xFF );
  29.         if (respuesta1==0x00)
  30.                                                 {
  31.                                                 sprintf((char*)bk,"responde a leer : %02X     ",respuesta1);
  32.                                         escribe_lcd1602((char*)bk,1);  
  33.                                                 break;
  34.         }
  35.         if (respuesta1!=0x00)
  36.                                                 {
  37.                                                 sprintf((char*)bk,"NO resp: %02X %02d         ",respuesta1, f);
  38.                                         escribe_lcd1602((char*)bk,1);  
  39.         }
  40.         }//sector a leer
  41.  
  42.  
  43. // esperar el token------
  44.  
  45.         for( f=0; f<1000000 ; f++)
  46.         {
  47.         respuesta2 = comunicaSpi3( 0xFF );
  48.  
  49.         if (respuesta2!=0xFF)
  50.                                                 {
  51.                                                 sprintf((char*)bk,"token: %02X          ",respuesta2);
  52.                                         escribe_lcd1602((char*)bk,2);  
  53.                                                 break;
  54.         }
  55.         if (respuesta2==0xFF){
  56.                                                 sprintf((char*)bk,"NO token: %02X %02d   ",respuesta2,f);
  57.                                         escribe_lcd1602((char*)bk,2);
  58.         }
  59.         }//token
  60.  
  61.  
  62. //muestra 6 primeros bytes en display
  63.        
  64.         for ( i=0; i<10; i++){
  65.         res[i]=comunicaSpi3( 0xFF );
  66.         }
  67.  
  68.         sprintf((char*)bk,"%02X %02X %02X %02X %02X %02X   ",res[1],res[2],res[3],res[4],res[5],res[6]);
  69.     escribe_lcd1602((char*)bk,2);      
  70.  
  71. }// sd_leer

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Pic 32mx y micro sd SPI
« Respuesta #3 en: 30 de Julio de 2013, 11:55:05 »


¿ Porque no utilizas las librerías MDD FileSystem de Microchip ?
Yo las uso en un bootloader con un PIC32MX460, y me van perfectas, te montan un volumen FAT o FAT32 sobre una tarjeta SD y te permite ver el directorio de archivos, crear, borrar, leer, escribir y actualizar, todo de manera sencilla y cómoda.



Desconectado sokar

  • PIC10
  • *
  • Mensajes: 5
Re: Pic 32mx y micro sd SPI
« Respuesta #4 en: 30 de Julio de 2013, 12:03:10 »
Esta libreria esta para CCS o no?? Tendría que estudiarla.... Este trabajo es imperativo realizarlo con Hi-tech.
he leido varios foros y datasheet pero no se donde esta mi problema....

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Pic 32mx y micro sd SPI
« Respuesta #5 en: 30 de Julio de 2013, 12:40:08 »
Esta libreria esta para CCS o no??

C32
Puedes bajarte los fuentes y tratar de adecuarlos, o al menos estudiar como gestionan la tarjeta.


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pic 32mx y micro sd SPI
« Respuesta #6 en: 30 de Julio de 2013, 20:11:52 »
+1 Te conviene utilizar las librerías de Microchip, esta para C18, C30, C32 y Hi-tech.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado sokar

  • PIC10
  • *
  • Mensajes: 5
Re: Pic 32mx y micro sd SPI
« Respuesta #7 en: 30 de Julio de 2013, 22:17:31 »

Hola suky me encantaria usarlas pero no tengo idea donde encontrarlas.  Por eso empece desde cero. Si sabes el link te lo agradeceria mucho.
Saludos