Continuemos en esta entrada con las tarjetas de memoria SD. Empezaremos buscando toda la información posible sobre las especificaciones para saber por donde empezar.
En esta página http://mac6.ma.psu.edu/space2008/ bajo el apartado SD memory card, se puede ver un montón de documentación sobre las tarjetas de memoria. En cualquier caso es fácil de encontrar más datos por la red. Aquí encontraremos tanto las características físicas de la tarjeta, para poder realizar las conexiones con el pic, como la gestión de la comunicación y los comandos.
Para consultar el pinout y la configuración del módulo SPI, podemos bajar el datasheet del DSPIC que vamos a usar de la página de microchip: http://ww1.microchip.com/downloads/en/devicedoc/70135c.pdf
El 30F4012 puede trabajar a 3.3V y tiene SPI por harware. En lugar de un cristal externo, utilizaremos el reloj interno de 7,37 Mhz configurando el PLLx8 para obtener una frecuencia de reloj final de 58.96MHz Conectamos los pines del SPI a los correspondientes de la tarjeta, y el PIN_D0 con el CS de la tarjeta, como se ve en el siguiente esquema.
Conectaremos el módulo HC-06 a los pines U1ARX y U1ATX, para poder usar el ordenador o el teléfono como terminal y alimentamos el conjunto con una fuente de 3.3V
Los puntos más importantes para desarrollar el programa:
- Configurar correctamente el módulo SPI. La velocidad del reloj durante la inicialización debe ser de 100Khz o menos para garantizar la compatibilidad, luego se puede aumentar hasta 25MHz en función de la tarjeta. De todas formas la velocidad puede ser tan baja como queramos. El divisor del reloj (SPI_CLK_DIV_XX) actua sobre la frecuencia de 58.96 MHz/4 = 14.74 MHz.
SETUP_SPI(SPI_MASTER|SPI_CLK_DIV_8|SPI_H_TO_L|SPI_XMIT_L_TO_H );
- Reseteamos la tarjeta y la ponemos en modo SPI, para ello pasamos la señal de CS a 0 y enviamos el comando 0. Antes de empezar la especificación dice que hay que dar al menos 74 pulsos al reloj (lo haremos enviando el código 0xFF(8bits) 10 veces, con lo que damos 80 pulsos) . Repetimos el comando 0 hasta que la tarjeta pasa a estado IDLE.
- La tarjeta se mantiene bloqueada hasta que mandamos el comando CMD1 o el ACMD41 que inicia un proceso de reset. Repetimos hasta desbloquear la tarjeta.
- En este punto podemos comprobar si la tarjeta soporta la tensión utilizada con el CMD58. Lo normal es que soporte cualquier tensión entre 2.7V y 3.6V
- Por último definimos la longitud del bloque que se va a leer y escribir con el CMD16. Como tenemos memoria suficiente usaremos 512 bytes que es el bloque por defecto, pero si queremos podemos configurar este valor incluso a 1 byte.
- La lectura y la escritura corresponden a los comandos CMD17 y CMD24 con un entero de 32bits como parametro indicando la posición en bytes dentro de la memoria. Después de recibir la respuesta al comando, o bien leemos o escribimos un byte (token) y luego los datos deseados terminamos con el CRC de los datos que puede ser ignorado porque está desactivado por defecto.
El programa final borra un sector y luego lo reescribe con una cadena de texto. Para comprobar que escribimos bien, usamos el comando de lectura y enviamos el sector leído al terminal por el puerto serie.
Fichero sólo visible para usuarios registrados
Una nota importante antes de programar el PIC, si utilizamos el conector ICSP hay que retirar antes la tarjeta SD del conector, porque el módulo SPI y los pines PGC y PGD de programación comparten los mismos pines. Cuidado también si utilizamos una tarjeta SD con datos importantes, porque el programa no comprueba nada y escribe en un sector aleatorio, con lo cual seguramente perdamos los datos que tengamos o incluso volvamos la tarjeta ilegible. Todo se soluciona formateando.
Está claro que la tarjeta escrita de esta forma no se puede leer directamente en un PC, salvo que usemos un editor hexadecimal para ello. En el siguiente capítulo veremos como implementar el sistema de archivos FAT16, para poder escribir o leer un fichero cualquiera.
2 pings
[…] Utilizar una SD como unidad de almacenamiento para PIC. Programación básica » […]
[…] del punto donde dejamos la entrada anterior. Ya sabemos acceder a un sector de la tarjeta para leer y para escribir. Ahora vamos a introducir […]