Autor Tema: Lectura Memoria MMC con Pic Simulator Ide  (Leído 13895 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Lectura Memoria MMC con Pic Simulator Ide
« en: 07 de Agosto de 2008, 02:50:32 »
Solicito la colaboración de los amigos foreros con alguna experiencia en esto de las MMC card.   :D

Aqui mi Hardware y las cosas de las que poseo :

-Memoria Multimedia Card (MMC) de 128 mb, la memoria pertenece a la marca PQI.
-Conector para la mmc, el conector lo desolde de un lector de tarjetas usb, y le agregue un divisor de tension ya que las memorias trabajan a 3.3 volt y el pic trabaja a 5 volt. El divisor de tension esta formado por 3 resistencias de 3k3 y otras 3 resistencias de 1k8.
Es un circuito que viene  en el datashett y que vi en el post de Redpic.

Aqui el circuito:

" border="0


El hardware lo teste y al parecer esta bien armado. Este va conectado a los pines SPI del pic.

El pic que estoy utilizando para mis primeras pruebas es un 16f873A.

PINES MEMORIA SD/MMC:

" border="0

Bueno leyendo y leyendo, pude ver que hay 3 pasos fundamentales que paso a explicar para inicializar la memoria MMC en modo SPI.

La memoria por si sola, inicializa en un modo multimedia card nativo, por lo cual solo acepta ciertos comandos estos son:

CMD0 =    Software reset.
CMD1 =   Initiate initialization process.

Antes de enviar estos comandos hay que inicializar la memoria en modo nativo, para esto segun el datashett es necesario enviar 80 clocks con SDI en alto y CS en alto.

Por lo cual, en lenguaje PSI, me dispuse a primero que nada definir los pines SPI:
Citar
Define SPI_CS_REG = PORTC
Define SPI_CS_BIT = 0
Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4
SPIPrepare  'Inicializo el SPI

Una vez definido los pines del SPI, me dispuse a inicializar en modo nativo la memoria mmc. Por lo cual hago lo siguiente:

Citar
dim a as byte 'variable
dim a1 as byte 'variable
Hserout "MMC/SD CARD  V 0.1", CrLf  'envio un texto al ordenador por rs-232
WaitMs 400
Hserout "INICIANDO LECTURA TARJETA DE MEMORIA", CrLf 'inicio lectura tarjeta de memoria
WaitMs 1000
a = 255      'a es igual a 1 byte
SPICSOn    'pongo en alto el pin CS
sdi = 1       'pongo en alto el pin sdi
For a1 = 0 To 9     'envio 80 bytes, es decir genero 90 pulsos '
SPISend dat  'envio el byte
Next a1  'proximo byte
SPICSOff

Para enviar un byte, se tarda 8 pulsos, es decir un pulso por bit. Por lo tanto, enviando 10 bytes estaria enviando los 80 clocks necesarios para inicializar la memoria en modo nativo.

Luego de esto, hay que inmediatamente mandar el CMD0 y aqui viene mi problema.

La secuencia para enviar un comando es la siguiente:

" border="0

envio primero un 01, luego el index , el arguento y el CRC seguido un 1.

Por lo tanto para CMD0 debo enviar

0100 0000  'el index del cmd0 es 40h
0000 0000  'en el comando cmd0 no hay argumento por lo tanto todos 0
0000 0000
0000 0000
0000 0000
1001 0101  'el crc es 95h, convertido a binario.

Para enviar este comando, debo poner la señal cs baja, y enviarlo justo despues de haber iniciado la memoria en modo nativo..

Aqui esta mi problema, la respuesta que yo deberia obtener es un 1.

Y estoy obteniendo un 0.. Para obtener la respuesta hay un cierto tiempo, un puede obtener la respuesta en el clock numero 5 despues de terminar de enviar el crc, o obtener la respuesta en el clock numero 8. Nose si me explico..

Para enviar el comando hago lo siguiente:
Citar
SPICSOff ' pongo en bajo CS
'-------------------------------------------
' ENVIO COMANDO CMD0 PARA UN SOFT RESET
SPISendBits 8, %01000000  'Envio 01 + Command
SPISendBits 8, %00000000  'primera cadena
SPISendBits 8, %00000000  'segunda cadena
SPISendBits 8, %00000000  'tercera cadena
SPISendBits 8, %00000000  'cuarta cadena
SPISendBits 8, %10010101  'envio el CRC
For bucle1 = 0 To 20 'Aqui hago un bucle de 0 a 20
SPISend dat 'envio un byte, es decir 8 pulsos
SPIReceive dato1 'recibo el dato y lo guardo en una variable
Hserout #dato1, CrLf 'mando la variable a la pc
Next bucle1
Lo que hago es que envie X cantidad de pulsos y cada cosa que reciba me la mande a la pc, pero la mmc en vez de contestarme 0x01 como deberia me contesta con 255, o 0x00.

La respuesta que la memoria envia esta formada por 8 bits. Cada bit tiene un significado.

" border="0

Aqui podemos observar el significado de cada bit, por lo tanto cuando la memoria me manda 255, me esta diciendo todos 1111 1111, todo erroneo.

si la memoria me manda 0000 0001, esta bien ya que quiere decir que entro en estado idle.

Mi intencion era saber si alguien ya habia probado con PSI, tratar de jugar con estos bichos, y si me puede dar una mano.

Aca por las dudas dejo la lista con los comandos mas esenciales:

Citar
Command
Index             Argument              Response   Data   Abbreviation   Description
CMD0              None(0)                           R1   No   GO_IDLE_STATE   Software reset.
CMD1              None(0)                           R1   No   SEND_OP_COND   Initiate initialization process.
ACMD41(*1)        *2                           R1   No   APP_SEND_OP_COND   For only SDC. Initiate initialization process.
CMD8                *3                           R7   No   SEND_IF_COND   For only SDC V2. Check voltage range.
CMD9             None(0)                           R1   Yes   SEND_CSD   Read CSD register.
CMD10             None(0)                           R1   Yes   SEND_CID   Read CID register.
CMD12             None(0)                           R1b   No   STOP_TRANSMISSION   Stop to read data.
CMD16         Blocklength[31:0]                   R1           No   SET_BLOCKLEN   Change R/W block size.
CMD17        Address[31:0]                   R1    Yes   READ_SINGLE_BLOCK   Read a block.
CMD18        Address[31:0]                   R1   Yes   READ_MULTIPLE_BLOCK   Read multiple blocks.
CMD58             None(0)                           R3   No   READ_OCR   Read OCR.
*1:ACMD<n> means a command sequense of CMD55-CMD<n>.
*2: Rsv(0)[31], HCS[30], Rsv(0)[29:0]
*3: Rsv(0)[31:12], Supply Voltage(1)[11:8], Check Pattern(0xAA)[7:0]
PICMANIACO!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #1 en: 10 de Agosto de 2008, 07:14:57 »
Estupendo proyecto Facundo, nunca he tocado este tema.
Actualmente llevo unos días fuera de casa y tengo la conexión muy restringida, también estoy con unos temas atrasados pero voy a ver si puedo hacerme de los componentes para ver si le puedo dedicar unos ratos también al proyecto... :-)
Saludos desde Granada, España.

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #2 en: 11 de Agosto de 2008, 15:23:02 »
Que bueno seria si te metieses en el tema dogflu66, asi podriamos ir posteando nuestros avances juntos, te digo que solo utiize algunos componentes no sale muy caro llevar el proyecto a cabo:

Un par de resistencias para divisor de tension
Una MMC de cualquier tamaño.
El slot para la MMC y la fuente de alimentacion para la MMC de 3.3 volt.

Despues calculo que tendras un pic, conexion rs232 y demas, por eso lo exeptuo de la lista de materiales..

Yo utilize para la conexion entre la MMC y el PIC la interfaz SPI que brinda el Pic Simulator Ide, pero me esta dando algunos problemas, con algunos comandos que envio a la memoria.

Espero que juntos podamos llegar a buen puerto.

Un saludo Facundo!!
PICMANIACO!

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #3 en: 14 de Agosto de 2008, 15:27:36 »
Siguiendo con el proyecto me he informado un poquitin mas  :mrgreen:..

Al parecer para iniciar la memoria hay que seguir algunos paso en basic.
Se deben tener en cuenta las siguientes cosas:

1- Seleccionar el modulo MSSP para que trabaja en modo master.
2- Generar un frecuencia en el clock de unos 312 khz.

Nota: Para inicializar de modo correcto la memoria , el Clock del SPI, debe estar en una frecuencia de entre 100 y 400 khz. Por lo cual con una frecuencia de 312 khz estariamos perfecto.

Para lograr ese frecuencia se debe utilizar el registro SSPCON del pic.

4) Luego debemos setear el tipo de polaridad del clock.

5) Finalmente activar el modulo del micro MSSP poniendo a "1" el bit SSPEN.

Paso a dar una explicacion general del modulo MSSP del pic redactada por mi basandome en el pic que en este momento estoy utilizando para las pruebas , el 16F877A.

El Modulo MSSP tiene 4 registros para el modo de operacion SPI. Estos son:

*MSSP Control del registro : (SSPCON)

*MSSP Control de Stado : (SSPSTAT)

*Registro Buffer de la recepcion y envio por serie : (SSPBUF)

*MSSP Registro Shift. : (SSPSR) . No es directamente accesible.

Los registros SSPCON y SSPSDTAT son registros de contro y estado dentro del modo de operacion SPI.
El registro SSPCON es un registro que puede ser leido y escrito.

Los ultimos 6 bits del registro SSPSTAT son de solo lectura.

Los primeros dos bits pueden ser leidos y escritos.

SSPSR es un registro del tipo SHIFT.. Es utilizado para enviar o recibir datos. He de ahi la famosa instruccion de PBP, SHIFTIN y SHIFTOUT.

SSPBUF es el registro de buffer para aquellos bytes de datos que van a ser leidos o escritos en el dispositivo.

REGISTRO SSPSTAT


&quot; border=&quot;0" border="0

Este tiene 8 bits, cada uno tiene un significado. Y segun el valor del bit cumpliran una u otra accion.

BIT 7 =  SMP: SAMPLE BIT

1 = Input data sampled at end of the data output time.
0 = Input data sampled at the middle of data output time.

BIT 6 = CKE: SPI CLOCK SELECT BIT

1 = Transmit occurs on trasition from active to idle clock state.
0 = Transmit occurs on trasition from idle to active clock state.

Nota : La polaridad del reloj es seteada mediante el registro SSPCON.4.

BIT 0 = BF: Buffer FUll Status Bit (solo en recepciones)

1 = Receive complete, SSPBUF is full.
0 = Receive not complete, SSPBUF is empty.

Del bit 6 al 1 no se utilizan en el modo SPI, Por lo tanto no me dedicare a explicar sus funciones.

REGISTRO SSPCON



&quot; border=&quot;0" border="0

Este registro tambien posee 8 bits de configuracion del bit 7 al bit 0.

Pero solo seran necesarios para las pruebas, utilizar los registros del bit 5 y
los registros del bit 4 y los registros del bit 3 a 0.

BIT 5 = SSPEN: Synchronous Serial Port Enable Bit

1 = Enables serial port and configures SCK, SDO, SDI and SS as serial port pins.
0 = Disables Serial port and configures these pins as I/O port pins.

Nota: Cuando este habilitado esos pines deben estar correctamente configurado como entradas o salidas.

BIT 4 = CKP: Clock Polarity Select Bit

1 = Idle state for clock is a high level.
0 = Idle state for clock is a low level.


Bit 3-0 = SSPM3:SSPM0: Synchronous serial port mode select bits

0101 = SPI Slave mode, clock = SCK pin. SS disable.
0100 = Spi Slave mode, Clock = SCK pin. SS pin control enabled.
0011 = SPI master mode, clock = TMR2 output/2
0010 = SPI master mode, clock = Fosc/64
0001 = SPI master mode, clock = Fosc/16
0000 = SPI master mode, clock = Fosc/4




'------------------------------------------------------------------
PICMANIACO!

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #4 en: 14 de Agosto de 2008, 15:32:42 »
Resumiendo, para poder iniciar la memoria, hay que tener en claro que registros debemos utilizar.

Recopilando informacion los registros necesarios son:

Debemos primero, obtener una frecuencia entre los 100 y 400 khz. Para eso pensaba utilizar un cristal de 20 mhz y utilizar la funcion FOSC/64 para obtener 312 KHZ.

Luego debemos setear los siguientes puntos utilizando los registros arriba mencionados:

1. Data Simple Middle
2. Clock Idle Low
3. Transmitir los datos desde la posicion idle a activo del flanco del reloj.

Espero alguna opinion o algo, por mi parte voy a poner a prueba mis teorias y ver que tal funciona. Mas tarde me doy una vuelta!  :P :P

PICMANIACO!

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #5 en: 16 de Agosto de 2008, 00:16:01 »
Bueno de momento voy a estar esta semanita parado, ya que estoy esperando una placa que sin ella no puedo continuar..



Asi es, estoy esperando esta placa serie PCMCIA para la portatil, sin ella no puedo utilizar la conexion rs-232, antes utilizaba un ordenador viejo para las pruebas, pero ahora lo tuve que mover a otro lado y pues estoy a la espera de esta plaquita.

Espero comentarios y que alguien se sume, que parece que estoy solo en esto jejje..

Seguire posteando mis avances y nuevos estudios!!  :D
PICMANIACO!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #6 en: 16 de Agosto de 2008, 06:01:22 »
No estas solo y estas haciendo un excelente trabajo... :-/
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #7 en: 16 de Agosto de 2008, 11:48:54 »
hola amigo Facundo

yo estoy interesado en este proyecto,
 hace unos meses, intente algo parecido,
yo estoy tambien trabajando en un proyecto con el pic16F877A, tengo algo de informacion de diferentes foros, referente a este tema, unos lo hacen con mmc y otros con SD, y angunos poco "frikis" con un modelo que vale para ambos modelos de tarjeta.
Si quieres te la puedo pasar.

voy a intentar montar tu diseño en proteus.

un cordial saludo

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #8 en: 16 de Agosto de 2008, 15:25:38 »
Hola el hardware funciona bien, aunque tuve que hacerle algunas modificaciones.

Se puede montar de dos formas, utilizar el divisor de tension, o utilizar un 7407 para adaptar los niveles de tension. Este posee 6 buffers, mas que suficiente para el proyecto, ya que solo utilizaremos 4.

Ah y recomiendo algo, si se va a utilizar el divisor de tension, recomiendo a la linea DO, la pongan con una R de 10k a VDD. Ya que de otro modo no funciona, o por lo menos a mi no me funciono muy bien, por lo que tuve que hacer la modificacion que cito un reglon arriba.

Postea la informacion que tengas que seguramente sera de mucha ayuda, en un rato posteare la secuencia para iniciar la Memoria MMC y mi codigo en PSI para dicha secuencia, y algunos de los comandos mas esenciales para adminisitrar leer y escrbir en la memoria.

Un saludo!!!
PICMANIACO!

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #9 en: 16 de Agosto de 2008, 15:58:35 »
Bueno como prometi, aqui dejo algunos de los comandos mas importante y como inicializar la memoria. Espero ser lo mas explicativo posible.

Secuencia para iniciar la MMC:


Para iniciar la MMC, es necesario enviar al menos 80 clocks.

Despues de encender la memoria, esperar al menos 1 milisegundo y poner CS y D-IN (MMC) en modo ALTO.
Luego enviar los 80 clocks, (en forma de dummy bytes) e inmediatamente despues de enviar los 80 clocks, poner CS en bajo.

De esta forma podemos ya iniciar la memoria, basta decir que la memoria iniciaria en Modo Nativo, es decir en el modo de operacion Multimedia Card, y no en Modo SPI. Por lo cual tendremos que enviar 2 comandos para que se active el modo SPI.

Aqui un ejemplo de la inicializacion en modo SPI:

Citar
Dim dato as byte
dim bucle as byte
dato = 255 ' Dato es igual a 8 bits.
do = 1
cs = 1
for bucle = 0 to 9 'un bucle de 10 veces.
spisend dato
next bucle
cs = 0

Bueno como veran lo que hago es enviar 8 bits, por cada vez que pasa el bucle, por cada bit, es un clock, por lo cual si multiplico 8 bist que envio por 10 veces que se repite en el bucle tengo los 80 clocks necesarios para inicializar le memoria.

Luego de esto hay que enviar dos comandos esenciales para la iniciacion CMD0 y CMD1.

Secuencia de CMD0 =

SEND : 40h, 00h, 00h, 00h, 00h, 95h.  (95 es el CRC)

Esperar un 0x01 como respuesta.

Secuencia CMD1 =

SEND : 41h, 00h, 00h, 00h, 00h, 00h. (aqui ya el CRC no importa, ya que se desactiva por defecto con el comando CMD0 y la memoria lo ignora)

Esperar un 0x00 como respuesta.

Supuestamente hasta aqui la memoria ya inicializo correctamente en modo SPI.

Yo obtengo 0x01 como respuesta, pero no logro para el CMD1.

Esto se debe a que tengo problemas para la configuracion interna del modulo MSSP del pic.
PICMANIACO!

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #10 en: 18 de Agosto de 2008, 17:20:53 »
hola amigos

aqui pongo algunos enlaces de mmc y pic.

http://www.todopic.com.ar/foros/index.php?topic=23071.new#new


« Última modificación: 15 de Septiembre de 2008, 13:26:59 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #11 en: 19 de Agosto de 2008, 22:35:48 »
hola a todos

amigo Facundo_10 tengo una duda creo que hay una "errata",
en tu post en la sección de definición de pines, creo recordar si no equivoco que trabajabas con el PIC16F873A

El pin CS se encuentra en el puerto "A" pin 5, mire yo en el data del PIC16F873A.
mire el manual de referencia del PSI y alli tambien pone por defecto el puerto "C" pin 0, para el protocolo SPI.
http://www.oshonsoft.com/picbasiccompiler.html#36

para el pic 16F77A el pin CS esta en el puerto "E" pin 2.

las 4 lineas que configuras son :

SDI: SPI Data in
SDO : SPI Data out
SCK : Synchronous serial clock input/output for SPI mode.
SC: SPI slave select input.

algunos llaman al SC (chip selec) --> SS[con una raya  por encima] (sclave selec)No se si es lo mismo.

podrias decirme el chip con el que trabajas?
y sacarme de dudas sobre esa errata?

un saludo amigo.

« Última modificación: 19 de Agosto de 2008, 22:40:18 por pajaro »

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #12 en: 20 de Agosto de 2008, 16:58:24 »
Como bien dices, el CS o tambien donminado SS, es el CHIP SELECT o tambien conocido como SLAVE SELECT.

Realmente los pines por hardware de los pics, son SCK , SDI y SDO.. (piner por hard spi)

El pin CS puede elegir el puerto que quieras, no es necesario algun puerto en especial. Ya que en algunos perifericos ni siquiera es necesario. Yo le llamo CS, pero tu puedes llamarle SS es lo mismo.

Espero te haya quedado claro.

Un saludo y cualquier duda aqui estoy :D
PICMANIACO!

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #13 en: 30 de Agosto de 2008, 23:17:40 »
Bueno por fin, me ausente de momento :D  :mrgreen: :mrgreen: :mrgreen:.. Pero estoy aqui de vuelta, lamento haber dejado el hilo por algunos dias, pero los examenes en la escuela me estaban matando el tiempo. Ahora tengo de sobra   : :-) ...

Bueno primero decir que ya tengo la plaquita con conector DB9 funcionando en mi laptop.

Luego contarles que de momento estoy realizando un soft en VB6. El cual hara mas facil el camino a todos.. La intencion principal sera mostrar datos especificos de la MMC, (CID, CSD, Boot Sector, MRB) etc..

Quiza el soft pueda ayudar a muchos..

Aqui les pongo una captura de como va quedando el software.. Pronto le empezare a dar duro a la MMC, ya que con asm y mkbasic pude leer y escribir en ella, pero el PSI no se deja ("POR AHORA")   :D :D.

" border="0

Es una version podria decir PRE BETA  :lol:.

Espero terminarla.

Pero antes que nada dar las gracias a los usuarios:

Manolo
Gio
Edison
Carlos

Por la gran ayuda que me han brindado esos 4 gran hombres para hacer el programa, creo que les debo mucho por eso agradecerles !!

MUCHAS GRACIAS AMIGOS!!!   :-/ :-/

PD: Pajaro las paginas estan muy buenas muchas gracias por el aporte :D
PICMANIACO!

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Lectura Memoria MMC con Pic Simulator Ide
« Respuesta #14 en: 31 de Agosto de 2008, 11:14:12 »
gracias facundo_10 porque además de lo interesante del tema el desarrollo que estás haciendo del mismo es impecable. sin duda le dedicaré tiempo cuando termine otras cosas que tengo pendientes.

un saludo


 

anything