Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC16F877A


       



#1  Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC16F877A
NANO1985

Registrado: 12 Jun 2007
Mensajes: 2
Ubicación: Argentina
citar
Hola! quiero hacer una aporte a toda la comunidad electronica. y de paso poder complementar con otra informacion para lograr que este circuito llegue a la plenitud de su desarrollo. el mismo consta de un microcontrolador PIC16F877A con un oscilador de 20Mhz (luego voy a explicar porque el de 20). un par de resistencias para "ajustar" los niveles de tension que manejan las tarjetas SD,MicroSD y MMC (2.7 a 3.3 v) a los niveles de la lógica TTL de la arquitectura del PIC, las diversas memorias que existen en el mercado, desde el punto de vista técnico, pueden trabajar mediante dos protocolos serie distintos: el protocolo MultiMediaCard propiamente dicho, y el protocolo SPI. El primero de los protocolos es el más potente ya que permite más operaciones que el segundo, pero por otro lado, el segundo es más fácil de implementar si se dispone de una interfaz SPI (en este caso mediante el modulo MSSP interno del pic) y es suficiente para la mayoría de aplicaciones. la tarjeta se comunica mediante Comandos del operador o Controlador, respondiendo en cada caso cada una de las peticiones del mismo. Yo por el momento logré paso a paso lo siguiente:

(1) seleccionar el modulo MSSP del pic para que funcione de modo maestro,. se utilizan para configurarlo solo 2 registros principales el SSPSTAT y el SSPCON1.
(2) mediante el 2 registro se selecciona el clock del modulo SPI, son 4 posibilidades distintas de frecuencias,. 1- Fosc/64 \\\ 2-Fosc/16 \\\ 3-Fosc/4 \\\ 4- Fosc=timer2/2
(3) en este caso tenemos que utilizar indefectiblemente un cristal de 20Mhz para que al seleccionar el divisor de frecuencia de clock a 64 (opcion1 item anterior) logremos obtener una frecuencia de clock de aproximadamente 312Khz. (frecuencia necesaria para inicializar la memoria).
(4) luego debemos setear el tipo de polaridad del clock, momento en quese va a muestrear la entrada y . haciendo CKP=1 CKE=0 SDI(SMP)=0 .(son bits de los registros nombrados anteriormente)
(5) finalmente ya hemos inicializado el modulo del micro activandolo poniendo a "1" el bit SSPEN

ahora sigue la secuencia de pasos inalterables:

los pasos muy precisos y específicos. cada comando entrega una respuesta de parte de la tarjeta.
a continuacion se detalla la cadena de cada comando a enviar y que se debe esperar de parte de la tarjeta.

CMD0--- cadena a enviar: 0x40,0x00,0x00,0x00,0x00,0x95 esperar respuesta: 0x01 (significa tarjeta en modo idle).
CMD41--- cadena a enviar: 0x41,0x00,0x00,0x00,0x00, 0xXX. Como la tarjeta ya esta en modo SPI el CRC (0xXX) puede tomar cualquier valor. se aconseja cargarle 0xFF. esperar respuesta 0x00 (significa tarjeta lista! )
CMD55--- ESTE COMANDO NO ES UTILIZA PARA TARJETAS KINGSTON. SI TU TARJETA NO ES DE ESTA MARCA DEBERÁS ENVIARLE ESTE COMANDO. cadena a enviar: 0x77,0x00,0x00,0x00,0x00, 0xXX Y ESPERAR UN 0X00 DE RESPUESTA.
CMD58--- este comando es muy importante ya que se le "pregunta" a la tarjeta si está posibilitada a funcionar con una tension de alimentacion de 3.3v. cadena a enviar 0x7A,0x00,0x00,0x00,0x00, 0xXX. esperar respuesta 0x00 (significa que todo va OK!)

luego de haber terminado la inicializacion, la tarjeta ya estla lista para realizar operaciones de lecto-escritura. pero lamentablemente acá se me recomplicó la cuestión. hace una semana que estoy intentando escribirle algo y se vé que algun moco me estoy mandando o saltié algun paso,.porque no me responde nada cuando peticiono la escritura mediante el comando 24. nosé la verdad. voy a seguir intentando,. y si hay progreso voy a seguir publicando más info.

si alguien está interesado en este proyecto no duden en intentar. por cualquier duda de hard o soft comunicate conmigo

vamos! vamos! pongansé las pilas e investiguen en este tema! que está muy GROSSOOOO!

(tengo mucha información al respecto como para compartir sin problema)

acá encontré un manual muy bueno de MMC y SD . la verdad que está muy completo e interesante como para que empiecen a meter mano en esto. se los posteo acá .

http://www.cs.ucr.edu/~amitra/sdcard/

#2  
Enochara

Registrado: 18 Jun 2007
Mensajes: 3
Ubicación: México
citar
Qué tal. No sé de estas tarjetas pero ví un artículo en el #218 la revista española Resistor, mencionando al pic16f876 para esta interfaz. ¿Lo has visto?
Salu2

#3  
fitocondria

Registrado: 09 Jun 2007
Mensajes: 44
Ubicación: Tabasco y Veracruz. Mexico
citar
yo lo vi en la revista y me estaba animando a hacerlo pero no encontré los socket para las tarjetas sd, me dan ganas de comprar un lector y desarmarlo para quitarle el socket, pero no he tenido tiempo por la tesis, pero si me interesa mucho ese aspecto ya que quiero almacenar ahí mucha información estadística, presión, humedad, velocidad del viento, temperatura, frecuencia de apertura de válvulas, conteo de litros por día, etc. aparte de que están baratas las memorias sd de 2 gb.

#4  LECTO-GRABADOR de tarjetas MMC , SD, MicroSD con pic 16F877A
NANO1985

Registrado: 12 Jun 2007
Mensajes: 2
Ubicación: Argentina
citar
hola!! muchachos..... vamos anímense!!!!... ya logré leerla y escribirla..... pero tengo una par de problemas menores... que se pueden solucionar.... acá les paso un par de fotos como para que se den una idea de que si no consiguen el socket o para evitarse romper un lector,.... yo compré una memoria Micro SD que viene con su respectivo adaptador,... a el le soldé los cables y me quedé un socket casero bastante bueno,...jaja Smile asi que pongansé las pilas muchachos y sigan con este tema.



Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#5  
jjfonsecaz

Registrado: 23 May 2007
Mensajes: 29
Ubicación: Mexico
citar
Hola Nano1985.

Me interesa mucho tu proyecto, ya que puedes almacenar una infinidad de cosas en este tipo de memorias, voy a empesar por conseguirme el adaptador que conseguiste y la memoria, con una de 128 megas me basta; pero precisamente a eso va enfocado mi pregunta, cual es el limite de almacenamiento con el que te haz enfrentado, ya que encontre un articulo de una tesis donde mencionaba que solo podia usar hasta la memoria de 128 megas.

Otra situacion, en el articulo que medio revise (no lo lei en su totalidad) menciona que algunos pines de la SD es necesario conectarlos a VCC por medio de una resistencia en este caso vi que los voltajes que maneja la SD son de aprox. 3.3 volts o menos. como estableciste el valor de estas resistencias de polarizacion.

#6  
ELIUSM

Registrado: 18 Jul 2007
Mensajes: 120
Ubicación: Chile
citar
Hoola!
Uuuy! Que interesante. Yo había intentado hacer eso antes, pero me bajé un Datasheet sobre la memoria MMC, o sea, en verdad un manual (93 pags), pero que parecía Datasheet, e intentar usarlas con un PIC, tratando de entender crudamente desde ese manual, pero me desmotivé al ver que no iba a tener tiempo para eso... pero me parece que estos documentos son bastante más aclaratorios. Pero con esto... yapo! A moverse!

(sorry por el nulo aporte Smile )
Saludos!

#7  
Gilbert

Registrado: 28 Jul 2007
Mensajes: 1
Ubicación: venezuela
citar
Hola estoy interesado en realizar el lecto-grabador de la memoria. He logrado inicializar la memoria sd, y he enviado los comandos y la memoria me responde correctamente pero cuando envio los bytes a grabar en la memoria, la misma no me respionde con el byte de respuesta. Aqui te envio mi programa. Les agradeceria su ayuda. El programador que estoy utilizando es el CCS



#if defined(__PCM__)
#include <16F877.h> /* tipo de PIC */
#use delay(clock=20000000) /* reloj de 20 MHz */


int8 i;
int8 data_in;

void main()
{
set_tris_c(0x10);
output_bit(PIN_C0,1);
setup_spi(spi_master |spi_l_to_h|spi_clk_div_64);

for(i=0;i<10;i++)
{
spi_write(0xFF);
}

output_bit(PIN_C0, 0); /* Activacion de la SD */


/* Envia a la SD el comando 0 */

while(data_in!=1)

{
spi_write(0x40) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x95) ;

for(i=0;i<64;i++)
{
spi_write(0xFF);
data_in = spi_read();

if(data_in==0x01)
{
break;
}
}
}
output_bit(PIN_C0,1); /* Desactivacion de la SD */
spi_write(0xFF);
output_d(0x01);
delay_ms(1000);



output_bit(PIN_C0, 0); /* Activacion de la SD */


/* Envia a la SD el comando 1 */

while(data_in!=0)

{
spi_write(0x41) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0xFF) ;

for(i=0;i<64;i++)
{
spi_write(0xFF);
data_in = spi_read();

if(data_in==0x00)
{
break;
}
}
}
output_bit(PIN_C0,1); /* Desactivacion de la SD */
spi_write(0xFF);
output_d(0x02);
delay_ms(1000);




output_bit(PIN_C0, 0); /* Activacion de la SD */


/* Envia a la SD el comando 16 */

while(data_in!=0)

{
spi_write(0x50) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x02) ;
spi_write(0x00) ;
spi_write(0xFF) ;

for(i=0;i<64;i++)
{
spi_write(0xFF);
data_in = spi_read();

if(data_in==0x00)
{
break;
}
}
}
output_bit(PIN_C0,1); /* Desactivacion de la SD */
spi_write(0xFF);
output_d(0x04);
delay_ms(1000);


/* Envia a la SD el comando 24 para escribirla */


output_bit(PIN_C0, 0); /* Activacion de la SD */


while(data_in!=0x05)

{

while(data_in!=0x00)

{

spi_write(0x58) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0x00) ;
spi_write(0xFF) ;

for(i=0;i<64;i++)
{
spi_write(0xFF);
data_in = spi_read();

if(data_in==0x00)
{
break;
}
}
}

output_d(0x08);

spi_write(0xFF) ;
spi_write(0xFF) ;
spi_write(0xFE) ;

for(i=0;i<512;i++)
{
spi_write(0xAA);
}

spi_write(0xFF) ;
spi_write(0xFF) ;
spi_write(0xFF) ;

data_in = spi_read();

data_in = (data_in && 0x0F);


if(data_in==0x05)
{
break;
}

}

while(data_in!=0xFF)
{
spi_write(0xFF) ;
data_in = spi_read();
}

output_bit(PIN_C0,1); /* Desactivacion de la SD */
spi_write(0xFF);
output_d(0x10);
delay_ms(1000);

}

#8  
angel1984

Registrado: 03 Ago 2007
Mensajes: 1
Ubicación: Peru
citar
Hola Gilbert revise tu programa y creo que el problema que tienes, es cuando envias el comando de escritura tienes que esperar 3 bytes de repuesta de la memoria, en tu caso solo es una , y por eso no hay respuesta de confirmacion.
http://www.tolaemon.com/otros/mmcard.htm

#9  Interesante
cerinalf

Registrado: 13 Ago 2007
Mensajes: 4
Ubicación: Bogota, Colombia
citar
Hola a todos. Tan interesante me parecio este proyecto, que estoy en la tarea de onstruirlo con un PIC 18F2550, pero a decir verdad no es que tenga mucha experiencia en el manejo de PIC's.
Agradeceria toda la informacion que pudieran publicar ya que es un proyeco que me atrae bastante. Te recomiendo NANO
Gracias.

#10  pic->SD
marcosbrusa

Registrado: 06 Ago 2007
Mensajes: 10
Ubicación: Argentina
citar
Hola yo estoy en la misma. No puedo escribir mi tarjeta sd. Necesito alguien me ayude con los comandos y la implementacion en C.

 Responder



Google
 


 Temas de interés 
No hay mensajes nuevos enviar mensajes de texto sin usar el teclado del celular.
No hay mensajes nuevos Enviar video en vivo por internet
No hay mensajes nuevos Enviar comandos por RS232 en visual basic
No hay mensajes nuevos Enviar comunicacion via RS232 a servidor
No hay mensajes nuevos Contador de pulsos unido al microcontrolador DLP-245PB

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||