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

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

Desconectado Drod

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




 



Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #61 en: 04 de Diciembre de 2009, 14:26:54 »
IC2 no, I2C, jajajaja  :oops:

Desconectado Suky

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

Desconectado Drod

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


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #64 en: 04 de Diciembre de 2009, 15:33:22 »
Perdón, me equivoque de nombre  :D Manteen "stream=SDCard"  ;-)


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

Desconectado Drod

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


Saludos!



Desconectado Suky

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

Desconectado Drod

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


Desconectado Suky

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

Desconectado Drod

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

Desconectado Drod

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

Desconectado Suky

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

Desconectado Suky

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

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!


« Última modificación: 18 de Enero de 2010, 01:20:39 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado tinchosalamero

  • PIC12
  • **
  • Mensajes: 53
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #73 en: 06 de Diciembre de 2009, 17:58:40 »
Excelente trabajo... son aportes realmente importantes, sefuramente los estaremos usando

muchas gracias

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: microSD por puerto SPI del micro 18f4550
« Respuesta #74 en: 07 de Diciembre de 2009, 12:12:48 »
Oh no, me dice que no hay RAM suficiente para las variables!  :shock: