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

Buenas!
He seguido todo el hilo y me parece bastante interesante, yo pienso implementar este conocimiento para ponerle un módulo de lectura de memoria aun CNC y que a su vez haga todos los cálculos necesarios para así sustituir la PC que ya tiene.

Hace unos días comencé a estudiar el sistema de archivos FAT. Lo elegí por su presunta simpleza, en fin, se me ocurrió que podría utilizar una EEPROM serial 24Cxx para formatearla en FAT, sería grandioso porque con un sistema de archivos es más fácil accesar a los datos por medio de cualquier microcontrolador. Enseguida pensé... ¿Porqué no accesar a la memoria FAT mediante una computadora, de esa manera le podría meter archivos reales (mientras quepan claro), pensé en implementar una interfaz I2C con el Handshake del puerto RS-232 y desarrollar un programa para introducirle los archivos.

Hasta ahora la proyección iba genial, pero pensé, tener que accesar a dicha memoria a través de un programa. Por muy bueno que fuera el GUI no deja de ser molesto, sería una mejor experiencia entrar a "Mi PC" en XP y encontrar la memoria como una unidad más del sistema. El punto es que si se puede con una memoria flash con interfaz USB debe de haber alguna manera de hacer lo mismo con esta memoria y con la interfaz I2C / RS-232 (Handshake). Estuve cavilando un rato y me pregunté ¿Que tiene una pendrive que no tenga mi memoria aparte del protocolo y el formato? Llegué a la conclusión de que necesito conseguir o desarrollar un driver nativo, dll o api que permita el reconocimiento de mi memoria como una unidad del sistema y que pueda ser navegada por el Explorer de Windows.

Si alguien que sepa del tema fuera tan amable de orientarme le estaría muy agradecido.
No busco quien me ofrezca el problema resuelto, más bien necesito conocer las pautas para entrar en este rollo, aunque si alguien ya lo hizo y quiere compartir sus trabajos y experiencias estaría de lujo.

Espero sus respuestas amigos, bienvenida cualquier crítica en son de opinión.
 
Última edición:
Lo que tratas de hacer está completamente probado @Javilondo , solo que está en C18 para PIC18F....lo que tenés que descargarte es el USB framework de microchip y en unos de los ejemplos aparece el protocolo MSD (Mass storage device) y un ejemplo de como implementar un memory stick USB con un PIC y una memoria EEPROM.
 
Moyano Jonathan te agradezco la ayuda, pero no deseo realizarlo con un PIC, ni con USB, sino utilizando los pines de Handshaking (control de flujo/control por hardware) del puerto RS-232.
Mas bien me gustaría saber cómo o que pautas tomar para desarrollar el driver para la PC en Windows XP.
De hecho mi proyecto no tiene nada que ver con sistemas embebidos, es una réplica de un tema que inicié en Interfaces y programación que fue cerrado en calidad de "tema repetido", Chico3001 (moderador) me recomendó consultarlo en este tema ya que es supuestamente el tema con el cual se repetía la coincidencia por el simple hecho de implementar el FAT, cosa que no tiene relevancia porque yo puedo implementar cualquier otro sistema de archivos que se acople a las capacidades de la memoria y si es preciso puedo cambiar de memoria, a mi lo que me interesa es el desarrollo de un driver el cual reconozca cierta memoria como unidad del sistema, que la represente en "Mi PC" y que pueda ser escudriñada a través del explorador de Windows. Creo que mi proyecto no es tan ambicioso como parece puesto que teniendo el driver, el resto es tarea del sistema operativo.
Este es el tema original: Memoria 24Cxx (FAT) como unidad en "MI PC" (XP)
En verdad estoy algo preocupado porque no se si podré encontrar las respuestas que espero en una sección a la cual no pertenece.
De todas maneras agradezco su apoyo y cooperación.
También felicito a los que rescataron este tema después de que fue abandonado por su autor @NANO1985, en verdad gracias a ustedes he podido aprender muchas cosas que se me complicaban y lo mejor de todo es que no fui el único que obtuvo beneficios, sino toda la comunidad interesada en esto.
 
Última edición:
Haber si entendi... tu duda es como crear una especie de "Disco Virtual" con una memoria 24xXX pero usando el puerto serial de la computadora??

En ese caso el driver no va a ser tan facil de hacer... el RS232 no fue creado con ese proposito, aunque en teoria si se podria usar con ese fin, el problema es del lado de Windows... no creo que exista un driver como tal que permita accesar datos como si fuera un disco duro externo...
 
Ahora nos estamos entendiendo, es precisamente lo que me interesa.
Se que probablemente no exista ningún driver capaz de ello o tal vez si, pero como Windows es una plataforma orientada a la abstracción de hardware, un nuevo driver, según yo se, puede ser construido a partir de los ya existentes, Windows debe tener un driver especializado para unidades virtuales, un ejemplo son los discos .ISO. También debe tener un driver especializado para manejar el puerto serial que, como dices, no fue diseñado para manejar una memoria de ese tipo en esa forma, pero la flexibilidad de su protocolo permite dicha interfaz, un ejemplo es el conocido programa ICProg que graba microcontroladores y memorias sin implementar el protocolo RS-232, solo aprovecha el control de flujo (Handshaking).
Se supone que también existe una API capaz de manejar el sistema de archivos FAT de tal forma que todo queda transparente para el programa explorer.exe que es el explorador nativo del sistema.
Por lo tanto debe de haber una manera de conjuntar estos drivers y APIs de distintos niveles en una sola capa de abstracción de hardware superior que daría origen al nuevo driver y todo esto para evitar confeccionar un programa especial que maneje todos estos aspectos de manera indirecta. Así se tendría la comodidad de hacer clic derecho en cualquier archivo, elegir entre el menú de la Shell la opción de Enviar a... y seleccionar la unidad que representa nuestra memoria sin un software dedicado.
Se que no es imposible, puesto que Windows lo hace y muchos aficionados que no pertenecen al equipo de desarrollo de Windows han logrado vencer retos más grandes.
Creo que hay mucho talento en esta comunidad y pienso que si le dan a alguien la oportunidad de compartir información hay una alta probabilidad de que esta resulte de utilidad para más de una persona y con mayor razón en un foro como este.
No quiero aplicar la ley del mínimo esfuerzo, les aseguro que he estado investigando sobre esto, solo que se me ha ocurrido publicar mi duda en este sitio porque pienso que no seré el único al que le sirvan las posibles respuestas generadas aquí, cuya información podrá ser utilizada para aclarar alguna duda como la mía o como motor para nuevos proyectos.
 
Volvemos al punto... si se puede... pero es trabajo de programacion en alto nivel, necesitarias crear un programa que abra y cierre el puerto serial y se comunique con tu circuito, y cada vez que conectes tu dispositivo tienes que correr el programa debido a que a diferencia del puerto USB donde Windows detecta que algo fue conectado, en el RS232 no se puede

Ese programa como bien dices debe hacer uso de las APIs de Windows para ir recibiendo datos hexadecimales e irlos guardando en forma de archivo, lo cual es relativamente facil...
 
Buenasss

Estoy trabajando en un proyecto usando un LPC2148 (ARM7) para poder inicializar la tarjeta SD.

Tengo dos tarjetas de 128MB para probar, una de HP y otra de "D-TEC"

Me he mirado todos los documentos oficiales y un monton de ejemplos de terceros. Muchos de ellos coinciden en algunos puntos:

-CS = 1, Enviar más o menos 80 pulsos de CLK (una instrucción FOR de 10 ciclos enviando 0xFF).

-Enviar CMD0 y ecibir R1 con 0x01.

Mi problema es que mi tarjeta no se inicia. Por ahora solo estoy probando a recibir la respuesta del comando CMD0, pero lo unico que recibo es 0xFF. Fijo el valor de CLK a unos 350 KHz, CS = 1, 80 CLKs, CS = 0, CMD 0 más un While para esperar la respuesta 0x01, pero mi código se queda ahí, como no le llega 0x01, sigue enviando 0xFF eternamente.

A ver que tal se nos da señores (y)

Os dejo aquí el código para que le echéis una ojeada.

**Rx es el Byte de respuesta recibido por cada comando enviado, se actualiza cada vez que se manda un byte, porque como ya sabéis, la comunicación es Full-duplex-

IOSET0 = 0x100000; //CS = 1 antes de emitir los pulsos.(disable)
for (j = 0; j > 10; j++){
SSP_SPI_Send (0xFF); //80 Clks
}

IOCLR0 = 0x100000; //CS = 0 para transmitir CMD0. (enable)

SSP_SPI_Send (0x40);
SSP_SPI_Send (0x00);
SSP_SPI_Send (0x00);
SSP_SPI_Send (0x00);
SSP_SPI_Send (0x00);
SSP_SPI_Send (0x95);

while (Rx != 0x01){
SSP_SPI_Send (0xFF);
}
 
Tengo una microSD , tengo un PIC16F887 regulador de 3.3v ...bueno en pocas palabras tengo todo lo que se necesita para usar la targeta SD...en la simulacion funciona al 100% pero cuando lo hago fisicamente....no funciona nada...:( ...para que se den una idea lo tengo como al principio del tema...y no se que hacer y que podra ser.......

no se si me ayuden con un tips...de porque no funciona...o que podre revisar fisicamente a mi circuito...
 
quisiera saber si puedes subir los duiagrams y el codigo utilizado a proposito moyano aun se espera el manual gracias

El manual está siendo desarrollado , pero no es algo que se haga de la noche a la mañana ....muchos me han preguntado lo mismo y les he respondido esto. Otra cosa es un trabajo que realizo lentamente debido a que la electronica no es a lo unico que me dedico, tengo muchas otras actividades que me atarean muchos más y tengo que cumplir con todo.
 
hola, la verdad espero que me puedan entender, antes que nada quisiera saber como puedo, con un pic previamente programado leer o tomar los datos que se encuentran en una memoria usb, con el fin de manipularlos, en especial los archivos de musica.. mi proyecto es reproducir la musica contenida en las memorias, supongo que tendria que hacer un conversor de digital a analogo, pero como extraigo la informacion y la manipulo(osea, paso de cancion etc), como la memoria me indica que esta en el primer dato y que yo le indico que arranque o que pare etc.. Gracias
 
En efecto como dice @scooter pero lo de imposible es aplicado a los PIC18 y otros modelos cuyo módulo USB no trabaja (no existe) como host USB; sin embargo si existen los PIC host USB como los PIC24 o PIC32...

No recuerdo donde pero vi algo de un reproductor mp3 con PIC, creo que era en el foro pero lo buscarías... mp3 + PIC o en la misma web de microchip
saludos
 
Hola mirá no se si te sirva pero con un PIC18F se puede leer un archivo .WAV y reproducir temas con una calidad aceptable:
El proyecto no es de mi autoría ....tendrías que armarlo y probarlo.
 

Adjuntos

  • PIC18 SD WAV Audio Player.rar
    479.1 KB · Visitas: 36
muchas gracias amigos, la verdad es de gran ayuda, lo que busco es algo parecido a lo que moyano jonathan ha publicado, otra pregunta muy interesante es como es la comunicacion entre pic y usb, la verdad me gustaria entender como controlo los datos que estan en la usb pues esto es lo que hace el pic..
 
javio1022 dijo:
muchas gracias amigos, la verdad es de gran ayuda, lo que busco es algo parecido a lo que moyano jonathan ha publicado, otra pregunta muy interesante es como es la comunicacion entre pic y usb, la verdad me gustaria entender como controlo los datos que estan en la usb pues esto es lo que hace el pic..

Comunicación entre PIC <-> PC por USB, un tema por donde puedes iniciar es este: Control de dispositivos a través del módulo USB del PIC18F2550.

saludos.
 
hola nesecito ayuda con al secuencia e unicio de una tarjeta micro sd 4Gb clase 4, ya que la secuencia de inicializacion de la sd normal no me resulta estoy utilizando esta secuencia

envio cmd0 luego cmd1 luego cmd16 con lo cual queda listo.

puedo leer y escribir la mayoria de sectores todo funciono bien en una sd de 1Gb kingston pero por alguna razon mi sd se quemo ahora no dispongo de una sd de esas caracteristicas como mencione antes la misma secuencia no funciona en la micro sd de 4Gb
 
hola aqui de nuebo con la duda de la tarjeta SDHC de 4G estube probando las secuemcia de inicializacion pero por alguna razonno funciona, esta todo bien hasta el envio del CMD8 recibe y responde correctamente de ahi a mas alla no funciona dice que todo va bien pero cuando mando leer me debuelbe puro ceros no se en que pued estar el problema ya la compare con viars rutinas en C que pueden inicializar (no se mucho de C solo lo basico por so lo ago en ASM).

tambien adjunto la hoja de datos de las SDHC-SDXC




prueba call RX232
movf r:LOL:,w ;carga en w el dato recibido
movwf tmp1
xorlw h'30'
btfsc Z ;VERIFICANDO SI SON IGUALES
call onSDHC
movf tmp1,w
xorlw h'31'
btfsc Z ;VERIFICANDO SI SON IGUALES
call CMD55
movf tmp1,w
xorlw h'32'
btfsc Z ;VERIFICANDO SI SON IGUALES
call ACMD41
movf tmp1,w
xorlw h'33'
btfsc Z ;VERIFICANDO SI SON IGUALES
call CMD58B
movf tmp1,w
xorlw h'36'
btfsc Z ;VERIFICANDO SI SON IGUALES
call CMD17
clrf r:LOL:
goto prueba ;itera indefinidamente

onSDHC clrf r:LOL:
bcf ptoc,1
call sdclok
resetHC call CMD0
call CMD8
movlw 'S'
call TX232
goto prueba



sdclok movlw d'10' ;;se envia 10 byte de sincronia
movwf tmpsd
movlw h'FF' ;New data to xmit
call TxSPI
movwf dato1
decfsz tmpsd,1
goto $-4
bsf ptoc,1
return
CMD0 bcf ptoc,1
movlw h'40' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'95' ;New data to xmit
call TxSPI
movwf dato1
movlw d'5'
movwf tmpsd2

r1d1 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r1d1
goto CMD0 ;NO
call tvs
call ada4
return

CMD8 bcf ptoc,1
movlw h'48' ;valor de comando
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'01' ;New data to xmit
call TxSPI
movwf dato1
movlw h'AA' ;New data to xmit
call TxSPI
movwf dato1
movlw h'87' ;valor de CRC
call TxSPI
movwf dato1
movlw d'5'
movwf tmpsd2

r7d8 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r7d8
call mal
movlw d'4'
movwf tmpsd2
movlw h'FF' ;New data to xmit
call TxSPI
call TX232
decfsz tmpsd2,1
goto $-4
call OK
return
CMD55 bcf ptoc,1
movlw h'77' ;valor de comando
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'01' ;valor de CRC65
call TxSPI
movwf dato1
movlw d'5'
movwf tmpsd2

r1d55 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r1d55
goto mal ;NO
call OK
return

ACMD41 bcf ptoc,1
movlw h'69' ;valor de comando69
call TxSPI
movwf dato1
movlw b'01000000' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'77' ;valor de CRC 77
call TxSPI
movwf dato1
movlw d'6'
movwf tmpsd2

r3d41 movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'01'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;;return ;si acepto ok
decfsz tmpsd2,1
goto r3d41
goto mal ;NO
OCR1 movlw d'4'
movwf tmpsd2
movlw h'FF' ;New data to xmit
call TxSPI ;rebido 00H
call TX232
decfsz tmpsd2,1
goto $-4
call OK
return

CMD58B bcf ptoc,1
movlw h'7A' ;valor de comando
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'00' ;New data to xmit
call TxSPI
movwf dato1
movlw h'FD' ;valor de CRC fd
call TxSPI
movwf dato1
movlw d'5'
movwf tmpsd2

r3d58B movlw h'FF' ;New data to xmit
call TxSPI
movwf tmpsd
xorlw h'00'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4 ;si acepto ok
decfsz tmpsd2,1
goto r3d58B
goto mal ;NO
OCRb movlw d'4'
movwf tmpsd2
movlw h'FF' ;New data to xmit
call TxSPI ;rebido 00H
call TX232
decfsz tmpsd2,1
goto $-4
call OK
return



secuencia para recepcion de 545 bytes
CMD17 bcf ptoc,1
movlw h'51' ;cmdX bits 47-40
call TxSPI
movwf dato1
movlw h'00' ;arg bits 39-32 U LSB
;movf Nsectr,w
call TxSPI
movwf dato1
movlw h'00' ;arg bits 31-24 D
call TxSPI
movwf dato1
movlw h'00' ;arg bits 23-16 C
call TxSPI
movwf dato1
movlw h'00' ;arg bits 15-8 M Msb
call TxSPI
movwf dato1
movlw h'FF' ;CRC bits 7-0
call TxSPI
movwf dato1
movlw d'5'
movwf tmpsd2

r17R1d0 movlw h'FF' ;New data to xmit
call TxSPI
movwf dato1
xorlw h'00'
btfsc Z ;VERIFICANDO SI SON IGUALES
goto $+4
decfsz tmpsd2,1
goto $-7
goto mal
;;bloque de datos lectura
Nbloc movlw d'5' ;numero de veces de bits a leer 103*5= 515
movwf tmpsd2
bloqDt movlw h'67' ;numero de dits recicidos
movwf tmpsd
bcf ptoc,1
movlw h'FF' ;New data to xmit
call TxSPI
call TX232
decfsz tmpsd,1
goto $-4
decfsz tmpsd2,1
goto bloqDt

movlw d'10'
movwf tmpsd
movlw h'FF' ;New data to xmit
call TxSPI
call TX232
decfsz tmpsd,1
goto $-4
bsf ptoc,1
return
 

Adjuntos

  • SDHC-SDXC.pdf
    1.1 MB · Visitas: 85
Hola como andan? Les comento que estoy realizando un proyecto en el que la interaccion entre el pic y una memoria sd son primirdiales. Utilizo un pic18f4520, y la conexion con la sd la hago mediante Software SPI o tambien llamado Bitbang. Cabe aclarar que programo en C. La cuestion es la siguiente, al utilizar el SPI por soft no puedo obtener un velocidad de CLOCK relativamente alta. A 8 mhz de fosc el clock de spi alcansa los 50khz. Tengo entendido que para que la SD funcione tiene que ser al menos de 200khz. Es esto correcto? alguien tiene alguna experiencia similar a la mia?
Muchas gracias saludos

Editado: olvide aclarar que el bus i2c lo tengo por hardware y no es factible modificarlo
 
Última edición:
Atrás
Arriba