Autor Tema: MMC en modo SPI y funcionamiento de la RAM  (Leído 2349 veces)

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

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
MMC en modo SPI y funcionamiento de la RAM
« en: 29 de Noviembre de 2005, 15:59:00 »
Hola amig@s! Giño

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=21721

Y 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"Giño;
/// same as "MMCTESTPICFILESPIC.TXT"
///////////////////////////////////////////////////////////////////////


strcpy(fname,"CONFIG.TXT"Giño;
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 Enfurruñado

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... Flash

Un saludo a tod@s Sonrisa
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado tougteno

  • PIC10
  • *
  • Mensajes: 31
RE: MMC en modo SPI y funcionamiento de la RAM
« Respuesta #1 en: 19 de Diciembre de 2005, 15:25:00 »
Hola! yo tambien estoy intentando leer, pero sobretodo, escribir este tipo de memorias.
>Estuve buscando sobre la libreria que posteaste de CCS. Te mando lo poco que encontrè con la negligencia de no haber revisado la informaciòn.

Es un archivo que se llama fat16.zip, podria subirlo pero pongo directamente el link ya que hay algunos comuntarios mas.

Espero que te sirva.
http://www.pic-mikrocontroller.de/picforum/viewtopic.php?t=1585&view=next&sid=eacf56cbbe664c12ae4dd7e7e85faa39

Saludos.
Mariano
 




Desconectado Ankarius

  • PIC12
  • **
  • Mensajes: 71
RE: MMC en modo SPI y funcionamiento de la RAM
« Respuesta #2 en: 19 de Diciembre de 2005, 17:02:00 »

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: MMC en modo SPI y funcionamiento de la RAM
« Respuesta #3 en: 19 de Diciembre de 2005, 17:18:00 »
Gracias por contestar.

El driver que pone tougteno es justamente el que puse yo en el enlace de mi primer post Giño
Aunque al final nisiquiera lo he utilizado.

Yo ya conseguí leer y escribir bloques de 512 bytes, despues de muchos dolores de cabeza... Ardiendo

Finalmente utilicé este driver:

http://www.microchipc.com/sourcecode/#mmc

Aunque realicé alguna modificación, ese driver me ayudó mucho.

Primero de todo hay que asegurarse de que el hardware funciona, y lo mejor es primero de nada probar con un pic LF al mismo voltaje que la MMC 3,3V , poniendo resistencias de pull-up de 100K en las líneas Din y Dout.
Yo hice eso, pero no conseguí hacer funcionar del todo el SPI por hardware del pic.
Cuando el pic enviaba un comando, la tarjeta respondía, pero el pic se quedaba igual, como si nada. Al final decidí hacerme un SPI por software compatible con las funciones para el hardware. Así sí lo hice funcionar.
Primero de todo prueba que consigues inicializar la tarjeta en modo SPI con mmc_init() , luego prueba a leer un sector completo con mmc_read_block.
Te aconsejo que utilices el programa WinHEX, es casi imprescindible para hacer pruebas, ya que te permite analizar un disco a nivel de bytes, en tu caso la MMC.
Así podrás comparar lo que lee el pic con lo que hay realmente en la dirección de memoria que quieres leer.
Si quieres intenta esto y ya me cuentas Giño

Por cierto, Ankarius, ese driver tiene muuuy buena pinta Sonrisa Gigante


Un saludo
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: MMC en modo SPI y funcionamiento de la RAM
« Respuesta #4 en: 20 de Diciembre de 2005, 03:46:00 »
Ankarius gracias por la libreria de LLC, las he estado buscando durante un tiempo Muchas risas

gracias!!

Desconectado tougteno

  • PIC10
  • *
  • Mensajes: 31
RE: MMC en modo SPI y funcionamiento de la RAM
« Respuesta #5 en: 20 de Diciembre de 2005, 13:46:00 »
E_coach, que bueno que lo hayas logradoRebotado . El driver que usaste lo descartè hace un tiempo porque no trabajaba con FAT16, igualmente ¿probaste leer la tarjeta con un lector desde la PC? Tengo entendido que si no le das ese formato no podes hacerlo.
Saludos.

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: MMC en modo SPI y funcionamiento de la RAM
« Respuesta #6 en: 20 de Diciembre de 2005, 17:03:00 »
Te cuento...

Lo primero que hice fué crearme desde windows un fichero "PRUEBA.TXT" y escribir dentro "Hola".
Entonces con el WinHEX localicé el sector donde estaba ese texto y procedí a leerla con ese mismo driver, que como digo he hecho unos pequeños cambios, y mostraba los 4 primeros bytes por el lcd, y efectivamente esos bytes eran "Hola".
Despues probé a cambiar desde el pic lo que había escrito, pero solo 4 carácteres que son los que habían. Entonces leí primero el sector completo y luego escribí en los 4 primeros bytes "Juan" y escribí el sector completo con los 4 primeros bytes modificados.
Luego con un lector de tarjetas, desde el explorador de windows, abro el fichero "PRUEBA.TXT" y pone "Juan".

Y una vez conseguí esto, me cree unas funciones para abrir un fichero, leer y escribir en FAT16. Aunque no es funcional al 100%, para lo que yo necesitaba es suficiente.

Primero intenta lo que explico al principio, y luego te echo una mano con lo de la FAT16 Giño

Y también sería buena idea echarle un ojo a la librería que colgó el compañero Ankarius, porque tiene muy buena pinta, y quizá te ahorre trabajo. Yo estuve mucho tiempo buscandola por todos lados pero nada.
Pero como te dije, paso a paso, y asegurate que funciona lo más básico para luego probar cosas más complicadas  RollEyes


Un saludo y suerte Navidad
"Hazlo o no lo hagas, pero nunca lo intentes"