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

Eso de la SD a menos de 200Khz funciona seguro eran las antiguas, yo le pongo la velocidad del clock del SPI lo pongo a 25Mhz y funciona normal.
Eso con ARM.

hola este estas trabajando con tarjetas SD estandar o con tarjetas SDHC ?

yo la standar no logre trabajarla a mas alla de 300Khz.

nestorg85 dijo:
Hola...me encuentro desarrollando un lector de imagenes desde una tarjeta SD bien sea estandar o HC...me base en las librerias SD y Fat de suky y realice las midificaciones necesarias para inicaliaziar ambos tipos de memoria tanto en hardware como en software (FAT). El problema surgue cuando quiero leer el direcotiro raiz de una tarjeta SDHC de 4GB, me envia error en la r1 al enviar el comando CMD17, pero solo cuando quiero leer sector muy alto. Dentro de las pruebas me leyo bien el sector 15000 luego cuando quise leer el secto 16000 genera error y ningun sector de ahi en adelante, pero al tratar de leer ese mismo sector en una tarjeta estandar..lo hace de manera correcta....por favor necesito ayuda
puteo.gif
...si alguien ha trabajado con memorias SDHC...Estoy trabajando con un pi 18F4685 crital de 20MHz y la frecuencia esta dividida por 16....
Espero haber sido lo suficientemente claro...agradezco cualquier ayuda
pared.gif
titanic.gif

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
george.manson.69

postea tu codigo y tu circuito..como te me mencione, tengo una libreria que inciailiza las mesmorias standard 2.0, 1.xx y HC de manera exitosa...tal vez pueda ser cuention de libreria....por experiencia te digo q no ahi q fiarse de la simulacion.
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

@guian85
Yo tambien estuve buscando esos sockets pero solo consegui para micro SD en sigmaelectronica, finalmente debi importar el conector y realizar el PCB para adaptarlo al protoboard..


hola yo estoy en las mismas en caso de SD estandar todo bin pero no logro inicializar la SDHC.
podrias subir tu codigo para poder ver dnd tengo errores por favor. grasias
 
Última edición:
Yo trabajo con fat32/16 el codigo es grande uso una micro sd de 2GB kingston
Aque esta un ejemplo para ATMEL atmega pero se modifica lo hice para PIC,ARM,
funciona para sdhc mira como maneja los CMD y lo modificas para pic.
Funciona con clock SPI 2MHZ, 8MHZ y 25MHZ este ultimo en arm.
en sample_mmc.c esta las rutinas de inicio.
 

Adjuntos

  • mmc avr.rar
    39.4 KB · Visitas: 195
hola cristian_elect gracias por el codigo.
disculpa mi ignorancia pero no soy bueno en lenguaje C (recien inico en lenguaje C) lo estoy transcribiendo a ASM y no logro entender des el envio del CMD55 a mas alla ni que respuestas debo recibir a los comandos


/*-----------------------------------------------------------------------*/
/* Initialize Disk Drive */
/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize (
BYTE drv /* Physical drive nmuber (0) */
)
{
BYTE n, ty, ocr[4];


if (drv) return STA_NOINIT; /* Supports only single drive */
if (Stat & STA_NODISK) return Stat; /* No card in the socket */

power_on(); /* Force socket power on */
for (n = 10; n; n--) rcvr_spi(); /* 80 dummy clocks */ enbia 10 bytes en blanco
SELECT(); /* CS = L */ lleva a bajo el cs ty = 0;
if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */
Timer1 = 100; /* Initialization timeout of 1000 msec */
if (send_cmd(CMD8, 0x1AA) == 1) { /* SDC Ver2+ */
for (n = 0; n < 4; n++) ocr[n] = rcvr_spi();
if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */
hasra este punto si logro llegar recibo la 01 y luego la ocr que es 1AA.
de aqui en adelante no logro entender ya que a todos los comando que envia despues de me responde 00 no indica error ni nada cuando envio el CMD17 solo recibo 00

do {
if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 1UL << 30) == 0) break; /* ACMD41 with HCS bit */ no se que respuesta recibir al CMD55 ni al ACMD41 ya que solo recibo 00 } while (Timer1);
if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit */
for (n = 0; n < 4; n++) ocr[n] = rcvr_spi();
ty = (ocr[0] & 0x40) ? 6 : 2;
}
}
} else { /* SDC Ver1 or MMC */
ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1; /* SDC : MMC */
do {
if (ty == 2) {
if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0) break; /* ACMD41 */
} else {
if (send_cmd(CMD1, 0) == 0) break; /* CMD1 */
}
} while (Timer1);
if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Select R/W block length */
ty = 0;
}
}
CardType = ty;
DESELECT(); /* CS = H */
rcvr_spi(); /* Idle (Release DO) */

if (ty) { /* Initialization succeded */
Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */
} else { /* Initialization failed */
power_off();
}

return Stat;
}
 
hola este es mi codigo esta echo en asm, lo simulo en proteus 6.9
las ordenes se mandan mediante el puerto virtual de proteus
 

Adjuntos

  • spi sdHC.rar
    52.2 KB · Visitas: 134
el prteus 6.9 no dispone de un simulador de tarjetas SD asi que de acuerdo a la hoja de datos del SD estructura el programa cargo en el simulador de SPI la suestas respuestas que debe dar la tarjeta SD y luego lo grabo en el pic y pruebo fisicamente mediente el puerto virtual por RS 232 a 9600 B enviando desde la pc las ordenes

el 0 ejecuta el 80 clock-CMD0-CMD8
el 1 ejecuta el CMD55
el 2 ejecuta ACMD41
el 3 ejecuta CMD58

asta ahi deberia de inicializar la tarjeta SDHC
luego son opcionales el 4 ejecuta el CMD16 y el 5 ejecuta CMD17.
 
volviendo al tema de las tarjets sigo sin lograr inicializar la tarjeta de 4G, pero consegui una de dos 2G en deshuso lo curioso fue que cuando la formatee se conbirtio a 1G raro??????
pero funciona asi que segui con el proyecto
y ya logre escribir la tabla fat1-crear un archivo de txt de 500Kb que la PC puede ler perfectamente.
ahora estoy tratamdo de ver en que lo aplico. (solo empese por curiosidad y ya logre todo eso)

Haora buelvo al tema de inicializar la tarjeta de 4G sdhc ya les aviso si lo logro inicializar.
y grasias a todos de este tema su aporte fue muy valioso.

"vive, muere y renace una y mil veces" sbl
 
Hola:

Esto de manejar tarjetas MMC, SD, MicroSD etc con PIC es un completo reto, al mismo tiempo interesante. Buscando por Internet, a persar de haber encontrados cositas, aún está muy verde, ni siquiera hay libros para hacer proyectos de este tipo. Los diseñadores de móviles, PDA, etc, tienen muy claro como se hace. Espero que haya más tutos aunque sea en inglés para coger el hilo, ejemplos incluido.

Ah, otra cosa, el 16F877A y no se fabrica, solo quedan en stock hasta fin de existencias. Piensen ahora en los 16F877 que es el sustituto directo.

Migración del 16F877A al 16F887. (Datos en tener en cuenta).
http://www.microchip.com.ar/rs2009/soporte/clases/Migracion_877_a_887.pdf
Saludo.
 
Hola....quisiera saber si para usar la SD toca tener un pc??...porque necesito bajar unos datos de un PIC18F452 a una memoria SD, pero leyendo vi que había un cable para un PC, entocnes es necesario? ya que el dispositivo que estoy haciendo queda en un carro y no se puede accesar un pc allí, por eso pensamos en la posibilidad de sacar los datos por una memoria SD, pero aún tenemos la duda :S......La idea es bajar los datos desde una memoria EEPROM externa que está en el dispositivo a una memoria SD, esos datos despues queremos bajarlos al computador, pero como dije está en un carro entonces no se puede ¡(por efectos de practicidad, comodidad, etc) un pc allí :S hay algún problema allí??? Les agradezco cualquier aporte!!! Gracias ;D
 
lo que quieres es bajar de una memrie que esta en el carro a una sd para volverlo portable la informacion de la memoria lo cual si es posible pero tienes que implemenar todo una unidad para volcar la informacion de la memoria a la sd hay varios ejemplos aqui de eso

aunque lo recomendable seria que escribas directammenbte sobre la sd implementandolo sobre el pic
 
Última edición:
buenas, tengo un problema al inicializar una tarjeta sd, debo aclarar que como no puedo hacerlo fisicamente lo estoy simulando en proteus, mi problema es el siguiente cuando mando un dato a la tarjeta ejemplo el cmd0 los datos me llegan dezplazados en un bit, por ejemplo en lugar de 0x40 veo 0x20, alguien tiene idea de porque puede estar pasando esto???
 
gracias x la respuesta sbl... si, esta a 8, BITS=8, ahora, logre hacer que reciba cambiando una cosita del spi debugger de proteus, el tema ahora es q mi respuesta es siempre 0xff y a la tercera vez q escribo la respuesta es 0x00, que estare haciendo mal???
 
hl eldo que tarjeta esta inicializanfo un SD p HC y a q comando te da esa respuesta ya que a a los comandos debe responder 00 pero a algunos comando 01 la cantidad de intentos de recibir respuesta debe ser por lo menos 5 byte ya que puede responder al 1 o al 3 byte.
 
para ser sincero sbl lo que intento es simular en proteus la inizializacion de una sd a travez del cmd0 la cuestion es que la respuesta que me da proteus(spi debugger) es hasta el 3 byte 0xff a partir de ahi la respuesta es 0x00 y la verdad que no se si es el proteus oalgun fallo en mi programa
 
la verdad te recomendaria que lo pruebes con una tarjeta sd fisica ya que la verdad no he utilizado la simulacion yo hice el programa en proteus6.9 y no sabria decirte como simula la sd card las versiones superiores
 
hola patolin lo que intentas hacer creo que ya esta echo la informacion solo esta para revisar en los programas ya subidos anteriormente.

hola quetzal la verdad la velocidad que yo trabaje con pic a una veloidad de escritura a sd de 250Khz pero tengo entendido que es posible trabajr a una mayor velocidad dependera mucho del de la frecuencia a la cual trabaje el pic o el arduino, lo de comprimir so se si sera factible tendrias q buscar informacion y ver de que manera se puede hacer lacompresion
 
estuve tratando de inicializar una sd real(fisica) y me surgio la duda, si la salida del micro es de 5V y las tarjetas sd trabajan a 3,3 eso no representa un problema??? en cualquier caso, alguien sabe de algun esquema para que pueda guiarme???? muchisimas gracias desde ya compañeros
 
eso lo solucionas con un divisor de tension si mal no recuerdo es una ress de 2.2K y 3.3K y listo con eso trabaja sin problemas solo que calcula bien
 
buenas, tengo una pregunta, decidi hacer el proyecto con una tarjeta real el problema es que cuando quiero ver en la pc lo que he escrito con el pic en la sd esta esta vacia, en mi plaqueta no parece haber ningun problema y en mi software, lo he simulado y tampoco pareciera haber problema alguna idea???? gracias eso me esta rompiendo la kabeza jajaja
 
Atrás
Arriba