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

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #45 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. }
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 #46 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 :?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #47 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!
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 #48 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:

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #49 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???????

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #50 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?



Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #51 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.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #52 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!
« Última modificación: 03 de Diciembre de 2009, 16:23:12 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #53 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?





Desconectado Suky

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

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #55 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 :?

Desconectado Suky

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

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #57 en: 04 de Diciembre de 2009, 14:01:52 »
SIIIIIIII!!!!! jajajaja!!!!!!!!!  :-/

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



Desconectado Suky

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

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #59 en: 04 de Diciembre de 2009, 14:15:11 »
DIOOOOOOOOOOOOS!  :mrgreen: Que bueno!