Temas generales de la Memoria SD

El usar como memoria de datos de un PIC, una tarjeta SD, es un trabajo complicado, hasta develar sus misterios. Hay poca información y la que hay está confusa y con equivocaciones. Me ha llevado mas de diez días de trabajo poder hacer que el sistema funcione. Es mi anhelo, que con esta información les lleve muchos menos días.

Lo primero de todo es que tengan en su PC un programa que lea y edite las tarjetas SD. Encontré el Explorer y el WinHex. El primero me dejó de leer el puerto USB con el adaptador de tarjeta y el segundo me resultó el mejor. Bajarlo de http://alvareitor.programasfull.com. El archivo es WinHex_15.0_SR2_Espanol_bY_Alvareitor.rar. Una vez bajado e instalado según las instrucciones, verán esta pantalla:

alt

Muestra la memoria SD que uso para las experiencias. Marqué con rojo las cosas importantes.

Está conectada en un USB, drive “O”, Formateada en FAT16, muestro el sector 3, que comienza en la dirección 600 hexadecimal, tiene 1.8 GB de capacidad útil y casi 2 GB de capacidad total. 512 Bytes por sector.

Lo más importante que quiero mostrar es donde dice “Sector físico = 140 y “Sector lógico= 3“. Los “@” los grabé yo y comienzan en la dirección lógica 0x600. En todos los ejemplos que vi en Internet usan esta dirección para grabar. Tardé muchos días experimentando sin poder grabar, hasta que encontré en un artículo en inglés, que la dirección que se debe usar es la física. Y entonces grabé y leí bien. La dirección lógica cero corresponde a la física 137 (Decimales), de manera que en lugar de marcar como inicio de grabación o lectura la dirección 0x600 = sector 3 x 0x200, se deberá calcular (3 + 137) x 512 = 71680 , o sea 0x11800.

En una segunda memoria SD de la misma capacidad, el sector lógico cero es 135 físico, de manera que para cada tarjeta se debe mirar el número y hacer los cálculos, o en mi caso uso 137 para las dos.

Cuando seguí haciendo experiencias con las grabaciones, en un caso por mala programación me grabó el sector cero, y perdí la FAT, con el resultado de “Tarjeta imposible de leer” en la PC.

Para formatear la SD, usar el programa oficial de tarjetas SD. Está en Download SD Formatter donde encontrarán instrucciones de uso.

Instrucciones para formatear. Se bajan de esta dirección.

Cuando la quise formatear, el SD formatter no me la aceptaba, porque en el sector averiado, supongo que están los códigos que protegen las SD contra copias piratas, si se las protege.

Entonces la formateé con el Windows XP, haciendo botón derecho en luego seleccionar luego . Aparecerá la tarjeta SD si está conectada a la PC. Allí se formatea lento y destruirá las protecciones, de manera que desaparece la diferencia entre sectores lógicos y sectores físicos. Solo queda el sector físico, y no vale lo que mostré arriba. La dirección donde comienza la escritura y la lectura se calcula como Sector * 512. Para el sector 3 es 3 * 512 = 1536 en decimal o 0x600.

Encontrarán que en firmware simple, la dirección es 0x11800 y en el firmware función la dirección es 1536 decimal. En este último caso, no hay diferencia entre físico y lógico, y la función “comando” recalcula la dirección a hexadecimal.

Para convertir unidades uso este convertidor. También de la página pueden bajar el archivo fuente. ( www.arossini.com.ar ).

alt

Esta es otra cosa a tener en cuenta. A no olvidarse. Es como en los disquetes.

Plaqueta para conectar la Memoria SD al PIC

Este fue otro dolor de cabeza, porque copié diseños de Internet, que no me sirvieron, porque al mirar las ondas de clock y datos con un osciloscopio, deformaban la onda, convirtiéndola de cuadrada a triangular, y nada funcionaba.

alt

Comencé a diseñar mi propia interfase, con ayuda del osciloscopio y este esquema del manual de la memoria San Disk, que se baja de aquí.

Ningún diseño usaba resistencias Pull Up, como indica el manual

alt

 

alt

Las resistencias Pull Up son las de 10K.

Los Zener de 3.3 Volt, bajan la tensión de 5 Volt del PIC a 3 Volt aproximadamente.

El consumo de la Tarjeta está en el orden de 65 mA.

Este esquema está en el esquema general del PIC. Yo lo armo en una plaqueta separada para poder usarlo con otros PICs, al igual que la plaqueta que uso para la comunicación con el puerto serie.

Comandos usados en SPI para SD

Este trabajo, hecho lo más simple posible, es para INICIALIZAR la tarjeta, ESCRIBIRLA y LEERLA, escribiendo y leyendo bloques de memoria. Se escriben las posiciones de memoria.

El trabajo siguiente a publicar será el de escribir y leer archivos de texto. Por ahora son palabras mayores para mí.

La estructura de los comandos que se usan es de 6 Bytes y es la siguiente:

alt

Los comandos usados en este trabajo son:

CMD0            0x40 00 00 00 00 95       Coloca la tarjeta en inactividad

CMD1            0x41 00 00 00 00 FF        Activa la tarjeta

CMD17          0x51 XX XX XX XX FF      Permite leer un sector de la tarjeta

CMD24          0x58 XX XX XX XX FF      Indica el sector de inicio de la escritura

XX son datos en hexadecimal. Mas abajo explico como se calculan y escriben.

Cuando enviamos un comando, debemos leer la respuesta. Es de 1 Byte

Para calcular el número del comando para el CMD17 por ejemplo:

CMD = 17; pasado a binario en el programa convertidor es 0b10001; se le agrega 01 de los bit 7 y 6 y 0 para el bit 5 mas los 5 bit de 10001, quedando 0b01010001. Se lo pasa a hexadecimal quedando 0x51, que es el valor mostrado arriba para comando 17.

Esta es la estructura de la respuesta que se recibe:

alt

COMANDO                           RESPUESTA                                              INDICA

CMD0                                   0x01                                                     En espera

CMD1                                   0x00                                                     Activo (Lista)

CMD17                                  0xFE + (bytes leídos de 1 a 512)             Leer un sector de la tarjeta

CMD24                                  0x00                                                     Seguir con la escritura

0xFE + (bloque a escribir)       0xE5                                                     Recepción correcta

A 0xFE se lo denomina Token.

Luego seguiremos con más detalles, en el Firmware.

Esquema

alt

Firmware

Hay en este trabajo, presentados dos Firmware:

Los dos hacen lo mismo, escriben un sector de 512 Bytes con un carácter, y luego leen solo una cantidad de direcciones limitada en ese sector grabado.

El a) está hecho de la manera más simple posible, sin funciones que puedan hacer perder el fundamento de la comunicación SPI. Es un Firmware didáctico. Cuando Ustedes hagan el suyo, podrán tratar de ahorrar toda la memoria que quieran, seguramente.

El b), usan una función llamada comando, que envía los comandos, y además funciónes Inicializar, Escribir y Leer.

Tiene comunicación serie, para que manden a la PC todo lo que deseen, cuando hagan mejoras y necesiten corregir o detectar errores. Encontrarán que la mayoría de los comandos puerto serie están comentados, pues se usan solo en caso de problemas y me resultaron indispensables en su momento. Ustedes des-comentarán lo que necesiten.

Usé el PIC 16F877, porqué encontré ejemplos con el en Internet. Seguiré con el 18F4550, pero presenta algún problema pues coincide la comunicación serie con el SPI, y ello me trajo conflictos que deberé solucionar.

Usamos cristal de 20Mhz para que al seleccionar el divisor de frecuencia de clock de SPI a 64 obtengamos una frecuencia del mismo de aproximadamente 312Khz. (frecuencia para inicializar la memoria). La cuenta es 20000000 / 64 = 312500 Hz. La máxima frecuencia permitida para inicializar es 400 MHz. Luego puede llegar a 25 MHz.

Comunicación SPI

Inicialización

alt

Escritura

 

alt

Lectura

alt

alt

Pantalla del osciloscopio

alt

Estas ondas están generadas con la rutina “Prueba 05”, del Firmware. En amarillo es clock, en azul es el 0x01.

//*************** Prueba 05 Mandamos clocks continuamente

CS = 1;               // Deshabilitamos la Tarjeta SD

puts("Mando Pulsos reloj con CS=1 y spi_write(0x01)");

puts("para ver CLOCK y SDI");

while(True) {spi_write(0x01);}

Fotografía

alt

 

Otra lista con comandos

Comando:

Argumentos:

Respuesta:

Descripción:

CMD0

No

R1

Resetea la tarjeta

CMD1

No

R1

Inicializa la tarjeta

CMD9

No

R1

Pide a la tarjeta su información CSD

CMD10

No

R1

Pide a la tarjeta su identificación CID

CMD13

No

R2

Consulta el estado de la tarjeta

CMD16

[31..0] Longitud del bloque.

R1

Establece la longitud (en bytes) del bloque para los datos en las operaciones de lectura y escritura.

CMD17

[31..0] Dirección de datos.

R1

Lee un bloque del tamaño indicado por el comando 16.

CMD24

[31..0] Dirección de datos

R1 R1 R1

Escribe un bloque del tamaño indicado por el comando 16.

 

 

 

 

0
0
0
s2smodern
Volver