Professional Documents
Culture Documents
El usar como memoria de datos de un PIC, una tarjeta SD, es un trabajo complicado, hasta develar sus misterios. Hay poca informacin y la que hay est confusa y con equivocaciones. Me ha llevado mas de diez das de trabajo poder hacer que el sistema funcione. Es mi anhelo, que con esta informacin les lleve muchos menos das. 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 segn las instrucciones, vern esta pantalla:
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 direccin 600 hexadecimal, tiene 1.8 GB de capacidad til y casi 2 GB de capacidad total. 512 Bytes por sector.
Lo ms importante que quiero mostrar es donde dice Sector fsico = 140 y Sector lgico= 3. Los @ los grab yo y comienzan en la direccin lgica 0x600. En todos los ejemplos que vi en Internet usan esta direccin para grabar. Tard muchos das experimentando sin poder grabar, hasta que encontr en un artculo en ingls, que la direccin que se debe usar es la fsica. Y entonces grab y le bien. La direccin lgica cero corresponde a la fsica 137 (Decimales), de manera que en lugar de marcar como inicio de grabacin o lectura la direccin 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 lgico cero es 135 fsico, de manera que para cada tarjeta se debe mirar el nmero y hacer los clculos, o en mi caso uso 137 para las dos. Cuando segu haciendo experiencias con las grabaciones, en un caso por mala programacin 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 encontrarn instrucciones de uso. Instrucciones para formatear. Se bajan de esta direccin. Cuando la quise formatear, el SD formatter no me la aceptaba, porque en el sector averiado, supongo que estn los cdigos que protegen las SD contra copias piratas, si se las protege. Entonces la formate con el Windows XP, haciendo botn derecho en <MI PC> luego seleccionar <administrar> luego <Administracin de discos>. 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 lgicos y sectores fsicos. Solo queda el sector fsico, y no vale lo que mostr arriba. La direccin donde comienza la escritura y la lectura se calcula como Sector * 512. Para el sector 3 es 3 * 512 = 1536 en decimal o 0x600. Encontrarn que en firmware simple, la direccin es 0x11800 y en el firmware funcin la direccin es 1536 decimal. En este ltimo caso, no hay diferencia entre fsico y lgico, y la funcin comando recalcula la direccin a hexadecimal. Para convertir unidades uso este convertidor. Tambin de la pgina pueden bajar el archivo fuente. ( www.arossini.com.ar ).
Comenc a disear mi propia interfase, con ayuda del osciloscopio y este esquema del manual de la memoria San Disk, que se baja de aqu. Ningn diseo usaba resistencias Pull Up, como indica el manual
Las resistencias Pull Up son las de 10K. Los Zener de 3.3 Volt, bajan la tensin 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 comunicacin con el puerto serie.
Los comandos usados en este trabajo son: CMD0 CMD1 CMD17 CMD24 0x40 00 00 00 00 95 0x41 00 00 00 00 FF 0x51 XX XX XX XX FF 0x58 XX XX XX XX FF Coloca la tarjeta en inactividad Activa la tarjeta Permite leer un sector de la tarjeta 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 nmero 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:
CMD24
0x00
0xFE + (bloque a escribir) 0xE5 A 0xFE se lo denomina Token. Luego seguiremos con ms detalles, en el Firmware.
Esquema
Firmware
Hay en este trabajo, Firmware con funciones. Es igual al del 16F877, donde se cambian solo los valores correspondientes al PIC 18F4550. Lo mismo pueden hacerlo con cualquier otro PIC que tenga SPI. Tiene comunicacin serie, para que manden a la PC todo lo que deseen, cuando hagan mejoras y necesiten corregir o detectar errores.
Comunicacin SPI
Inicializacin Escritura
Lectura
while(spi_read() !=0xFE){CMD17();} // Manda el comando 17, que lee un bloque del tamao indicado por el comando 16, en la direccin 0x11800(0x600) for(i=0;i<100;i++){spi_write(0xFF);Respuesta=spi_read();printf("Leo: %c\n\r",Respuesta);}// Leer parte del bloque puts("Termine de Leer"); CS = 1; // Deshabilitamos la SD } // Fin de Leer
CS = 0;
Respuesta=12;
while(Respuesta !=0x00) // Manda el comando 17, que lee un bloque del tamao estndar de 512 Bytes, en la direccin 0x600 La direccin 0x600 = sector 3 * 512 Byte= sector 3 * 0x200 Byte. Corresponde a sector lgico, que es lo que se ve en el programa WinHex, mostrado arriba. Pero nosotros necesitamos entrar la direccin correspondiente al sector fsico; debemos sumar entonces 137 al nmero de sector. La direccin 0x600 (Lgico)= sector (3 +137)* 512 Byte = 71680. En hexadecimal = 0x11800. Lo agrupamos como 00 01 18 00 y as lo escribimos en el comando, como se ve abajo. El FOR es para leer la respuesta de la SD. Primero se manda un clock para dar tiempo a que llegue la respuesta y luego se la espera hasta que llegue. Si todo est bien se pasa a la rutina siguiente. void CMD17() { spi_write(0x51); spi_write(0x00); spi_write(0x01); spi_write(0x18); spi_write(0x00); spi_write(0xFF); // Comando // Comando // Comando // Comando // Comando // Comando
Estas ondas estn generadas con la rutina Prueba 05, del Firmware simple. 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);}
Fotografa
CMD17 CMD24
[31..0] Direccin de R1 R1 R1 Escribe un bloque del tamao datos indicado por el comando 16.