Hola amig@s!
Estoy trabajando con una tarjeta de memoria MMC ( Multimedia Card ) de 32MB.
La interfaz entre el PIC y la MMC se hace mediante el bus SPI.
Para esto hay que inicializar la MMC para que trabaje en modo SPI, ya que esta tarjeta de memoria tiene dos modos de funcionamiento: Multimedia Card (por defecto) y SPI.
Estoy utilizando un 18LF2520, trabajando con el PIC y la MMC a 3,3V , y tengo dos resistencias de pull-up de 100k en las líneas SDI y SDO.
En el foro oficial del CCS postearon un driver para acceder a la MMC en el sistema de archivos FAT16. Se supone que con este driver se puede abrir un fichero y leer y escribir en el.
Mi problema principal es que no consigo nisiquiera inicializar la MMC en modo SPI, y no se si es problema del bus o del código. Lo más seguro es que sea problema del bus, ya que hay otras personas que han probado el driver y si que han conseguido leer los datos de un fichero, pero de que parte del bus?, fisica o de configuración?
Mi experiencia con este tipo de bus es nula, así que no se ya por donde tirar...
Aquí os dejo el enlace del driver para acceder a una MMC en sistema de archivos FAT16:
http://www.ccsinfo.com/forum/viewtopic.php?t=21721Y aquí el programilla de prueba que estoy utilizando:
Codigo:
#include <18F2520.h>
#DEVICE *=16 // CCSICD=TRUE
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#use delay(clock=20000000)
#USE FAST_IO(C)
#DEFINE _CS PIN_C2
#DEFINE MAX_FILES 2 /// max number of open files
#DEFINE MMC_BUFF_SIZE 32 /// 32 for PCM
#include<mmcdos.c>
void main( void )
{
int r1,i,j,error,error0,error1;
int16 rec_no;
int16 index,rec_size;
int32 offset;
char fname[32],buff0[MMC_BUFF_SIZE+1],buff1[MMC_BUFF_SIZE+1];
char c;
setup_adc_ports(NO_ANALOGS);
/// MMC Setup
set_tris_c(0b11010010); // CS=rc2(pin13)-0, sck=rc3(pin14)-0, sdi=rc4(pin15)-1, sdo=rc5(pin16)-0
output_high(_CS);
/// init SPI interface
output_high(PIN_C0); // En estas cuatro líneas enciendo por el pin C0 un led durante 5 segundos
delay_ms(5000); // Y luego permanece apagado durante 2 segundos antes de que empiece la
output_low(PIN_C0); // inicialización
delay_ms(2000); //
// Note code below was needed before SPI_XMIT_LTO_H was available
// SETUP_SPI(SPI_MASTER | SPI_CLK_DIV_16 | SPI_L_TO_H );
// CKE=0;
// CKP=1;
// SMP=0;
SETUP_SPI(SPI_MASTER | SPI_CLK_DIV_16 | SPI_H_TO_L |SPI_XMIT_L_TO_H );
/// transmit on rising edge and sample receive on the rising edge
/// of the clock
/// idle clock is high
buff0[MMC_BUFF_SIZE]=0;
buff1[MMC_BUFF_SIZE]=0;
rec_no=0;
///////// init MMC ////////////////////////////////////////
error=init_MMC(10);
if (error>0) { // Si no se obtiene un nº positivo de init_MMC esque no se
goto mmc_exit; // inicializó correctamente en modo SPI
}
output_high(PIN_C0); // Si se ha inicializado correctamente la MMC el led se encendería
delay_ms(5000); // durante 5 segundos, igual que al inicio del programa
output_low(PIN_C0); //
delay_ms(2000); //
rec_size=MMC_BUFF_SIZE;
//////////////////////////////////////////////////////////////////////
// note is a special char in CCS so we use \ to get a single (0x5C)
//strcpy(fname,"MMCTEST\PICFILES\PIC.TXT"
/// same as "MMCTESTPICFILESPIC.TXT"
///////////////////////////////////////////////////////////////////////
strcpy(fname,"CONFIG.TXT"
rec_size=MMC_BUFF_SIZE;
error0=open_file(0,fname,rec_size);
if (error0>0) { // Si no se obtiene un nº positivo de open_file esque no se
goto mmc_exit; // pudo abrir el archivo indicado
}
output_high(PIN_C0); // Si se ha abierto correctamente el archivo indicado el led se encendería
delay_ms(5000); // durante 5 segundos, igual que antes
output_low(PIN_C0); //
delay_ms(2000); //
do { // Una vez abierto el archivo deseado, se van leyendo los datos byte a byte
error0=file_read(0,buff0); // hasta que se encuentre el final del archivo
if (error0>0 && error0<255 ) {
break;
}
//printf("%s",buff0);
rec_no++;
} while (error0==0);
mmc_exit: // Aquí vendrá el programa cada vez que haya un error en las operaciones anteriores
while(1)
{
output_high(PIN_C0); //Si hay un error el led se encenderá y se apagará constantemente
delay_ms(600);
output_low(PIN_C0);
delay_ms(600);
}
}
He de comentar que tuve que modificar el driver para trabajar sin el puerto serie, eliminando todos los puts y printf del driver "mmcdos.c".
Pues cuando pruebo no consigo ni pasar del init_MMC, como si no hubiera tarjeta
También he leído que dependiendo de la cantidad de RAM que tenga el PIC hay que utilizar una memoria externa para almacenar lo que se lee de la MMC.
Si mi PIC tiene suficiente RAM, como almaceno datos en la RAM?
¿O esque las propias variables que se encuentran activas mientras el PIC está alimentado permanecen en la RAM?
Bueno, después del rollo que os he soltado solo me queda pedir cualquier tipo de ayuda, ya sea referente al bus SPI o si alguien ha trabajado con este tipo de memorias.
Espero que este post ayude a mucha gente que como yo anda perdida...
Un saludo a tod@s