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

Hola estoy diseñando un data logger con un PIC 18F4550. Este tiene un modulo Xbee RF de transferencia radiofrequencia y una targeta SD, y comunicacion via USB. Me encuentro con el problema que la targeta usa el protocolo SPI y el modulo RF el protocolo serie, hasta aqui bien. El problema esta en que el pin 1 del PIC es el Tx y SPIout a la vez con lo que tengo un conflicto entre le Xbee y la SD. He visto que hay otros protocolos para la SD, modo un bit, modo cuatro bits, etc... Alguien me puede dar información al respecto?
Saludos y gracias
 
Catjosep por eso no te preocupes es lo de menos...
lo que yo haria en tu caso dejo el pin ese para la salidad spi e implementaria el protocolo rs232 por software que anda muy bien... y seria menos complejo que ponerme a investicar como funcionan las tarjetas en otros protocolos...
fijate que te combiene pero me parece que de la forma que digo yo vas a ganar tiempo y mucho...
 
Última edición por un moderador:
hola nutriax, acuerdate de probar la memoria con el winhex y prueba que el programa funciona bien.
voy a traer de conseguir el adaptador para la memoria sd, pero si tu puedes hazme el favor de probar el programa.
 
Estimados amigos,

Hace 2 años realice un proyecto de lectura y escritura de memorias SD teniendo buenos resultados. Lo probe con memorias kingston.
Sin embargo ahora resulta que ese proyecto no me esta funcionando con un tipo de memoria SD en especial.
Me funcionan con las SD kingston de lock blanco (el que permite bloquear la escritura) pero con ninguna de las que tienen lock amarillo, tampoco con las microSD de la misma marca Kingoston.

Y no puedo decir que estén falladas esas memorias ya que la PC si las reconoce y puedo leerlas y escribirlas desde ahi.

Quisiera que me puedan orientar a solucionar este problema que tengo con la comunicación con estas memorias SD. Detallaré el problema que tengo con estas memorias.
Específicamente el problema es con el comando de inicialización. El comando de reset si me funciona, la SD me devuelve un $01 (modo spi en idle) pero luego cuando envío el comando $41 de inicialización me responde $01 es decir como si no saliese del modo idle. Cuando reintento este comando mas de 6 veces deja de responder, obteniendo puras $ff.

He probado poniendo mas retardos, mandando otros comandos $77 (error en idle) , $55 (error comando ilegal), reintentando muchas veces pero no obtengo la respuesta deseada ($00)

Probe el comando $58 y me responde que si soporta todos los voltajes desde 2.5V hasta 3.6V, yo estoy trabajando con 3.3V.

Espero que me puedan brindar su ayuda, muchas gracias.

Mahatma.
 
hola primero, no tiene nada que ver un modelo de otro (y mucho mas siendo de la misma marca), yo he probado con un monton de memorias y anda perfecto (incluyendo distintas marcas)...
para jorgealexvilla ponete a leer este hilo y fijate que ya se hablo mucho del tema y no hay mas para hablar en todo caso para fat32 tendria que haber otro hilo...
nuevamente para mahatmajg:
probaste un ciruito fisico armado con una memoria que ande y el mismo circuito lo probaste con otra memoria y no anda? porque si no lo probaste asi y armaste otro circuito me juego la cabeza que tenes problemas de hardware...
es mas fijate si no tenes invertido el sdo con el sdi. y comentame como es el tema y postea el ciruito y si tenes fotos porque eso me suena problema de circuito
 
Si estoy hablando del mismo circuito. Con ese mismo circuito me funciona para unas memorias SD (hasta leo y escribo) y para otras memorias SD no paso del comando de inicializacion. Mi circuito consiste de un diodo zener para bajar la tension de 5V a 3.3V y dar asi el power. los pines de señal los manejo con divisor de tension con resistencias (de 5V del uc a 3.3V). Cabe señalar que para estas memorias que no me funcionan con el comando de inicializacion, si me funciona el comando de reset $40 y el comando de soporte de voltaje $58.

Creeme que he probado muchas cosas que se indican en este foro pero hasta ahorita ningun resultado, gracias por tu ayuda.
 
yo otra cosa que probaria es revisar el codigo porque cuando la inicialisas muchos esperan 2 byte de respuestas y en realidad tenes que esperar como maximo 20 porque dentro de esos te responde con el byte de ok, no se si me explico...
 
Si he probado mandando varios $FF despues del comando de inicializacion, mas de 100, pero no me retorna el valor esperado que es $00. Quiero aprovechar para preguntar si es que es necesaria que la frecuencia de clock del spi sea de 400KHz o 312KHz como he visto en algunas contribuciones?, yo estoy usando un uc con crystal de 16MHz y he probado con prescaler de 64 (250Khz) y con prescaler de 32 (500KHz) y sigo con el problema, quiero saber si es que eso podria estar ocasionando mi problema. Recuerdo que mi hardware y firmware estan funcionando para unas memorias SD y para otras no.

Gracias por vuestra atensión.

Mahatma.
 
Hola tengo un problema he estado en el proyecto del lector gravador de SD, pero tengo un problema, por ahora lo que nos dejaron es inicalizar la memoria SD con SPI, bueno hemos estado leyendo un poco de esto y los comandos para realizar esto son el comando 0 y el comando 1, en terminos de pic debe ser 40 y 41, cuando intento inicializar la sd, segun si la inicializar pero ahora cuando no tiene SD hace exactamente lo mismo, es por eso que no se si esta respondiendo bien aqui esta mi codigo, espero que me ayuden por favor, es que como probamos y si enviaban los comando bien pensamos que ya estaba bien pero se me ocurrio comprobarlo quitandole la memoria al adaptador y respodnia de la misma forma saludos
 

Adjuntos

jaiser dijo:
Saludos, yo tambien estoy trabajando con las memorias mmc y he logrado inicializarla un poco diferente y tambien escribe los datos aunque no todavia en fat.

Este archivo contiene la simulacion y el programa en ccs asi como el .hex. Esta libreria usa pines diferentes a los predeterminados para protocolo spi pero funcionan y tambien brinda mayor flexibilidad porque se puede escoger que pines del pic usar

Hola Jaiser,

he intentado probar el programa que colgaste, pero al intentar compilar me da un error en el archivo mmc_spi.c, "expecting an identifier". Sabes porque puede ser? Estoy intentando crear un programa que me permita leer y escribir una tarjeta SD, con un PIC18F4620 y no logro hacerlo :cry: . Agradecería que alguien pudiera ayudarme.

Muchas gracias.
Saludos

Gracias. Un saludo!
 
Pues ya logre comunicar el PIC con la SD, inicializo y escribo perfectemante gracias a algunas modificaciones del programa de Paloky, pero estoy tratando de mandarle datos al PIC via RS232 y cuando le complemento esto a mi programa con esta interface ya no funciona, si alguien sabe que puede ser le agradeceria su apoyo.

Pues aqui les mando mi programa que es una modificacion del de paloky:

Saludos!
 

Adjuntos

Última edición por un moderador:
eso no lo he hecho pero creo que con mas RAM vas a poder agregar mas sectores(del 1 hasta el 8).
Eso lo voy a probar la proxima semana, checalo y me dices que tal te fue.
 
Holas a todos he estado leyendo bastante sobre este tema, en mi caso tengo una duda para la escritura y lectura de la trajeta, por lo he visto que para el tamañp del bloque se usa esto:

varl=((block_number&0x003F)<<9);
varh=((block_number&0xFFC0)>>7);

puts("Write block\n\r");

OUTPUT_LOW(PIN_C2);

SPI_WRITE(0x58);
SPI_WRITE(HIGH(varh));
SPI_WRITE(LOW(varh));
SPI_WRITE(HIGH(varl));
SPI_WRITE(0x00);
SPI_WRITE(0xFF);

no entinedo bien que hace este pedazo de codigo creo k esta usando CCS y yo uso el C18.

Agradeceria mucho me ayuden
El codigo que llevo es el que adjunto.
 

Adjuntos

Con respecto al programa de platanit087 una de las soluciones se podria usar un pin para detectar si la tarjeta esta insertada en el zocalo el mismo trae un pin.

Los zocalos que vienen y que yo he comprado viene con 10 pines dentro de la cual esta el pin que se usa para detectar la tarjeta cuando se inserta y los zocalos de 12 pines tiene un pin la cual te indica si esta bloqueada o no

Aca les dejo las conexiones del zocalo de la tarjeta y un integrado para la interfase
 

Adjuntos

Última edición por un moderador:
Buenas;

estoy probando de inicializar una SD, pero no funciona...
pido si alguien me puede repasar el codigo, ya que hace cosas muy extrañas.

He tenido que meter unos delay_ms porque se me quedaba colgada en un bucle
cuando enviaba un valor por SPI.

Muchas gracias
 

Adjuntos

Hola

Bueno, casi no he aportado en foros, pero ahora veo que es de mucha utilidad esto, mi proyecto es de la facultad, y se trata de la SD, se supone que lo que debe hacer es leer datos de un archivo y escribirlo a la SD, ese archivo sera de audio para luego reproducrilo, hasta ahortia solo llevo la inicializacion de la SD, asi como lectura y escritura y como veo en este foro nadie ha posteado bien como es este proceso o puesto algo que funcione al 100% o si les ha funcionado no lo han puesto, pero recopilando toda la información que han puesto ha sido de gran utilidad para poder llegar a lo que he llegado, bueno como este foro practicamente lo ven muchas personas aun no puedo poner todo el codigo por que la verdad es que tengo la teoria que alguno de mis compañeros del grupo se chacalearon el codigo que habia puesto, bueno pero no hay que ser envidios, si alguien esta interesado en el desarrollo aqui posteare cuando sean vacaciones o sea como en junio, todo el proceso de esto de la SD, y si alguien tiene problemas pues les dejo mi correo de hotmail para que se contacte con migo, como les digo no es por ser envidiodo pero pues es por cuidar el proyecto.

Uso el PIC16F877A con un critsal de 4 MHZ, a mi me funciono, al principio del post el gran creador de este tema muy interesante puso que afuerzas era con uno de 20Mhz, no se a que se debe, ademas uso la SD de ScanDisk de 1 GB, esto no se que tanto varie conforme a otras marcas, me recomendaron hacerlo con esa marca y ese tamaño, otra cosa que pude apreciar es que muchas veces los algoritmos o el proceso de escritura y lectura es un poco tediosa, en realidad lo es, pero los algoritmos que viene en algunas paginas sirven mucho solo el pequeño detalle es que varian en pocas cosas o practicamente en nada, esto lleva a hacer algo asi de prueba y error y cambiarle pequeñas cosas que aun que no se vea el cambio puede funcionar.

Mi correo de hotmail es reymar_44@hotmail

Bueno aprovechando este choro que les puse , necesito preguntarle a los experto de este tema, una duda hacerca de la lectura escritura leei que para acceder al sector 2, necesitamos poner algo asi.

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

esto si funciona pero para acceder a otro sector he intentado hacer esto para acceder al sector 3


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

peron no funciona, alguien me explicar paso a paso sobre los agrumentos de este

saludos
 

Temas similares

Arriba