Grabar datos en microSD con un microcontrolador (SPI)

Hola, Necesito su ayuda. Estoy tratando de realizar un proyecto con un microcontrolador y la idea es almacenar datos de 4 sensores y almacenarlos en una memoria microSD para despues poder visualizarlos en una PC. Lo que pienso hacer es almacenar los datos en un archivo txt.
Mi principal problema es que no sé las cadenas de datos que se tiene que mandar a la microSD. NANO1985 ya ha hecho un tema llamado "Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC16F877A" pero el tema ha sido citado muchas veces y me resulta dificil de entender. Me gustaria saber los comandos que se deben mandar, el orden de ellos y la respuesta de la SD. Les agradesco me puedan ayudar.
Nota: estoy usando una microSD Sandisk 128MB y un microcontrolador freescale (MC9S08QG8) el cual cuanta con 512Bytes de memoria RAM
 
Por ejemplo puedes mirar el controlador de SD de arduino que es código abierto en C, admite SD y SDHC.
La pega es que la documentación oficial de SD no es gratuita ni barata así que tendrás que googlear a ver si pescas algo por ahí.
 
Nota: estoy usando una microSD Sandisk 128MB y un microcontrolador freescale (MC9S08QG8) el cual cuanta con 512Bytes de memoria RAM

Con esa memoria RAM del microcontrolador dudo mucho que puedas hacer algo...mínimo necesitas algo así como 1K de RAM para el protocolo FAT16 y que te quede espacio para una aplicación de usuario.

Por ejemplo puedes mirar el controlador de SD de arduino que es código abierto en C, admite SD y SDHC.

Es una excelente recomendación. Es más ..si el compilador que vos usas para FREESCALE es ANSI C, lo único que tendrías que portar sería la capa de comandos SPI. Para eso necesitas saber como trabaja el puerto SPI de tu microcontrolador.

Saludos !
 
Todavia no entiendo porque necesito 1k de memoria RAM, si me pudiaran a ayudar a entender un poco se loa agradecería.

En cuanto a la comunicacion SPI del micro, ya lo estoy viendo. Puedo migrar a otro Microcontrolador Freescale de 6K de RAM sin problemas

Gracias por sus respuestas
 
Todavia no entiendo porque necesito 1k de memoria RAM, si me pudiaran a ayudar a entender un poco se loa agradecería.

En cuanto a la comunicacion SPI del micro, ya lo estoy viendo. Puedo migrar a otro Microcontrolador Freescale de 6K de RAM sin problemas

Gracias por sus respuestas

Por los buffers generados para manejar los archivos de la SD, el protocolo FAT, etc. Con un Microcontrolador de más memoria RAM, tendrías eso solucionado.

Ahora tenés que comenzar a ver el protocolo con la tarjeta SD a nivel hardware, para esto vas a tener que escribir algunos ejemplos para poder comunicarte con dicha tarjeta.
Entonces comenzá a investigar el puerto SPI de tu microcontrolador y como podés implementar algunas funciones para leer y escribir datos.

Luego de que tengas ese tema solucionado, podrías pasar a diseñar el código para manejar la SD a nivel
hardware y por último implementar el protocolo FAT16 o 32.

Aquí hay una librería funcional para AVR para que la estudies:

http://www.roland-riegel.de/sd-reader/

Y otra para PIC:


http://www.micros-designs.com.ar/libreria-fat16/
 
Ya estoy transmitiendo SPI, configuré dos microcontrolodares, un como maestro y el otro como esclavo. En ambos estoy usando las interrupciones de "Received" osea que me interrumpe cuando se recibe. El maestro envía n valor (contenido en "dato1"), el esclavo lo recibe por medio de interrupcion y lo regresa al maestro y por último el maestro lo recibe por medio de una interrupción y lo mando a un puerto para poder visualizar el dato en Leds. El dato recibido por el maestro está atrazado con respecto a lo que envia, es decir, si el maestro manda un 0x04, recibirá lo que tiene el esclavo y despues el maestro envía un 0x05 ahora recibirá lo que envio la vaz anterior (0x04). En pocas palabras; se está atrazando. Este es mi codigo resumido:

/////Maestro////
En el main del maestro tengo:
while (!SPIS); /* Wait for Tx buffer empty */
SPID = dato1; /* Send byte */ dato1 es unsigned char variable y le cargo n valor a enviar

En la interrupcion del maestro:
while (!SPIS_SPRF); /* Wait for Rx buffer full */
received=SPID; /* Received byte value */

//////Esclavo/////
En la interrupcion del esclavo tengo:
while (!SPIS_SPRF); /* Wait for Rx buffer full */
slavereceived=SPID; /* Received byte value */Guarda lo recibido en la variable "slavereceived"

En el main del esclavo tengo:
while (!SPIS_SPTEF); /* wait until transmit buffer is empty*/
SPID = slavereceived; //El dato recivido se vuelve a mandar al maestro

Su ayuda por favor! Gracias
 
En pocas palabras; se está atrazando. Este es mi codigo resumido:

No entiendo exactamente a lo que te referís.

Con respecto a los micros FREESCALE no los he usado nunca, vas a tener que investigar el tema. Con respecto al SPI ya lo tenés casi solucionado...mejor probá con una memoria SPI tipo 25CL...y posteá los resultados.
 
Atrás
Arriba