Autor Tema: PIC 16f648a acoplado a memorias SD... Se puede?  (Leído 3959 veces)

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

Desconectado jmrchile

  • PIC10
  • *
  • Mensajes: 6
PIC 16f648a acoplado a memorias SD... Se puede?
« en: 05 de Julio de 2009, 14:25:30 »
Hola Amigos del Foro, Desde hace tiempo que he participado de este foro obteniendo información de el, la cual me a servido mucho y mas de alguna falla he logrado sacar gracias a Uds. Sin embargo, Estoy metido en una problemática que no he podido encontrar info en ningun lado y espero contar con vuestra ayuda.

El tema fundamental radica en generar el protocolo de comunicación para leer y escribir memorias SD ( yo tengo de 32 Mb ). He visto unos hilos de conversación donde se habla y trata el tema utilizando el pic 16f 876 y 16f877, pero en mi pais ( Chile ) esos pics son muy caros. Todo lo visto considera el uso de funciones de comunicación que ya vienen dentro de esos pics, por lo que se simplifica mucho el tema. Pero como buen Hombre descontextualizado de este mundo que soy, tengo la mala costumbre de intentar hacer las cosas por mis propios medios, osea, generar dichos protocolos. ¿ Porque? …. Simplemente porque quiero trabajar con Pics 16f648A que son mucho mas economicos y me sirven perfectamente para el proyecto que deseo implementar.

Entrando en materia, presentare el contexto en el cual me encuentro:
Utilizo el Pic 16f648A con oscilador interno de 4 Mhz.
Adaptación de voltajes:  He puesto divisores de tension con resistencias para llevar el nivel alto del pic ( 1 logico = 5 Volts ) a 3.3 Volts para no tener problemas de enlace con la memoria que trabaja con 3.3 Volts. Para realizar esto , a la salida del puerto del pic le conecto una resistencia de 1.8K y a esta en serie una de 3.3K a tierra. En el punto medio de ambas resistencias tengo el voltaje deseado ( 3.3 Volts ) para el 1 logico, desde donde conecto la memoria SD. Por lo demas , es el esquema tipico mostrado en los foros. Obviamente polarizo la memoria con 3.3 Volts.

                                 PIC
         |
        |
        <
        >    1.8 K
        <
        >
        |
        |
        -------------- > A pin SD  ( 3.3 Volts )   
        |
        |
        <
        >    3.3 K
        <
        >
        |
        |
      ----
      GND   

Nota : Tambien intente polarizando el pic a 3.3 Volts y sacando las resistencias para conectar directamente la memoria SD, pero tampoco me funciona 


Frecuencia de trabajo:
Según el Manual de las memorias SD que obtuve de Internet, llamado Simplified_physical_layer_sd.Pdf, en el item System Features, indica : “Default mode: Variable clock rate 0 - 25 MHz, up to 12.5 MB/sec interface speed (using 4
parallel data lines) “, de esto entiendo que la frecuencia de operación puede ser entre 0 a 25 Mhz, sin tener un valor predefinido exacto, por lo que asumo que los retardos que utilize para generar los pulsos de clock pueden ser definidos a mi parecer, en mi caso uso 10 uS.

Logica de Voltajes :   Asumo que 1 logico es 3.3 Volts, y que las lineas parten al inicio del programa en estado 1.

Logica de inicializacion : Según el manual mencionado, se indica que al energizarse la SD, parte con el protocolo de comunicación SD, que es mas complejo y que según los foros, es mejor pasar a SPI, ya que su manejo es mas simple. Sin embargo como se inicia en Modo SD, se debe ingresar el comado CMD0 para pasar a SPI. Para realizar esto indica que la estructura total de la palabra a enviar debe ser de 48 Bits, y que antes de hacerlo se deben enviar 10 Bytes sin importar el dato contenido, ya que esto servira para que la SD se sincronize con el clock del PIC. Luego , se debe bajar la linea CS ( Chip Select ) a 0 logico y ahí enviar el tren de pulsos del comando CMD0 que es 0x40 – 0x00 - 0x00 - 0x00 - 0x00 – 0x95, luego se debe mantener los pulsos del clock para que la memoria responda con 0x01 que indica que entra en estado IDLE.

He hecho esto , haciendo un programa con NIPLE ( esta aplicación permite programar con diagramas de flujo, que para quienes nos cuesta un poco mas es super util ), para efectos de prueba he bajado la frecuencia a 1Hz y puesto leds en las salidas para verificar que el pic haga lo pedido, y lo realiza sin problemas, pero la SD no responde nada.

Inicio de preguntas, que espero que amablemente sean respondidas:

1.- ¿Que es mejor, polarizar todo el circuito a 3.3 Volts o utilizar las resistencias divisoras de tension para obtener los voltajes apropiados para la SD?

2.- Según lo expuesto ¿Puedo utilizar cualquier frecuencia de Clock? ¿ Debo usar cristal? O puedo trabajar con la frecuencia interna de 4Mhz?

3.- Según el manual, la misma linea por donde envio el comando CMD0 sera utilizada por la SD para generar su respuesta R1, por lo que asumo que cuando envio el dato ese bit del puerto del pic ( RB0 en mi caso ) sera configurado como salida, y cuando llega el momento de esperar la respuesta del SD lo configuro como entrada para que pueda leer lo que envie el SD, activando las resistencias Pull Up del pic a través de RBPU=0.
¿ Es esto correcto? Lo raro de todo es que si saco la linea del SD y en el punto medio del divisor de tension forzo a tierra con un cable, el pic no lo asume como 0. algo raro hay ahí.

4.- Luego de enviar los pulsos de clock para sincronizar y al poner CS=0, ¿Debo mandar un pulso de clock?

5.- Según el manual el protocolo SD debe ser precedido por un StartBit , que es siempre 0, luego un bit que indica la direccion , que es 1 ( de host a SD ) , luego el comando y finalmente un bit de parada que es 1. Asumo que todo esto esta dentro del paquete de 48 Bits que envio ( 40-00-00-00-00-95 ) ya que coincide con la estructura planteada. ¿ Es correcto o debo agregarlos?

Bueno, estas son solo algunas preguntas que tengo, pero no seguire para no enloquecer a quienes quieran ayudar.

De antemano agradezco cualquier ayuda, porque he hecho mil pruebas y no funciona nada.

Pido disculpas por tratar de hacer las cosas complicadas y no usar el pic que contiene todo este protocolo hecho, pero mas que por el factor economico, tengo la creencia de que para los paises tercermundistas se hace necesario luchar por razonar las cosas nosotros mismos y que no nos den la papilla en la boca, porque en una de esas nos podemos tragar algo podrido. Espero se entienda la analogía y que nadie se ofenda.

Gracias a Todos!!
Jose Martinez
Santiago - CHILE

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: PIC 16f648a acoplado a memorias SD... Se puede?
« Respuesta #1 en: 05 de Julio de 2009, 23:04:49 »
Hola amigo, bienvenido al foro!
Una pagina que me ayudo bastante con el tema del protocolo de la SD es la siguiente: http://elm-chan.org/docs/mmc/mmc_e.html

Igualmente, creo que te equivocas en el punto 3. La memoria tiene un MISO (master input serial output) que seria por donde envia los datos la SD, y un MOSI (master output serial input) que es por donde recibe los comando la SD. Yo aun no conecte con ninguna tarjeta, ya que sigo en la teoria, aprendiendo y leyendo codigo suficiente para luego tenerlo bien claro. RedPic lo ha conseguido y si te guias por sus ejemplos no tendras problemas. Por cierto, el 16F648A deberia ser suficiente para tus propositos, a menos que quieras dotar a tu tarjeta de sistema FAT, por lo que podrias estar un poco justo de ROM...
Salu2!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: PIC 16f648a acoplado a memorias SD... Se puede?
« Respuesta #2 en: 06 de Julio de 2009, 16:48:33 »
en el punto 2 hay algo que acotar:
para la inicializacion de la SD se debe usar un clock del SPI en el rango de 100KHZ a 400KHZ. luego del CMD1 ya puedes setear la velocidad del SPI hasta un maximo de 20MHZ.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: PIC 16f648a acoplado a memorias SD... Se puede?
« Respuesta #3 en: 06 de Julio de 2009, 17:15:00 »
hola amigo jmrchile,... te paso éste hilo que fue mi primer mje y tema compartido en éste foro, espero que te sirva, allí encontrarás muchisima informacion aportadas por muchos integrantes de acá...
Saludos y bienvenido al foro  8)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado jmrchile

  • PIC10
  • *
  • Mensajes: 6
Re: PIC 16f648a acoplado a memorias SD... Se puede?
« Respuesta #4 en: 07 de Julio de 2009, 11:33:06 »
Hola A Todos Denuevo:

Gracias por su ayuda. He logrado avanzar un poco y les comento los errores que encontre para que a otra persona les sirva:

1.- Efectivamente la frecuencia del clock debe ser entre 100k a 400 khz para iniciar el modo spi.
2.- La escritura usa un pin y la lectura otro, segun el pinout del SD.
3.- Al inicialicar la salida dataout DEBE SER 1 ( ese era un error ) cuando se mandan los 74 pulsos de clock para sincronixar antes del CMD0.
4.- al terminar el CMD0 SE DEBE mantener Dataout en 1 y Cs en 0.

ahora obtengo respuesta del SD, pero solo me manda ceros, y no la respuesta IDLE 0x01.
Verifique el voltaje de la fuente que alimenta al SD que lo hice con un divisor de tension y no funciona. pues al entrar en comunicacion cae el voltaje por debajo de lo permitido. Hoy comprare un Zener de 3.3 Volts y un lm317 para generar una fuente mas estable. Creo que con eso lograre el anciado 0x01 que espero despues del CMD0.

Sino, alguien podria ayudarme y contarme porque podria estar enviando solo ceros como respuesta el SD al mandar CMd0 ?



Gracias.....
Jose


 

anything