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


       



#11  
marcosbrusa

Registrado: 06 Ago 2007
Mensajes: 10
Ubicación: Argentina
citar
Hola. Tengo serios problemas para escribir una tarjeta SD. Me podrias guiar con los pasos a seguir.
Aca muestro parte del codigo
//*******************************
int SD_Escribir_Bloque(){ //Escribe en la memoria un bloque de datos de 512 Bytes

long i;
CS=0;
Command(0x58,0,0,0X02,0X00,0xFF); // 200H = 512
// Command(0x58,0,0,0X02,0X00,0x01); // SEGUN UTN
if((SD_response(0x00))==1) return 1;
if((SD_response(0x00))==1) return 2;
if((SD_response(0x00))==1) return 2;
for (i=0;i<10;i++);
SPI(0xFE); // Envio el data token

for(i=0;i<512;i++) SPI(dato[i]); // Envio los datos
SPI(0xFF);
SPI(0xFF);

if((SPI(0xFF)&0x0F)!=0x05) return 2;
CS = 1;

return 0;
}

#12  
marcosbrusa

Registrado: 06 Ago 2007
Mensajes: 10
Ubicación: Argentina
citar
Esta muy bueno, a veces se complica

#13  cadenas de comandos
cerinalf

Registrado: 13 Ago 2007
Mensajes: 4
Ubicación: Bogota, Colombia
citar
Hola. Quisiera saber quie me puede informar acerca de las cadenas de comandos que el pic transmite a la sd, es decir los cmd. Donde averiguo que cadenas de datos es cada instruccion??? Gracias

#14  
marcosbrusa

Registrado: 06 Ago 2007
Mensajes: 10
Ubicación: Argentina
citar
Estoy en eso... pruebo las secuencias pero no puedo escribir la tarjeta. No estoy seguro de que sea como lo hago acá te doy unas cosas. Avisame si conseguis algo mas.

#15  
ELIUSM

Registrado: 18 Jul 2007
Mensajes: 132
Ubicación: Chile
citar
Hola! Les tengo esta otra cosa que viene de la marca Olimex (en verdad es de otra marca, no sé cuál), pero trae algunos archivos C (firmware) que creo que contienen incluso el código para hacer el sistema FAT16 en estas tarjetas SD. Cuando se metan al link vean abajola documentación que hay para bajar.

Les dejo el Link:

http://www.olimex.cl/product_info.php?cPath=55&products_id=307

Diviértanse, (yo no sé C, es hora que lo aprenda).

#16  
marcosbrusa

Registrado: 06 Ago 2007
Mensajes: 10
Ubicación: Argentina
citar
Ahi lo hice andar. Ahora estoy viendo lo de fat 16 pero la leí con comunicacion serie y la grabe bien. CUALQUIER AYUDA QUE NECESITEN AVISEN. Aca mando los pasitos pero despues deescribir hay que esperar una sola respuesta.
Bloques de datos MODO SPI
Los bloques de datos comienzan siempre con el byte 0xFE, a este le siguen los bytes de datos y por último los 2 bytes de CRC. El número de bytes de datos depende de la longitud de bloque definida mediante el comando 16, y esta puede ir de 1 hasta 512 bytes (por defecto 512). Por tanto sumando a los bytes de datos el byte de incio y los dos bytes de CRC la longitud total del bloque de datos puede variar entre 4 y 512 bytes. Como por defecto en el protocolo de acceso SPI no se consideran los bytes de CRC, estos pueden tomar cualquier valor.

Reset de la tarjeta MODO SPI
Por defecto, al arrancar la tarjeta, esta se encuentra en modo MultiMediaCard. Para que entre en modo SPI, hay que enviarle el comando 0 mientras se mantiene activa la señal ¡CS (¡CS=0), pero antes de todo, para poder iniciar la comunicación por el bus hay que enviar como mínimo 74 ciclos de clock a la tarjeta. Así para hacer el reset de la tarjeta y prepararla para trabajar en modo SPI hay que seguir la siguiente secuencia:

-Dar como mínimo 74 ciclos de clock, es decir enviar unos 10 bytes a través de la SPI.
-Activar la señal ¡CS (¡CS=0).
-Enviar el comando 0 con el CRC bien calculado, ya que todavía no estamos en modo SPI, por lo que sí se considera el CRC. De hecho la secuencia del comando 0 siempre es la misma: 0x40,0x00,0x00,0x00,0x00,0x95
-Esperar el byte de respuesta que ha de ser 00000001 (tarjeta en modo idle).

Activar la inicialización de la tarjeta MODO SPI
Una vez reseteada y en modo SPI, hay que hacer la inicialización de la tarjeta, para ello hay que enviar el comando 1. La secuencia general es esta:

- Activar el pinl ¡CS (¡CS=0).
- Enviar el comando 1: 0x41,0x00,0x00,0x00,0x00, 0xXX. Como la tarjeta ya esta en modo SPI el CRC puede tomar cualquier valor.
- Esperar el byte de respuesta que ha de ser 00000000 (tarjeta lista).

Escritura de un bloque en la tarjeta MODO SPI
Una vez inicializada la tarjeta, para escribir un bloque en esta, hay que enviar el comando 24 con la dirección de inicio a partir de la cual se desean guardar los datos. Si todo va bien la tarjeta enviará tres respuestas R1 repetidas informando al controlador que ya puede enviar el bloque de datos, que ha de tener una longitud de 512 bytes (en la escritura solo se permiten 512 bytes) más el byte de inicio de bloque de datos y los dos bytes de CRC. La secuencia a seguir es:

-Activar el PIN¡CS (¡CS=0).
-Enviar el comando 24 0x58, 0xXX,0xXX,0xXX,0xXX,0xYY. Los 4 bytes XX corresponden a la dirección a partir de la cual se quieren guardar los datos. 0xYY corresponde al byte de CRC y como la tarjeta esta en modo SPI pueden tomar cualquier valor ya que no se consideran.
-Si todo va bien la tarjeta responde con el byte de respuesta R1 tres veces consecutivas.
-Enviar a la tarjeta el bloque de datos que consiste en:
- 1 byte de inicio de bloque de datos 0xFE
- 512 bytes con los datos a guardar.
- 2 bytes de CRC

-Mientras la tarjeta esta ocupada guardando el valor, irá enviando bytes indicando que está ocupada, y cuando finalice la escritura enviará un byte de confirmación.

Lectura de un bloque en la tarjeta MODO SPI
Para leer un bloque de la tarjeta hay que enviar a esta el comando 17 con la dirección de inicio de lectura en los bytes de argumento. La dirección puede tomar cualquier valor comprendido dentro del rango de direcciones válidas de la tarjeta pero todo el bloque leído debe estar dentro de un mismo sector físico. A continuación la tarjeta envía un byte de respuesta R1 seguido del bloque de datos, que comienza por 0xFE, continua con los bytes de datos y finaliza con los 2 bytes de CRC que no se usan. El número de bytes de datos depende del tamaño de bloque que se haya programado mediante el comando 16, y en la lectura puede ir de 1 a 512. La secuencia a seguir es la siguiente:

-Activar el PIN ¡CS (¡CS=0).
-Enviar el comando 17 0x51,0xXX,0xXX,0xXX,0xXX,0xYY. Los 4 bytes XX corresponden a la dirección a partir de la cual se quieren leer los datos. 0xYY corresponde al byte de CRC y como la tarjeta esta en modo SPI puede tomar cualquier valor ya que no se considera.
-Si todo va bien, la tarjeta responde con un byte de respuesta R1, seguido del bloque de datos con la información solicitada y que el controlador tendrá que ir capturando. Esta tiene la misma estructura que los bloques de datos utilizados en la escritura:
-1 byte de inicio de bloque de datos 0xFE
-n bytes con los datos a guardar.
-2 bytes de CRC.
-Si se produce un error durante la comunicación, la tarjeta no transmitirá ningún dato y en lugar de estos enviará un byte indicador de error.

#17  
Paloky

Registrado: 21 Abr 2006
Mensajes: 147
Ubicación: Mataró, Barcelona
citar
Hola Marcosbrusa.

He probado todo lo que dices, pero no consigo que funcione.

La parte de Inicialización si que me funciona, pero a la que intento leer o escribir, no lo consiguo.

He leido en algun sitio que la comunicacion es distinta entre las tarjetas SD y las MMC.

Me puedes mandar el codigo fuente para ver que es lo que hago mal.

Gracias.

#18  
marcosbrusa

Registrado: 06 Ago 2007
Mensajes: 10
Ubicación: Argentina
citar
Fijate que hace un tiempo escribi la funcion de escritura en c, el unico error de ese codigo es que espera 3 respuestas cero despues del comando de escritura Y SE DEBE ESPERAR UNA SOLA.
Por supuesto que no es lo mismo SPI y CMD. Lo que mande explica como elegir SPI. No conozco nada de CMD.

Ahora estoy tratando de darle formato texto y NECESITO AYUDA

#19  
Paloky

Registrado: 21 Abr 2006
Mensajes: 147
Ubicación: Mataró, Barcelona
citar
Hola. Por fin he consiguido hacer lecturas y escrituras en una SD.

Después de ver que mas o menos funcionaba, utilizando el programa "Hexprorer", que me sirve para ver los datos de los sectores de la tarjeta, se me ha planteado una pregunta. Según he visto, con mi tarjeta de 64MB, dispongo de 112,240 sectores. Utilizando las rutinas que mostrais, la dirección del sector màxima que puedo poner con 16 bits es dee 65535. !!!

Como puedo acceder a los demás sectores de la tarjeta. ??

He visto también que me parece que no leo los sectores en el orden correcto. Alguna solución?

#20  
Paloky

Registrado: 21 Abr 2006
Mensajes: 147
Ubicación: Mataró, Barcelona
citar
Hola. Por fin he conseguido que funcione todo correctamente.

Razz Ahora ja puedo leer y escribir en cualquier sector de la tarjeta.

No lo habria conseguido sin vuestras preguntas y respuestas. Por eso, os adjunto mi programa de prueba para que lo utilizeis vosotros. (Está todo comentado linea a linea)

Todo y que está echo con un PIC16F877A, al no tener suficiente RAM, solo puedo utilizar los primeros 192 byte de cada sector, pero se soluciona en un plis-plas con un 18F o con un dsPic.

Si teneis alguna duda, ja sabeis. Wink

Saludos.



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

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